Dynamics CRM 安全模型的性能问题
性能问题对系统的影响可以是致命性的,一旦不重视,在不久的将来随时可能爆发,导致系统卡顿甚至无法操作,即时重启也无济于事;甚至极其难以发现。这里为自己记录一下过往的经验。系统一开始的设计,很大程度上决定了系统的生命周期,未来能使用多久,而不用花钱改造,好的设计也会大大减少维护成本。
简单说下Dynamics CRM的权限,如果某个用户对某条记录具有读取权限,Dynamics CRM 会把当前用户的用户ID、部门ID、实体ID,权限层级作为一条记录记录在表SystemUserBusinessUnitEntityMap里面,因此,在创建或分派记录的时候,都会对这个表进行操作(增加或删除记录),包括更改业务部门。反过来,系统会先查询SystemUserBusinessUnitEntityMap表,以确定当前用户是否对某条记录具有读取权限。例如在视图中展示记录的时候,系统会默认先查询SystemUserBusinessUnitEntityMap表的记录以确认当前用户具有哪些记录的读取权限,如果这个表过大,则会影响查询性能。除了owner属性之外,Dynamics CRM还支持共享,也就是说在,owner不变的情况下,其他用户也能共享权限,共享之后,系统会在PrincipleObjecctAccess表记录某个用户对某实体具有什么权限;在我们查看记录的时候,系统还要运算一下,看某条记录有没有共享过给当前用户,这也是非常耗时的。
假设安全角色A对incidentt实体具有业务部门级别(2/4)的读取权限,给用户张三分配了安全角色A,并且某一条记录record1的owner是张三,那么张三所在部门的同样具有安全角色A的其他用户也具有读取record1的权限,因此,SystemUserBusinessUnitEntityMap表里面会保存除张三之外的其他用户的记录;当我们对张三的业务部门进行更换时,之前与张三同一个部门的其他用户则应该不能在查看该记录record1,那么系统会重新计算权限,计算哪些用户将会从SystemUserBusinessUnitEntityMap表中移除,而这个计算过程是非常缓慢的。
可以看出,影响SystemUserBusinessUnitEntityMap数据量的因素有:系统实体数量、用户数量、以及业务部门的层级设定(层级越少越好),还有就是安全角色中对某权限配置的权限层级。
1.系统实体数量。不难理解,实体越多,SystemUserBusinessUnitEntityMap表的记录则越多(经过调查发现,当实体的权限层级是0在SystemUserBusinessUnitEntityMap表中的记录数量与1/4时是一样的)。
2.用户数量。用户数量与系统实体数量一样。
3.业务部门的层级设定。层级越多,则减缓计算过程,影响记录分派的性能。
4.安全角色中对某权限配置的权限层级。一般来说权限层级越高,则在SystemUserBusinessUnitEntityMap表的记录越多,特别是3/4的深度级别;但组织级的权限不一样,也就是4/4的权限,该权限不会在SystemUserBusinessUnitEntityMap表存记录。
在我们知道了这些特点之后,我们就知道该如何更好的做设计,已达到性能最优,从下面几点考虑:
1. 用户数量、实体数量、业务部门这些会随着业务的增长可能会增多,但是业务部门的层级我们可以尽量扁平化;
2. 权限层级尽量不要设置为3/4,因为3/4的权限层级会在SystemUserBusinessUnitEntityMap表增加大量记录;
3. 记录的owner尽量不要设置为团队,可想而知,过多记录设置为团队的时候,将在SystemUserBusinessUnitEntityMap表存在大量记录,严重影响系统性能。
4. 尽量避免记录的共享操作,系统虽然有这样的功能,我们也可以尽量不用或少用,如有特殊情况不得不用的时候才用。当然为了减少共享带来的性能问题,我们也可以设定一定的规则来减少共享表PrincipleObjecctAccess,比如说,在关闭SR之后,和业务人员确认是否没有必要共享了,这时是可以撤销共享权限的,或者说三个月之后就没有必要在共享了,要查看也只能特殊账号查询,或数据归档后的历史数据查询。
5.对于停用的用户,考虑清理其安全角色。
6.对于停用的业务部门,考虑是否可以删除。
在实施过程中,确实遇到不少影响系统性能的设计:
- 使用团队作为owner。
- 业务部门层级过多。
- 存在大量共享却没有撤销共享的机制。
- 快速查找视图过多查找字段。
- 工作台聚合视图过多,计算量大。
- 滥用活动实体,所有的活动实体的记录会同时在ActivityPointerointer实体中存在一条记录。操作活动实体是非常糟糕的。
- 查找字段所使用的视图使用了默认视图,该视图的数据范围过大。
- 存在大量的工作流,且后台任务程序有触发工作流的代码而且非常频繁,工作流应尽量使用后台任务处理程序代替。
- 代码所用的查询语句没有索引。
- 数据不做归档处理。
- 没有做负载均衡
- 没有CDN,没有缓存机制
- etc.
以上所述Dynamics CRM的安全模型性能问题并不是说产品本身的缺陷,任何一个系统都会存在性能问题,就看我们怎么利用产品的特性来做出做好的效果,避免一些导致系统性能差的设计出现而缩短系统生命周期或增加运维成本。
如有不准确,欢迎指正分享,谢谢!
Dynamics CRM 安全模型的性能问题的更多相关文章
- Microsoft Dynamics CRM 2015 服务器系统的性能维护,追踪, 也可以用到任务管理器哟...
Microsoft Dynamics CRM 2015 的追踪是一个很有用的function,它能为我们的CRM调试,评估 提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状态 ...
- Microsoft Dynamics CRM 2015 and Microsoft Dynamics CRM 2016 Performance and Scalability Documentation
摘要: 本人微信公众号:微软动态CRM专家罗勇 ,回复285或者20181126可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me ...
- Microsoft Dynamics CRM 4.0导入组织(Import Organization)时间过长的原因总结
952934 How to move the Microsoft Dynamics CRM 4.0 deployment http://support.microsoft.com/default ...
- 定制Dynamics CRM标准导出功能:不能导出指定列的值
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复239或者20161203可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Dynamics CRM Performance Issue when CRM Forms Opening
事情发生在Dynamics CRM 8.2.2版本,客户新升级到这个版本几个月的时间. 突然有一天,客户反映为什么我们打开CRM Form页面的时候loading的时间这么长呢?大概会需要5-15分钟 ...
- Dynamics CRM 2015-超大Solution导入问题
我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...
- Dynamics CRM导出数据到Excel
原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...
- Step by step Dynamics CRM 2011升级到Dynamics CRM 2013
原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
- Step by step Dynamics CRM 2013安装
原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处 SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...
随机推荐
- vue 使用import之后就会报Object(...) is not a function的错
最近在学习vue,学到了路由,vue-router, 写demo的时候,想引入import VueRotuer from "vue-router",但是添加这句引用浏览器就会报错, ...
- ACE下载地址
https://download.dre.vanderbilt.edu/previous_versions/ 在某n中找了大半天愣是没人贴出来
- echarts 总结
ECharts访问链接 https://blog.csdn.net/Yi2008yi/article/details/122808328 :force-use-old-canvas="tru ...
- golang 数组(array)
1. 概念 golang中的数组是具有固定长度及相同数据类型的序列集合 2. 初始化数组 var 数组名 [数组大小]数据类型 package main import "fmt" ...
- SVN检出未响应,版本库浏览打不开卡死。
今天遇到一个奇葩问题. 1.换了新电脑,首先SVN地址没问题.检出就未响应,不弹出输入用户名,密码. 2.发现装了讯软加密软件,后安装的SVN.(未告知管理员,对新机加密软件配置).配置完可以正常用了 ...
- 使用 symfony 框架时 配置运行环境时 报debug 工具栏问题及 No input file specified.
错误一: 错误二:点击跳转时:No input file specified. 解决方法:配置nginx.conf时 增加以下代码: location / { index app_dev.php; t ...
- 重启nginx 报错 nginx.pid
先检查 nginx -c /etc/nginx/nginx.conf 看看端口是否被占用 若占用杀掉 ps -ef | grep nginx kill --- 然后再用nginx -c /etc/ng ...
- winform 中 label透明化
label1.BackColor = Color.Transparent;//设置背景颜色为透明 label1.Parent = pictureBox1;//将pictureBox1设为标签的父控件, ...
- jenkins-构建触发器之定时构建和轮询 SCM
前言 最近搭建自动化框架,跑自动化用例每次都得用手工点击构建任务,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行 定时构建语法 五颗星,中间用空格隔开 * * * * * 第一颗*表 ...
- python常用的六个字符串处理方法
1.upper(将小写字母转换为大写) 语法: str.upper() 参数: NA 实例: a = 'abc' b = a.upper() print(b) 结果: ABC 2.lower(将小写字 ...