一、背景
公司的WMS业务需要高度依赖ERP系统的封存数据做封存校验。
测试环境大批量堆板出库压测暴露出封存校验性能问题:(1)ERP系统扛不住大批量数据封存校验请求,减少对ERP系统冲击;(2)单次过大批量请求本身不合理。
另ERP封存校验接口并行度不宜过高。
二、简单分析
1、方案设想
2、已知关键信息
ERP建议请求量:不超过1000条码/次
ERP建议并行度:200(按1000条码/次压测)
设计单次请求量:200条码/次(按生产实际数据分布评估)
设计并行度:200条码/次远低于1000条码/次,暂定最大并行度在200~400之间,按耗时区间动态浮动。(耗时浮动值5)
三、扫码封存校验优化方案
1、方案设计
大致结构:
所有服务节点限制同时并行的请求线程任务最大有n个:
封存条码校验请求到达方法中时,按200条码/任务进行拆分,循环发起请求异步任务,支持多进程多线程并发调用,使用分布式缓存数据组件redis累计请求数。当并发超过最大限制时,根据RTT(Round-Trip Time)往返时延,动态进行自旋超时等待。
流程图:
说明:
· 数据切片:提前按200一片切好一个一个200的请求任务,再循环校验并发度,并发起异步线程任务
· 两个redis key:
(1)Erp封存校验请求并发计数器[count]:这里取名count。计算当前所有服务节点并发请求线程数,原则上不高于最大并发度。
(2)支持最大并发度缓存[mQPS]:这里取名mQPS。限制所有服务节点并发线程数。
· 超过最大并发自旋重试:重试三次,等待并发下来后再执行。
· 耗时浮动:根据耗时粗略判断ERP系统是否处于业务高峰,适当浮动最大并发限制。
2、最大并发浮动区间(初略设计,持续优化)
单次请求耗时处于不同区间时,最大并发数的变化趋势大致示意图:
3、补充设计
(1)本地并发计数
增设本地节点并发请求计数器,功能与操作跟总并发计数器类似。
区别在于,本地节点并发计数器仅计算当个应用节点的并发统计
设计原因在于系统未实现优雅停机,发版时有可能会中断执行请求中的线程,从而导致停机后总并发计数未能来得及执行正常扣减。
需要特别注意的是,发版为逐个分区、逐个节点下线上新,重置并发计数需要按节奏逐个节点重置。
增加并行本地节点并发计数器,在节点重启时获取并重置本地节点并发计数器,从总并发计数器中扣除相应数值,重置总并发计数器中的本地节点并发计数。
(2)检测到任一线程出现异常时立即返回
使用Collections.synchronizedList接收子任务add的异常信息,当主线程发现异常队列不为空时,停止发起未执行任务,立即抛异常返回
四、业务拓展时可能出现问题及预案
1、开始出现超大栈板业务场景时,并发多个超大栈板封存校验请求,每个超大栈板又拆分大量子任务,开始大量争抢并发名额,引发自旋等待超时雪崩,出现大量失败请求。
预案:根据栈板数据量动态调整单次请求切分批量、自旋等待超时时间、最大并发数,并按业务拓展后实际场景做进一步分析设计。