
1 liuawei OP 说明一下:300 单是有效订单,已经支付订单,参与轮询的订单大概是有效单的两倍。 |
2 Raymon111111 2019-03-15 11:22:11 +08:00 啥叫轮询 1 秒 10 单基本不用太考虑性能 |
3 Vegetable 2019-03-15 11:26:05 +08:00 是看订单有没有支付完成? 你们不是用回调的吗?再说清楚一点吧 |
4 Moker 2019-03-15 11:26:52 +08:00 4 方支付? |
5 PhpBestRubbish 2019-03-15 11:27:59 +08:00 支付不是有回调吗,要轮询干嘛? |
6 1sbugou 2019-03-15 11:30:57 +08:00 威富通。。呵呵 |
7 liuawei OP @Raymon111111 就是查询订单支付状态。有的时候一次支付查询请求都需要 1 秒哦。 |
9 Mrun 2019-03-15 11:35:20 +08:00 AMQ |
10 Moker 2019-03-15 11:35:21 +08:00 订单状态对方有回调 等通知就好了 主动查询只是一个补偿 量很小 加上异步去请求就可以了 |
11 liuawei OP @Vegetable 第一个轮询会存在网络节点丢单情况,第二个比如支付宝反扫,刷脸支付会没有回调,会存在请求支付宝接口,支付宝接口 Socket 异常,我们这边异常,支付宝已经扣款成功。 还有例如威富通这种机构有的时候回调会有问题。 |
12 arrow8899 2019-03-15 11:36:46 +08:00 消息队列,设置多个线程同时消费,你开 20 个线程,查一次 1s,1 分钟也有 1200 单了 |
14 skymei 2019-03-15 11:38:16 +08:00 不同的支付类型放到不同的队列,开线程去对应的队列,1 分钟 600 单不算很大的量,应该是处理的过来.看你们的服务器配置以及代码部署方式了,要是有负载均衡,缓存的话基本不用担心。 |
15 liuawei OP |
17 kingOfWorLd 2019-03-15 11:43:12 +08:00 其实可以用消息队列的,每次支付成功,如果有回调成功了,就返回成功,如果没有回调,需要主动查询的,就抛到消息队列中,如果消息队列查询成功,更新订单状态,如果查询失败,再接着抛进消息队列,记录查询失败的次数,如果失败次数大于 5 次,那么就要进入反馈系统了,人工去查询,干预。 |
18 liuawei OP @kingOfWorLd 说了只有三个工作日,原生支付,H5, 小程序是不同的项目都要改,公司以前没有用过消息队列。 |
19 liuawei OP 目前自己的解决方案是,JOB 轮询,每种支付方式建立一个任务。 但是我们领导说也会存在丢单的情况,他的观念说,查询请求 0.5S+我们业务逻辑处理,下货 0.5S 。一分钟超过 100 单的话会存在有些订单轮询不到。 |
20 mortonnex 2019-03-15 11:50:10 +08:00 楼主怕不是对轮询有什么误解 |
21 kingOfWorLd 2019-03-15 11:59:30 +08:00 @liuawei 简单点用用 redis 的消息队列,专业一点用 rabbitMq,其实就是一个环境搭建,很容易学习的,这个叫做方法正确性,美团等一些公司都是这个思路,关于时间问题,我觉得 3 个小时足够你学习了,如果你不去建立分布式消息队列集群(可能现阶段你也不需要),说白了,简单的就是 socket 连接,读者写者的模型啊。 |
22 no1xsyzy 2019-03-15 12:27:08 +08:00 我猜问题是单线程阻塞式轮询,多线程或者非阻塞再垃圾也是 1000/s 以上的查询量(以优化垃圾的 CPython 为例) 猜错就当我没说 |
23 no1xsyzy 2019-03-15 12:29:38 +08:00 添加“我已付款完成”按钮,由用户通知你去查询? |
24 Asice 2019-03-15 12:38:16 +08:00 多线程并发过去查询,一分钟 1w 单都轻轻松松,反正性能也在被查方,简单粗暴时间快 |
25 liuawei OP @kingOfWorLd 恩恩核心我知道下单模块写入订单,轮询模块处理订单。只是只有三天时间,还有你说的 Rabbitmq 和 redis 都比较熟悉,我还是去跟领导多申请几天时间。 |
26 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. 专业做支付,来蚂蚁. 广告小尾巴, 谢谢 t/541340 |
27 rockyou12 2019-03-15 14:33:02 +08:00 lz 考虑有问题,支付成功不回调是个小概率事件。实际情况你只要查询超时订单是否支付就行了。 比如订单有一分钟的窗口,一分钟后(不需要很准确,一个 10s,20s 的定时器轮询查都可以)再主动查询支付平台,如果没支付就关闭订单。 如果网络等出现严重问题,客户多次支付,你只要业务上能回算出用户多付的钱,事后走渠道退回,其实也不会是很严重的问题。 |
28 sujin190 2019-03-15 14:42:37 +08:00 支付宝和微信都有延时重试策略,几乎不会出现挂的情况,其他的支付方式可能通知不是很严谨,但是用户量小的话几乎可以忽略了吧,能用就是了,三天就搞出来的还想咋滴了 |
29 quickma 2019-03-15 14:44:37 +08:00 所以横向扩容一个系统,不就从 300 变成 600 了,然后就花多一些时间写新的容量更大的系统。依照我的理解你现在似乎无法完成这个工作,所以需要花大于 3 天的时间。 |
30 ysweics 2019-03-15 15:04:29 +08:00 感觉楼主需要一个应急的方案,如果只是应急的方案,你自己方案也可以,但是如果要保持系统的良好,那队列必不可少,就看你和你领导怎么权衡了 |
31 liuawei OP @rockyou12 我们是做 SASS 服务,前几天遇到几笔丢单,然后用户说支付没有下货,就投诉到我们客户那里,让后客户就说我们“吃”单。所以就不打算和我们合作了。 |
33 yc8332 2019-03-15 16:37:42 +08:00 订单量很少啊。。。订单放队列里,开 N 个线程去跑就好了,订单多就多开几个。。过期就关掉订单。。 |
34 ghos 2019-03-15 18:01:10 +08:00 老实讲你的队列不用 redis mq 也可以 用 blockingqueue 都行 只要做好队列内容持久化就好了 |
35 limuyan44 2019-03-15 20:13:48 +08:00 via Android 你看目前一分钟可以支持 300,我们花一分钟向老板申请一台机器就变成 600 啦。。至于改造我们以后慢慢来吗 |
36 kaneg 2019-03-15 21:40:51 +08:00 via iPhone 如果来不及引入新的组建( MQ 之类),就用数据库模拟队列,用不同的标记位来维护状态,定时查询指定状态的数据记录,然后扔到线程池去异步处理。只要处理速度快于订单的到来速度就没啥问题。如果处理不过来,就根据瓶颈在 CPU 还是内存来增加相应的资源。 |
37 MeteorCat 2019-03-15 21:47:09 +08:00 via Android 是不是搞支付超时回调,马个鸡,好多第三方支付回调轮询好不靠谱,接入一次天天订单异常 |
38 runningman 2019-03-16 07:58:22 +08:00 via iPhone @liuawei 我也做自动售货机 可以微信交流 270115861 |
39 runningman 2019-03-16 08:19:27 +08:00 via iPhone 哈哈 这些 case 我之前就这么实现的 |
40 sinboy1988 2019-03-16 11:00:50 +08:00 @kingOfWorLd 没有回调是什么意思,不太明白 |
41 guijianshi01 2019-03-16 16:46:02 +08:00 回调,别做轮询,加上延时队列做超时处理就好了 |
42 troywinter 2019-03-16 19:39:26 +08:00 回调加超时轮询,另外,轮询必然不能本地同步做啊,先多线程再加分布式。。。 |
43 liuawei OP @runningman 刚看到 这微信搜索不到呀 |
44 runningman 2019-10-28 23:52:59 +08:00 via Android @liuawei 可以啊 270115861 或者 zhtsuc |