高性能多租户

  • 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、性能监控

统计出每个请求的服务端响应时间。网络时间和客户断加载时间,并且可以安装页面、用户所在地区、时间等多个维度进行统计分析。

侵权请联系删除

下一篇讲解配置多租户实现方式