问题:
生产环境,用户快速增长,后台服务暴露各种问题:服务器资源紧张,消息队列满MQ 卡死,服务处理不过来,数据库压力太大。
重构目的:
高性能,可扩展,容灾,容易维护。
分布式架构,全异步框架,服务功能拆分,逻辑拆分,与业务无关 系统存储。
重构手段:
1、优化功能逻辑和实现策略:一期版本,为了赶进度,很多功能逻辑和解决问题策略都不是最优的,还有优化的空间。
1) 业务分类处理:例如对平台所有用户推送广告和动态,这些数据对用户不重要,但涉及到平台大量用户必定会消耗系统资源,如果跟系统正常业务逻辑放在一起处理,肯定影响系统性能,所以系统要分离子业务独立处理。
2) 数据分页:用户手机屏幕有限,数据分页显示就足够了,好友列表,关注,粉丝列表等。
3) 可见即所得:用户眼睛看到的数据才向服务取,例如用户信息,群组信息显示只需要显示头像,昵称,不必要取详细的信息。
4) 数据增量,压缩传输:例如通讯录数据,手机少则一两百人,多则上千人,数据上传服务前,必须经过压缩,而且要优化增量上传策略,上传更新变动的数据。
5) 群聊,圈子写存储策略:千人群组里发一条信息,每个接收者在数据库里存一条记录是不可想象的,同理圈子里发表说说也一样,添加监听者逻辑,每个监听者存一个监听消息列表缓存 Redis 。数据库只记录一条数据。
6) 消息推送过期策略:用户只关心最近发生的事,用户离开一段时间重新登录,只推送最近数据,没必要全部离线数据进行推送。
7) 空间换时间:企业运营多个系统, ID 不一样,建立映射关系,也可以多个 ID 写入具体的业务数据表中,避免系统间频繁访问。
2、优化客户端缓存:终端缓存图片数据,用户数据,群组数据,部分数据逻辑结果等等,减少对服务请求。高效的系统不能只依靠服务进行改良,客户端也是很重要的一环。
3、优化系统架构:分布式架构;系统分层拆分,多个层级功能分明,逻辑清晰。(参考 nginx 多进程模型)
4、优化系统性能:多进程架构,避免线程死锁问题;全异步框架,减少同步请求等待缓慢,占用系统资源;引入 jemalloc 优化内存性能。
5、优化系统存储:引入多级缓存,读写数据同步改为异步,数据分类,引入优先级策略。
1) 数据分类:根据业务分类数据,属性数据,日志数据,实时数据,非实时数据,高优先级数据,低优先级数据。根据不同数据类型,引入不同处理策略。
2) 非业务: 独立于业务,减少耦合,提高系统通用性。要引入独立的存储读写协议。
3) 多级存储:进程 Session + Redis + Mysql,引入数据热点机制,超时机制,淘汰不活跃或者僵尸用户数据,提高缓存命中率,减少对数据库读写访问。
4) 异步读写:单个实例的 Redis 压测并发能力达到 7万 ,同步情况下,并发不足 2 千,所以存储要引入异步读写框架。
5) 低延迟:数据落地缓慢,但是高性能系统对数据处理速度要求很高,上层逻辑服务,不可能等数据入库成功才进行下一步操作。所以在 Redis + Mysql 存储系统架构中,只要写 Redis 请求成功就马上返回,然后数据排队入库。
6) 数据库整合:分库,分表,分区,读写分离,主从。根据业务优化存储策略,整合字段,整合冗余表。例如圈子的说说,评论,点赞,原来分为3张表,但是这3张表相似度很高,就可以整合成一张。
6、优化代码:精减代码体积,减少代码依赖,引入轻量级稳定开源代码,统一代码风格。
7、优化系统管理工具:可视化管理系统,禁止手动直接操作数据库,保证系统数据安全性。
文档先行:
无规矩不成方圆,以文档为依据;复杂的问题简单化,简单的问题条理化;好记性不如烂笔头,杜绝口口相传陋习。
1) 业务需求说明书:产品具体功能说明,口头说明无效,必须落地文档。
2) 系统架构设计说明书:系统设计思想,总体架构,协议设计,数据走向,各个模块逻辑,功能,交互和关系。
3) 开发说明书:代码管理工具,系统研发工具,开发技巧,注意事项。
4) 协议设计说明书:协议结构描述。复杂的系统往往是几个团队小组协作完成的,客户端,后台,第三方等等,以文档协议为依据进行交互。
5) 数据库表结构设计说明书:业务数据落地,相应数据库和表的详细信息,分库分表策略,数据群组,主从分配配置。
6) Redis数据结构设计说明书:数据结构设计,数据类型分类,业务对应数据定义。
7) 功能实现逻辑说明书:写逻辑前,将需求和问题条理化。好记性不如烂笔头,复杂的业务逻辑务必要有逻辑图(“千言万语不及一张图”),实现策略和相关的文档说明。
8) 代码规范说明书:编码的重中之重,良好的代码风格让人赏心悦目,易于维护。团队在写第一行代码前就要代码规范培训,良好的规范也是企业文化的一种传承。
9) 系统部署说明书:量化,细化使用工具,安装软件,执行脚本,部署步骤。
感谢团队的智慧..
更精彩内容,请关注我的博客:https://wenfh2020.com