【51CTO.com原创稿件】背景
苏宁易购合同数据中心系统是苏宁合同管理系统中的一个子系统,主要为苏宁价格、结算、商户平台、调拨等系统提供销售、扣点、账期等数据,用于指导销售、账期结算、采购流程管库等。
随着公司业务的快速发展,各系统的调用量和并发量明显增长,现有的合同数据服务接口已不能满足某些系统的性能要求,急需升级和优化该服务接口,提高系统的可用性和稳定性。
系统面临两个紧迫诉求:
1. 接口性能要从原有的并发量1000TPS提升到10000+TPS以上,满足高性能。
2. 系统可以横向扩展,随着业务发展,可以动态的扩容,满足可扩展。
问题分析
未改造前的苏宁合同子系统扣点服务查询逻辑
如图:
存在的问题:
1. 大量的连接查库,造成数据库负载较高
扣点服务查询业务逻辑比较复杂,通常一条数据调用需要多次对数据库进行查询,在调用量大的时候,经常会出现数据库连接不够,数据库负载过高等问题,给数据库造成很大压力。
2. 串行化查询,效率较低
接口调用的时候,通常是一个报文里包含几十条数据,由于是串行查询,每条报文都是逐条查询,导致处理效率较低。
3. 大量的服务调用,造成服务器压力过大
现有的4台Wildfly服务器在并发量大的时候,每台机器的压力都比较大,需要更多的机器来分担压力。
改造方案
1. 增加缓存,预先将热点数据放入缓存
(1) 系统最大的问题,就是IO比较密集,服务并发调用的时候,需要大量的查询数据库。我们想到的方案就是能否把一部分数据提前计算好,放入缓存,当系统调用的时候直接从缓存中取。
(2) 考虑到数据量比较大,生产环境有将近10亿的数据,单台Redis无法容纳这么大的数据,需要做分布式存储。借助苏宁自研的Zedis分布式缓存来实现对数据的存储。
实现方案:
(1)后台通过定时任务预先将做过价格的商品(热点数据)计算好之后,将结果数据写到zedis缓存集群中。
(2)有新的热点数据变动的时候,先将缓存数据清除,再将数据插入库中,更新该商品缓存状态(防止缓存数据与数据库数据不一致)。
(3)后台定时任务查询到缓存状态未处理的数据重新计算结果,将最新的数据写入缓存中。
处理流程,如图:
2. 串行改并行,多线程并发处理数据
(1)调用扣点服务的报文通常都是实时的,也存在一些批量调用的数据,一个报文存在多条调用的数据,未改造前,整个调用都是串行的。
如图:
调用之前花费的时间是各条数据处理时间的总和
(2)多线程改造之后可以并行的处理一个报文的多条数据
如图:
改造后,在后台维护一个线程池,并发处理一个报文的多条数据,花费的时间是处理时间最长的一条数据,处理时间上相较于串行处理有了显著提高。
3. 横向扩展服务器,分散压力
苏宁易购合同管理数据中心子系统是一个分布式系统,天然具备扩展性。随着调用量,并发量的增加,单台Wildfly服务器压力增大,为满足性能要求,根据压测结果,对服务器进行了横向扩展,从以前的4台扩容到30台,分散系统压力。
4. 改造之后的接口调用方案
如图:
接口压测
改造之后,对扣点服务接口进行了压测,压测借助于公司内部的蛙测平台。
压测环境
服务器数量配置
Nginx24C 4G
Wildfly84C 4G
Zedis54C 32G
MySQL58C 16G
测试场景
测试场景1
模拟场景: 无缓存数据库压测
并发用户数: 8000
测试结果界面如下:
测试时间: 2018-10-01 22:40:23 ~2018-10-01 22:45:23
事务执行总量:2355622次;失败:0次; 成功率:100%
wildfly服务器利用率稳定在5%~10%
事务的平均响应时间:624.75ms
TPS:平均 8264.4
测试场景2
模拟场景: 半缓存半数据库压测
并发用户数: 8000
测试结果的界面如下:
测试时间: 2018-10-07 16:18:30~2018-10-07 16:23:30
事务执行总量:3653576次;失败:0次; 成功率:100%
Wildfly服务器利用率稳定在5%~10%
事务的平均响应时间:403.72ms
TPS:平均 12818.3
测试场景3
模拟场景: 全缓存压测
并发用户数: 8000
测试结果界面如下:
测试时间: 2018-09-13 11:42:13~2018-09-13 11:47:13
事务执行总量:10519551次;失败:0次; 成功率:100%
Wildfly服务器利用率稳定在5%~10%
事务的平均响应时间:140.43ms
TPS:平均 36907.3
小结
从压测结果中可以得出,改造之后的服务接口的TPS有了显著提升,从以前的1000TPS提升到10000+TPS以上,满足苏宁外围系统对合同扣点服务接口的性能要求。
回顾这次性能优化,主要从三方面入手:
1. 利用Redis内存级别的存储,实现数据的快速读取。
2. 从程序内部优化,将串行化的处理改成并行化异步处理。
3. 利用分布式可扩展的特点,扩展服务器,分散压力。
从这次扣点服务升级改造中得出,性能优化不仅仅是单一的利用某个技术就可以提升系统的性能,需要全方位综合的解决性能问题,总结的思路有三点:
1. 找到系统性能的瓶颈。
2. 针对性能瓶颈有的放矢做技术方案,选取合适的技术方案。
3. 一定要压测,优化之后是否真正的提升了系统性能,提升了多少。
结束语
2018年是集团高速发展的一年,随着智慧零售,大开发等战略的逐渐落地,公司的业务量数据量不断的增长,同时对系统的性能和稳定性提出来更高的要求。为响应公司提出的“造极”精神,我们也对现有系统进行了迭代升级,不断优化,不断升级。
在造极精神的鼓舞下,围绕快速迭代、质量保证和稳定服务,把极客、极物、极速的造极精神当作我们的工作态度,唯有挑战不可能,才能超越一切可能,冲破极限,进而登峰造极。
作者:张冀平,苏宁易购IT总部员工平台研发中心技术经理,负责公司内部ERP系统的规划架构开发工作。资深码农,十年软件开发经验,对系统架构,性能优化,分布式系统设计有着丰富的实战经验。
【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】