性能问题对系统的影响可以是致命性的,一旦不重视,在不久的将来随时可能爆发,导致系统卡顿甚至无法操作,即时重启也无济于事;甚至极其难以发现。这里为自己记录一下过往的经验。系统一开始的设计,很大程度上决定了系统的生命周期,未来能使用多久,而不用花钱改造,好的设计也会大大减少维护成本。

  简单说下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.对于停用的业务部门,考虑是否可以删除。

在实施过程中,确实遇到不少影响系统性能的设计:

  1. 使用团队作为owner。
  2. 业务部门层级过多。
  3. 存在大量共享却没有撤销共享的机制。
  4. 快速查找视图过多查找字段。
  5. 工作台聚合视图过多,计算量大。
  6. 滥用活动实体,所有的活动实体的记录会同时在ActivityPointerointer实体中存在一条记录。操作活动实体是非常糟糕的。
  7. 查找字段所使用的视图使用了默认视图,该视图的数据范围过大。
  8. 存在大量的工作流,且后台任务程序有触发工作流的代码而且非常频繁,工作流应尽量使用后台任务处理程序代替。
  9. 代码所用的查询语句没有索引。
  10. 数据不做归档处理。
  11. 没有做负载均衡
  12. 没有CDN,没有缓存机制
  13. etc.

以上所述Dynamics CRM的安全模型性能问题并不是说产品本身的缺陷,任何一个系统都会存在性能问题,就看我们怎么利用产品的特性来做出做好的效果,避免一些导致系统性能差的设计出现而缩短系统生命周期或增加运维成本。

如有不准确,欢迎指正分享,谢谢!

Dynamics CRM 安全模型的性能问题的更多相关文章

  1. Microsoft Dynamics CRM 2015 服务器系统的性能维护,追踪, 也可以用到任务管理器哟...

    Microsoft Dynamics CRM 2015 的追踪是一个很有用的function,它能为我们的CRM调试,评估 提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状态 ...

  2. Microsoft Dynamics CRM 2015 and Microsoft Dynamics CRM 2016 Performance and Scalability Documentation

    摘要: 本人微信公众号:微软动态CRM专家罗勇 ,回复285或者20181126可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me ...

  3. Microsoft Dynamics CRM 4.0导入组织(Import Organization)时间过长的原因总结

    952934    How to move the Microsoft Dynamics CRM 4.0 deployment http://support.microsoft.com/default ...

  4. 定制Dynamics CRM标准导出功能:不能导出指定列的值

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复239或者20161203可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  5. Dynamics CRM Performance Issue when CRM Forms Opening

    事情发生在Dynamics CRM 8.2.2版本,客户新升级到这个版本几个月的时间. 突然有一天,客户反映为什么我们打开CRM Form页面的时候loading的时间这么长呢?大概会需要5-15分钟 ...

  6. Dynamics CRM 2015-超大Solution导入问题

    我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...

  7. Dynamics CRM导出数据到Excel

    原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...

  8. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  9. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  10. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

随机推荐

  1. C#判断一个字符串是否为整数

    判断一个字符串是否为数字 使用int.TryParse()方法   利用int类型自带的TryParse(string, ou int) 方法可以解决问题,此方法通过对应的输入内容string,如果是 ...

  2. java学习日记20230225-java介绍

    sun公司 oak语言--java gosling >sun 1995 java第一个版本 2009年 甲骨文公司收购sun 2011 java7 2014 java8 2022-2030年 长 ...

  3. the default discovery settings are unsuitable for production use at least one of...的解决办法

    解决办法 elasticsearch.yml加上 discovery.type: single-node

  4. 前端JavaScript深拷贝的三种方法,看了不后悔!!!

    深拷⻉ 深拷⻉开辟⼀个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改⼀个对象的属性,不会 改变另⼀个对象的属性 常⻅的深拷⻉⽅式有: _.cloneDeep() jQuery.extend( ...

  5. N63050 第十周运维作业

    十九.VPN服务 1.firewalld和最新技术nft实现防火墙功能(65分钟) 2.open-v-p-n介绍和环境准备(48分钟) 3.open-v-p-n实现CA证书(45分钟) 4.open- ...

  6. risv 深入问题总结

    1.risv 如何实现锁机制, 通过哪个寄存器实现 2.risv 如何实现堆栈切换,保存哪些寄存器, 与ARM保持寄存器的差异 3.risv 的中断异常  与 arm中断异常的异同

  7. eslint规范在项目中的实现——vue项目举例

    先附上参考链接: https://juejin.cn/post/7068573328914513928 https://juejin.cn/post/6857135010882387981 https ...

  8. iOS设备和模块解耦-方案对比

     问题: 第一点,我们的设备之间,通过设备类型进行区分,然后分别跳转到不同的界面.导致不同设备会对同一个类别进行操作. 就会造成代码耦合,后续对类别进行增删改就会导致并行开发中容易出现代码冲突或者代码 ...

  9. Java面向对象之创建对象内存分析

    创建对象内存分析 代码 内存分析 属性 属性:字段Field 成员变量 默认初始化: 1.数字: 0 0.0 2.char: u0000 3.boolean:false 4.引用数据类型:null 5 ...

  10. go环境 依赖管理 基本命令

    Go安装 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ Windows 选择Windows版本下载安 ...