大量支付订单轮询,各位有什么好的方法解决。

2019-03-15 11:16:02 +08:00
 liuawei
声明一下领导给的时间在 3 个工作日完成任务,接入的支付方式比较多,微信(扫码,H5,小程序)、支付宝(扫码,H5,刷脸),收钱吧,威富通等。
使用的是 Java 语言。目前 1 分钟差不多高峰有 300 单。目标是能支持一分钟 600 单。
8162 次点击
所在节点    程序员
44 条回复
kingOfWorLd
2019-03-15 11:59:30 +08:00
@liuawei 简单点用用 redis 的消息队列,专业一点用 rabbitMq,其实就是一个环境搭建,很容易学习的,这个叫做方法正确性,美团等一些公司都是这个思路,关于时间问题,我觉得 3 个小时足够你学习了,如果你不去建立分布式消息队列集群(可能现阶段你也不需要),说白了,简单的就是 socket 连接,读者写者的模型啊。
no1xsyzy
2019-03-15 12:27:08 +08:00
我猜问题是单线程阻塞式轮询,多线程或者非阻塞再垃圾也是 1000/s 以上的查询量(以优化垃圾的 CPython 为例)
猜错就当我没说
no1xsyzy
2019-03-15 12:29:38 +08:00
添加“我已付款完成”按钮,由用户通知你去查询?
Asice
2019-03-15 12:38:16 +08:00
多线程并发过去查询,一分钟 1w 单都轻轻松松,反正性能也在被查方,简单粗暴时间快
liuawei
2019-03-15 12:50:13 +08:00
@kingOfWorLd 恩恩核心我知道下单模块写入订单,轮询模块处理订单。只是只有三天时间,还有你说的 Rabbitmq 和 redis 都比较熟悉,我还是去跟领导多申请几天时间。
heypig
2019-03-15 13:34:37 +08:00
跑个题 , 乱扯两点.

1. 方案根治要还是靠 支付的 callback. 主动 query 的只是在 callback 的异常下补偿. 因为 callback 不完全可靠就放弃 callback, 这是因噎废食. callback+query 补偿. 才合理解决.
关于轮询的实现, 看你们自己的技术体系实现了(自己系分去)

2. 提醒一下, query 有两个常见的误区.
a. query 没找到单据, 当做"失败"处理. 其实不一定, 又可能下游处理慢未下单, 所以一般有个业务约定的超时时间, 只有超时时间真正超出了, 才是真的失败.
b. 如果允许一笔订单多次支付, 对多余的支付单要及时退款, 否则你又坑用户了; 实现层面, 比对一下之前支付单号.
以上两点, 支付类业务还好, 细节不当, 你坑了用户, 多付没退 ; 提现类业务, 可能多提钱出去了, 公司要亏.

--------------
这类场景 case 很典型很常见, mark 一下. 有空写点总结说说

---------------

ps. 专业做支付,来蚂蚁. 广告小尾巴, 谢谢
https://www.v2ex.com/t/541340
rockyou12
2019-03-15 14:33:02 +08:00
lz 考虑有问题,支付成功不回调是个小概率事件。实际情况你只要查询超时订单是否支付就行了。

比如订单有一分钟的窗口,一分钟后(不需要很准确,一个 10s,20s 的定时器轮询查都可以)再主动查询支付平台,如果没支付就关闭订单。

如果网络等出现严重问题,客户多次支付,你只要业务上能回算出用户多付的钱,事后走渠道退回,其实也不会是很严重的问题。
sujin190
2019-03-15 14:42:37 +08:00
支付宝和微信都有延时重试策略,几乎不会出现挂的情况,其他的支付方式可能通知不是很严谨,但是用户量小的话几乎可以忽略了吧,能用就是了,三天就搞出来的还想咋滴了
x7395759
2019-03-15 14:44:37 +08:00
所以横向扩容一个系统,不就从 300 变成 600 了,然后就花多一些时间写新的容量更大的系统。依照我的理解你现在似乎无法完成这个工作,所以需要花大于 3 天的时间。
ysweics
2019-03-15 15:04:29 +08:00
感觉楼主需要一个应急的方案,如果只是应急的方案,你自己方案也可以,但是如果要保持系统的良好,那队列必不可少,就看你和你领导怎么权衡了
liuawei
2019-03-15 15:18:44 +08:00
@rockyou12 我们是做 SASS 服务,前几天遇到几笔丢单,然后用户说支付没有下货,就投诉到我们客户那里,让后客户就说我们“吃”单。所以就不打算和我们合作了。
rockyou12
2019-03-15 15:56:26 +08:00
@liuawei 但光看你这个说法也不清楚问题在不在支付那块啊……
yc8332
2019-03-15 16:37:42 +08:00
订单量很少啊。。。订单放队列里,开 N 个线程去跑就好了,订单多就多开几个。。过期就关掉订单。。
ghos
2019-03-15 18:01:10 +08:00
老实讲你的队列不用 redis mq 也可以 用 blockingqueue 都行 只要做好队列内容持久化就好了
limuyan44
2019-03-15 20:13:48 +08:00
你看目前一分钟可以支持 300,我们花一分钟向老板申请一台机器就变成 600 啦。。至于改造我们以后慢慢来吗
kaneg
2019-03-15 21:40:51 +08:00
如果来不及引入新的组建( MQ 之类),就用数据库模拟队列,用不同的标记位来维护状态,定时查询指定状态的数据记录,然后扔到线程池去异步处理。只要处理速度快于订单的到来速度就没啥问题。如果处理不过来,就根据瓶颈在 CPU 还是内存来增加相应的资源。
MeteorCat
2019-03-15 21:47:09 +08:00
是不是搞支付超时回调,马个鸡,好多第三方支付回调轮询好不靠谱,接入一次天天订单异常
runningman
2019-03-16 07:58:22 +08:00
@liuawei 我也做自动售货机 可以微信交流 270115861
runningman
2019-03-16 08:19:27 +08:00
哈哈 这些 case 我之前就这么实现的
sinboy1988
2019-03-16 11:00:50 +08:00
@kingOfWorLd 没有回调是什么意思,不太明白

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

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

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

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

© 2021 V2EX