1.数据库层性能优化

(1)建立合适的索引

  • 在原有的索引上,都增加一个tenant_id字段。由于tenant_id的选择性较强,一般tenant_id字段需要作为联合索引的第一个字段
  • 所有的业务查询操作,都增加tenant_id字段进行过滤
  • 索引应创建在条件(where)、排序(order by)、分组(group by)等操作所涉及的列上。
  • 索引应该有较强的选择性,即应尽可能建立在重复数据少的的数据列中。
  • 如果多个条件经常需要组合起来查询,应合理使用联合索引
  • 一次查询中只能使用一个索引,可使用相应的分析工具分析索引效果
  • 索引不是越多越好,过多的索引可能导致CUD(新增、修改、删除)的性能降低,并且占用更多的空间

(2)消除大数据表连接

并不是所有的耗时长的SQL问题都是由索引引起的。索引优化完成之后,就会发现太多的大数据量表连接操作占用了耗时SQL统计中的大部分。

SAAS系统架构之多租户设计的高性能_数据库

(3)避免复杂SQL

一般需要考虑将复杂的SQL分解成多个简单的SQL执行,将复杂的运算尽量留在应用服务器层

。因为一般情况下,应用服务器层的水平扩展更容易实现,而数据库层的扩展则是比较困难的。

2.应用层性能优化

(1)Cache

采用cache其实也是对数据库的一种优化,因为避免了对数据库的频繁访问。主要针对那些变化相对较少的业务数据。比如用户数据、权限角色数据、国家省市地区数据等做缓存

SAAS系统架构之多租户设计的高性能_mysql_02

SAAS系统架构之多租户设计的高性能_sql_03

(2)统计和报表计算

        在多租户架构下,由于并发量和数据量的增大,实时计算的统计和报表也将是造成数据库压力过大的一个主要因素。

SAAS系统架构之多租户设计的高性能_mysql_04

(3)搜索引擎

SAAS系统架构之多租户设计的高性能_数据库_05

(4)异步操作

         异步操作使得用户的操作体验得到了极大地提升,同时也能降低系统的并发负载,因此,将同步操作变成异步操作,也是提升性能的一种重要手段。

SAAS系统架构之多租户设计的高性能_sql_06

3.Web层性能优化

(1)web开发的性能优化策略

可参考https://developer.yahoo.com/performance/rules.html

内容类:

  • 减少http请求
  • 减少DNS查找
  • 避免跳转
  • 缓存ajax
  • 延迟加载
  • 提前加载
  • 减少DOM元素数量
  • 用域名划分页面内容
  • 减少frame
  • 避免404错误

服务器类与cookie类

  • 使用CDN
  • 为文件头制定Expire或Cache-Control
  • GZIP压缩网页
  • 配置实体标签
  • 尽早刷新输出缓冲
  • 使用Get完成AJAX请求
  • 减少cookie体积
  • 对月页面内容使用无cookie域名

JS、CS、图片类

  • 把脚本置于页面底部
  • 使用外部JS和CSS
  • 削减JS和CSS
  • 剔除重复脚本
  • 减少DOM访问
  • 开发智能事件处理程序
  • 把样式表置于顶部
  • 避免使用CSS表达式
  • 用link代替@import
  • 避免使用滤镜
  • 优化图像
  • 优化CSS Sprites
  • 不要在HTML中缩放图像
  • favicon.ico要小而且可缓存

移动应用类

  • 保持单个内容小于25KB
  • 打包组件成复合文本

虽然这些法则更多的侧重于互联网网站的优化,不过很多内容对于基于web的saas应用同样具有参考价值。

(2)http服务器的性能优化策略

apache、nginx服务器的优化

4.性能监控

通过工具能够实时地统计出应用在各种场景下(不同地区、不同客户、不同页面)的性能数据并及时预警

SAAS系统架构之多租户设计的高性能_mysql_07

上图是阿里软件性能中心的截图,该性能中心可以统计出每个请求的服务端响应时间、网络时间和客户端加载时间,并且可以按照页面、用户所在地区、时间等多维度进行统计分析,从而帮助监控应用性能。

参考书籍《互联网时代的革命-SAAS应用架构》