高性能多租户
- 1、构建Multi-Tenant应用
- 1.1、做项目
- 1.2、做产品
- 1.3、多租户
- 1.4、 SaaS多租户设计(共享数据库,共享数据架构)
- 2、高性能的Multi-Tenant最佳实践
- 2.1、数据库层性能优化
- 2.1.1、建立合适的索引
- 2.1.2、消除大数据表链接
- 2.1.3、避免复杂SQL
- 2.2、应用层性能优化
- 2.2.1、Cashe
- 2.2.2、 统计和报表计算
- 2.2.3、基于Tenent的索引搜索
- 2.2.4、异步操作
- 2.3、Web层性能优化
- 2.4、性能监控
《互联网时代的软件革命-SaaS架构》学习笔记二
1、构建Multi-Tenant应用
1.1、做项目
“4+1”视图时架构设计的结构标准,场景视图/逻辑视图/开发视图/过程视图/物理视图
- 场景视图也叫用例视图,用于描述用户的业务场景,职位-职责-流程;
- 逻辑视图,对象模型,功能(业务功能、系统功能)之前的逻辑分层、模块划分、模块之间的依赖关系;
- 开发视图,程序包、应用的统一框架、引用的类库、SDK和中间件,工程和包的划分规则,规范、约束开发环境的结构;
- 过程视图,并发和同步设计。
- 物理视图,也叫部署视图,描述软件如何映射到硬件,反映系统在分布/部署上的设计,解决如何安装部署到服务器,以及网络分布问题。
1.2、做产品
- 设备共享,为了隔离客户资料,在客户service组件中添加一个方法;
- 可配置化,MDA模块驱动架构,MDA利用元数据建模,可以方便灵活的实现可配置化。
1.3、多租户
独立数据库 | 共享数据库,隔离数据框架 | 共享数据库,共享数据结构(通过Tenant ID区分) | |
---|---|---|---|
优点 | 简化数据模型的扩展设计,满足不同租户的独特需求;出现故障,恢复数据比较简单 | 逻辑数据隔离,但是不完全隔离;每个数据库可以支持更多的租户数量 | 维护成本和购置成本低,每个数据库支持 |
缺点 | 增大了数据的安装数量,带来维护成本和购置成本 | 出现故障,数据恢复比较困难,因为牵扯其他租户数据;如果需要跨租户统计数据,存在一定困难 | 隔离级别低,安全性低,需要在设计开发时加大对安全的开发量;数据备份和恢复困难 |
隔离级别 | 高 | 中 | 低 |
共享级别 | 低 | 中 | 高 |
安全性 | 高 | 中 | 低 |
成本 | 高 | 中 | 低 |
安全性设计:系统级和程序级
系统级:
- 使用HTTPS协议以SSL交换数据,增强通信安全
- 通过数字前面防止传输过程篡改
- 对用户身份识别的User Token使用DES算法数据加密
- 业务数据定时自动备份
程序级:
- 完整的权限配置,包括功能权限和数据权限
- 客户断输入校验,防止JS攻击、XSS攻击、SQL攻击
- 辅助安全设计,比如密码控件、图片验证码、手机确认码
1.4、 SaaS多租户设计(共享数据库,共享数据架构)
重点在于租户管理和数据隔离
租户管理:包括注册等
数据隔离:变更表结构、增加TENANT_ID字段
2、高性能的Multi-Tenant最佳实践
2.1、数据库层性能优化
2.1.1、建立合适的索引
建立合适的索引对基于数据库的应用都非常重要,如果一个数据库操作不能有效利用索引,不得不面临对一个庞大数据表的扫描,从而对整个系统的数据库的综合性能造成极大影响。
调整如下:
- 在原有的索引上,新增一个TENANT_ID字段,作为联合索引的第一个字段。
- 所有的业务查询操作,都增加TENANT_ID字段进行查询。
2.1.2、消除大数据表链接
解决方案 | 使用场景 |
---|---|
冗余存储关联字段 | 业务需求上可以接受冗余导致的不一致,或者冗余数据可以很冗余被同步更新 |
Cache缓存 | 变更概率不高,但对数据一致性要求较高 |
直接删除关联字段 | 不是必须包含的被关联的字段,可以直接从列表查询中去除 |
拆分成多次查询 | 对单个数据的查询,如果设计张管链表,有时分多次查询会比一次复杂的关联查询更加合适 |
2.1.3、避免复杂SQL
Case by case 去处理
2.2、应用层性能优化
2.2.1、Cashe
Cashe所缓存的内存就是数据库中存储的内容,采用Cache避免了对数据库的频繁访问。
改造前,每次权限检查时会根据用户、权限、角色的关联表查询到用户对于某项操作是否由权限,每次权限查询都会涉及几次数据库的操作,对数据库访问的压力可想而知。
权限数据作为被频繁读取而改动很少的数据,是可以做Cache的首选数据。(cache技术MemCache和JBoss Cache)采用MemCache,可以考虑在系统启动时即载入Cache,在发现变化时候,更新Cache。由于用户具有那些角色是与用户相关的数据,则应该在用户登录的时候获取用户的角色,并放入用户session中,验权过程不需要涉及数据库查询,通过session和cache的访问即可完成。
2.2.2、 统计和报表计算
为了缓解实时计算给数据库带来压力,优化策略如下
- 对于统计结果实时性要求不高的,并且历史数据是不允许修改的情况下,通常采用后台任务定时统计的策略;
- 如果历史数据是可以修改的,相应的后台任务定时统计方案略复杂;
- 对于部分统计结果实时性要求高的功能,可以在后台定时统计基础上,加上增量数据实时统计结果。
2.2.3、基于Tenent的索引搜索
- 模糊查询是应用软件常见的需求。
- 传统,直接采用数据库本身的like查询。
- 多租户,不允许模糊查询;数据库本身的全文搜索功能;轻量级搜索引擎
2.2.4、异步操作
异步操作没有从本质上提升系统性能或数据吞吐量,但是可以使得用户体验得到极大提升,降低系统的并发负载。
- 表现层异步,采用AJAX技术实现,对于部分耗时略长,但希望能及时查看结果的功能。
- 后台业务逻辑层异步,采用JMS、MQ技术,对于耗时长,用户或系统不需要理解关注处理结果的业务逻辑。
2.3、Web层性能优化
Web开发性能优化
内容类 | 服务器类和cookie类 | Java scrip、css、图片类 | 移动应用类 |
---|---|---|---|
减少http请求/减少DNS查询/避免跳转/缓存AJAX/延迟加载/提前加载/减少DOM元素数量/用域名划分页面内容/减少frame/避免404错误/ | 使用CDN/为文件头制定Expires或cache-control/GZip压缩网页/配置实体网页/尽早刷新输出缓存/使用Get完成AJAX请求/减小cooie体积/网页内容使用cookie域名 | 使用外部JavaScript和CSS/削减JavaScript和CSS剔除重复脚本/减少DOM 访问/开发智能事件处理程序/把样式表置于顶部/避免使用CSS表达式(Expression)/使用外部JavaScript和CSS/用代替@import/避免使用滤镜/优化图像/优化 CSS Sprites不要在HTML中缩放图像/favicon.ico要小而且可缓存。 | 保持单个内容小于25KB、打包组件成复合文本 |
Http服务器性能优化,首选Apache
2.4、性能监控
统计出每个请求的服务端响应时间。网络时间和客户断加载时间,并且可以安装页面、用户所在地区、时间等多个维度进行统计分析。
侵权请联系删除
下一篇讲解配置多租户实现方式