一天大概会生成七八千量的订单数据,逐一去调用第三方支付接口支付。已有逻辑是使用定时任务同步执行的,每 5 秒执行一次,需要执行几个小时才能完成。怎么改造一下能快速处理完?

2021-04-02 13:55:42 +08:00
 typ1805
3667 次点击
所在节点    问与答
42 条回复
KouShuiYu
2021-04-02 14:16:43 +08:00
改成多个请求接力执行
KouShuiYu
2021-04-02 14:20:27 +08:00
之前写过一个多文件上传,设置好最大同时上传的数量,每当有一个上传完成自动开启下一个上传任务
wantooo
2021-04-02 14:25:33 +08:00
对方的支付接口很耗时吗,你 iob 拉起来发给多个线程执行呗
rylei
2021-04-02 14:25:56 +08:00
这种用消息队列生成之后直接调支付不好吗?
ch2
2021-04-02 14:29:10 +08:00
Python 用 grequests,一口气支付 1000 个订单,当然只要你胆子大就可以
typ1805
2021-04-02 14:31:46 +08:00
@ch2 用的是 Java
typ1805
2021-04-02 14:32:19 +08:00
@rylei 嗯嗯,想着是用消息队列
Dimomo
2021-04-02 14:32:54 +08:00
并发请求不行吗?
typ1805
2021-04-02 14:33:23 +08:00
@wantooo 调用的三方支付比较多,有的比较耗时
ch2
2021-04-02 14:34:44 +08:00
@typ1805 java 应该也有对应的网络库,批量发送请求的那种,不用一个一个等
qiayue
2021-04-02 14:34:54 +08:00
先看执行一次请求需要耗时多久,一般 200 毫秒内,那么 1 秒钟就可以请求 5 次。
实际上你 1 秒钟可以请求超过 5 次,只要对方没有限制。

最好的办法然是,用队列。
如果还想用定时任务,那么可以改为 1 秒一次,然后每次取 5 条订单出来,同时发 5 个请求,或者发一个请求,等返回结果后再发下一个请求。

注意要防止重入,举例第一次你取出来 5 条是 1,2,3,4,5,结果你程序处理到第 4 条时,下一秒又被取出来 5 条是 5,6,7,8,9,那么 5 就有可能被对方处理 2 次。
keepeye
2021-04-02 14:39:40 +08:00
用 go 就很好解决了。其他也可以用队列+多进程方式处理
eason1874
2021-04-02 14:41:46 +08:00
看对方 API 频率限制,按 90%最大并发去提交请求,再慢也没办法了。
whileFalse
2021-04-02 14:44:26 +08:00
为啥要攒起来逐一调用?请求来了实时调用不行吗?
Kilerd
2021-04-02 14:48:30 +08:00
如果对方没有 API 调用限制,异步一梭子,分分钟搞定。
typ1805
2021-04-02 14:50:12 +08:00
@whileFalse 业务是批量导入数据,系统自动生产订单入库(状态为未支付),再从数据库读取数据进行支付,更新状态。
typ1805
2021-04-02 14:50:51 +08:00
@qiayue 感谢,打算用队列干
sarices
2021-04-02 14:53:10 +08:00
为何不并发去处理呢,数据导到队列,并发几个去处理
Jooooooooo
2021-04-02 14:56:17 +08:00
并发的搞啊, 不同订单是独立的.
zw1one
2021-04-02 14:57:03 +08:00
每 5 秒执行一次,一次执行一条数据?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767528

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX