在线支付系统需要极高的稳定性,在有限的系统资源下,稳定性优先级要高于系统并发以及用户体验,因此需要合理的控制用户的支付请求。
实际场景
在一个小规模电商平台上,用户点击购买生成订单后,点击支付按钮后会经过如下过程:
1、系统后台与支付平台对接,获取支付请求。
2、用户终端接受加密过后的请求信息,跳转至支付平台WEB服务页面,开始支付流程。
3、系统发起异步进程轮询支付平台,已获取用户支付的结果(之所以采用轮询,与项目的网络连接不稳定性有关,以及无法溯源有关)。
4、系统异步查询到支付成功的结果后,更新订单状态至已支付。
从这里可以看出,除获取支付请求需要同步处理外,支付结果查询可以做异步处理,用户无需等待查询完成。因此在可以使用之前博客提到的线程池来存储和执行异步任务。详情见:WEB项目中一些简单异步任务的组织与调度方法
问题提出
接上节可以看出由于在用户跳转至支付平台时,系统就为该请求生成了异步任务。为维持系统稳定,任务队列的长度应该做出限制,同时并发线程的数量也应该有约束,因此异步执行的资源有限。所以由于种种原因,比如:
1、顾客提交支付请求失败,反复尝试支付。
2、存在恶意刷单行为,反复发起申请。
等等
就会出现线程池资源被占满的情况。所以需要对此类反复高频率的支付行为作出一定限制。
解决方式-缓存
要解决问题的核心在于一定程度上限制高频支付的行为,因此可以在支付频率上着手,比如让用户在一定时间内只允许进行一次支付(比如60秒)。