并发提速的同时主动限流--做一个负责任的客户端

一、背景

公司的WMS业务需要高度依赖ERP系统的封存数据做封存校验。

测试环境大批量堆板出库压测暴露出封存校验性能问题:(1)ERP系统扛不住大批量数据封存校验请求,减少对ERP系统冲击;(2)单次过大批量请求本身不合理。

另ERP封存校验接口并行度不宜过高。

二、简单分析

1、方案设想

ab4753d194e54d2ca38d65a37a59de03.png

2、已知关键信息

ERP建议请求量:不超过1000条码/次

ERP建议并行度:200(按1000条码/次压测)

设计单次请求量:200条码/次(按生产实际数据分布评估)

设计并行度:200条码/次远低于1000条码/次,暂定最大并行度在200~400之间,按耗时区间动态浮动。(耗时浮动值5)

三、扫码封存校验优化方案

1、方案设计

大致结构:

所有服务节点限制同时并行的请求线程任务最大有n个:

83baa301234f4f07bad96b6e46eefd96.png

封存条码校验请求到达方法中时,按200条码/任务进行拆分,循环发起请求异步任务,支持多进程多线程并发调用,使用分布式缓存数据组件redis累计请求数。当并发超过最大限制时,根据RTT(Round-Trip Time)往返时延,动态进行自旋超时等待。

流程图:

说明:

· 数据切片:提前按200一片切好一个一个200的请求任务,再循环校验并发度,并发起异步线程任务

· 两个redis key:

(1)Erp封存校验请求并发计数器[count]:这里取名count。计算当前所有服务节点并发请求线程数,原则上不高于最大并发度。

(2)支持最大并发度缓存[mQPS]:这里取名mQPS。限制所有服务节点并发线程数。

· 超过最大并发自旋重试:重试三次,等待并发下来后再执行。

· 耗时浮动:根据耗时粗略判断ERP系统是否处于业务高峰,适当浮动最大并发限制。

9027cf68f115434383d51c93cd661676.png

2、最大并发浮动区间(初略设计,持续优化)

单次请求耗时处于不同区间时,最大并发数的变化趋势大致示意图:

4b02afeb72494faa84b0eda7fb4b6cb9.png

3、补充设计

(1)本地并发计数

增设本地节点并发请求计数器,功能与操作跟总并发计数器类似。

区别在于,本地节点并发计数器仅计算当个应用节点的并发统计

设计原因在于系统未实现优雅停机,发版时有可能会中断执行请求中的线程,从而导致停机后总并发计数未能来得及执行正常扣减。

需要特别注意的是,发版为逐个分区、逐个节点下线上新,重置并发计数需要按节奏逐个节点重置。

增加并行本地节点并发计数器,在节点重启时获取并重置本地节点并发计数器,从总并发计数器中扣除相应数值,重置总并发计数器中的本地节点并发计数。

(2)检测到任一线程出现异常时立即返回

使用Collections.synchronizedList接收子任务add的异常信息,当主线程发现异常队列不为空时,停止发起未执行任务,立即抛异常返回

 

四、业务拓展时可能出现问题及预案

1、开始出现超大栈板业务场景时,并发多个超大栈板封存校验请求,每个超大栈板又拆分大量子任务,开始大量争抢并发名额,引发自旋等待超时雪崩,出现大量失败请求。

预案:根据栈板数据量动态调整单次请求切分批量、自旋等待超时时间、最大并发数,并按业务拓展后实际场景做进一步分析设计。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大迪吃小迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值