跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 一天大概会生成七八千量的订单数据,逐一去调用第三方支付接口支付。已有逻辑是使用定时任务同步执行的,每 5 秒执行一次,需要执行几个小时才能完成。怎么改造一下能快速处理完?
未分類
19 4 月 2021

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

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

資深大佬 : typ1805 12

改成多个请求接力执行
大佬有話說 (41)

  • 資深大佬 : KouShuiYu

    之前写过一个多文件上传,设置好最大同时上传的数量,每当有一个上传完成自动开启下一个上传任务

  • 資深大佬 : KouShuiYu

    对方的支付接口很耗时吗,你 iob 拉起来发给多个线程执行呗

  • 資深大佬 : wantooo

    这种用消息队列生成之后直接调支付不好吗?

  • 資深大佬 : rylei

    Python 用 grequests,一口气支付 1000 个订单,当然只要你胆子大就可以

  • 資深大佬 : ch2

    @ch2 用的是 Java

  • 主 資深大佬 : typ1805

    @rylei 嗯嗯,想着是用消息队列

  • 主 資深大佬 : typ1805

    并发请求不行吗?

  • 資深大佬 : Dimomo

    @wantooo 调用的三方支付比较多,有的比较耗时

  • 主 資深大佬 : typ1805

    @typ1805 java 应该也有对应的网络库,批量发送请求的那种,不用一个一个等

  • 資深大佬 : ch2

    先看执行一次请求需要耗时多久,一般 200 毫秒内,那么 1 秒钟就可以请求 5 次。
    实际上你 1 秒钟可以请求超过 5 次,只要对方没有限制。

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

    注意要防止重入,举例第一次你取出来 5 条是 1,2,3,4,5,结果你程序处理到第 4 条时,下一秒又被取出来 5 条是 5,6,7,8,9,那么 5 就有可能被对方处理 2 次。

  • 資深大佬 : qiayue

    用 go 就很好解决了。其他也可以用队列+多进程方式处理

  • 資深大佬 : keepeye

    看对方 API 频率限制,按 90%最大并发去提交请求,再慢也没办法了。

  • 資深大佬 : eason1874

    为啥要攒起来逐一调用?请求来了实时调用不行吗?

  • 資深大佬 : whileFalse

    如果对方没有 API 调用限制,异步一梭子,分分钟搞定。

  • 資深大佬 : Kilerd

    @whileFalse 业务是批量导入数据,系统自动生产订单入库(状态为未支付),再从数据库读取数据进行支付,更新状态。

  • 主 資深大佬 : typ1805

    @qiayue 感谢,打算用队列干

  • 主 資深大佬 : typ1805

    为何不并发去处理呢,数据导到队列,并发几个去处理

  • 資深大佬 : sarices

    并发的搞啊, 不同订单是独立的.

  • 資深大佬 : Jooooooooo

    每 5 秒执行一次,一次执行一条数据?

  • 資深大佬 : zw1one

    分通道多个任务去处理,比如按照订单最后一位,那么就会提升 10 倍,或者对订单取模型,分割的方法有很多,这样不用引入新的中间件,而且对数据的进度,成功情况有更好的掌握

  • 資深大佬 : WangRicky

    典型的批处理任务?

  • 資深大佬 : hxndg

    推荐用 Go

  • 資深大佬 : fiypig

    这种支付过程是不需要用户参与的吗?

  • 資深大佬 : AngryPanda

    你用 queue 队列处理订单,一个个处理,OK 的就移除队列,不 OK 的就继续 offer

  • 資深大佬 : daimameiwenti

    1 、如果你要改动小的话,就在处理的地方加个线程池,多设置几个线程同时做支付发送就好了,注意 oom 问题。
    2 、如果要改一改架构,上个 mq 提升系统可用性的话,我大概设计了个架构。
    https://www.processon.com/view/link/6066cde95653bb5ceafdc638

  • 資深大佬 : zw1one

    串行 变成 并行调度 跟语言就没啥关系了

  • 資深大佬 : wsbnd9

    你这个不是常规支付接入吧, 是客户下单后用自己账号代付么?多准备几个账号

  • 資深大佬 : tcsky

    @zw1one #26 牛逼啊 [赞]

  • 資深大佬 : sweetsorrow211

    为什么不说说为什么已有逻辑设定 5 秒钟搞一次,
    5*8000=40000/3600=11.111 ,那必然半天都在处理订单了。
    我只想知道当初是哪个~哔~设计的这个逻辑。

  • 資深大佬 : cpstar

    换句话讲,能保证每一个单子 5 秒钟能处理完?如果没有处理完的,下一个单子怎么办?
    这特么没学过边界测试吧。。。

  • 資深大佬 : cpstar

    用阻塞队列就好啦
    一个线程捞任务到队列,如果队列满了就等待
    再搞一个消费线程池,直接从队列取,队列满了就等待。(需要控制消费线程池的大小,保证不把支付接口压垮就好)

  • 資深大佬 : corningsun

    修正下:再搞一个消费线程池,直接从队列取,队列空了就等待

  • 資深大佬 : corningsun

    定时任务一般是一次取出全部未执行的数据去执行,没有未执行的数据则等待下次执行。不是每次只取一条数据。。。。。

  • 資深大佬 : arvinsilm

    平均 10 秒一个新订单,5 秒去执行一次,可以接受,既不会大量积压也不会频繁请求

  • 資深大佬 : pcbl

    不更改原有逻辑不增加中间功能的情况下可以把 5 秒改成一秒,每间隔一秒钟就去获取一个最早生成的未处理的订单,添加一个处理中标记,执行完成后标记为已处理

  • 資深大佬 : pcbl

    @typ1805 java 不是有 threadpool 么。

  • 資深大佬 : dzdh

    Java 的话直接用固定数量的线程池解决?

  • 資深大佬 : stardust21

    可以试试 PowerJob 这个任务调度框架,支持 MapReduce 分布式计算,很符合你的场景。

  • 資深大佬 : tjq

    开个 threadpool 不就行了 试出 api 的极限 设置一个 80%的大小

  • 資深大佬 : hahasong

    @zw1one 感谢

  • 主 資深大佬 : typ1805

    @tjq 感谢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具