• 请不要在回答技术问题时复制粘贴 AI 生成的内容
dangyuluo
V2EX  ›  程序员

有什么比较轻量级的定时任务队列么?

  •  
  •   dangyuluo · Jan 24, 2017 · 10771 views
    This topic created in 3575 days ago, the information mentioned may be changed or developed.

    最近在开发一套电商系统,遇到一个难点。用户下单后半小时内必须支付,超时订单作废,商品自动释放。

    我现在的方法是在数据库内记录下单时间戳,并且在进入支付页面、执行支付等动作时检查是否超时。但是感觉这种被动的检查订单是否超时方法有点不优雅,每一项和订单有关的操作都需要这么繁琐得检查。

    我想使用一套定时触发的任务系统,比如用户下订单后就生成一个 1800 秒后执行的任务,任务内容为关闭订单+返回商品库存+向用户发送通知。我目前只使用了 rabbitMQ ,但是好像 rabbitMQ 并没有提供类似 cron 的定时任务功能。

    不知道大家有什么推荐的解决方案么?

    28 replies  •  2017-01-25 19:35:31 +08:00
    dangyuluo
    dangyuluo
    OP
    Jan 24, 2017
    1
    目前了解到有个服务叫 Atrigger ,能提供类似的功能,但是需要远程调用。而我希望能自己搭建服务。
    alexsunxl
    alexsunxl
    Jan 24, 2017
    2
    @dangyuluo
    redis 有一个键到期事件,你可以把过期时间设成 1800s ,然后订阅事件去检查订单状态。
    感觉这个应该够用, 不要过度设计比较好吧。
    lhbc
    lhbc
    Jan 24, 2017
    3
    楼主目前的实现是有大问题的
    商品一般都有库存,用户下订单后修改库存的数量,订单超时后应该释放商品
    按楼主目前的实现方式,下单后一直不支付并且不进入支付页面,那商品就被作废订单给锁定了

    赞同 @alexsunxl Redis 就足够了
    stamaimer
    stamaimer
    Jan 24, 2017 via iPhone
    4
    python 的话有个 celery
    dangyuluo
    dangyuluo
    OP
    Jan 24, 2017 via iPhone
    5
    @lhbc 目前要设计的就是抢购模式,锁定该订单。一旦支付失败,返回库存还可以继续购买。
    dangyuluo
    dangyuluo
    OP
    Jan 24, 2017 via iPhone
    6
    @alexsunxl 程序目前没有使用 redis 的订阅功能,因此可能并不能实现。还是希望以回掉的方式进行
    gouchaoer
    gouchaoer
    Jan 24, 2017 via Android
    7
    @alexsunxl 这个是哪个命令呢?
    sunorg
    sunorg
    Jan 24, 2017 via iPhone
    8
    1.访客量不大时硬编码就好了
    2.归根结底还是锁资源加轮询,其他工具的实现 也大致如此,只是帮你实现好了而已。已有消息队列了,自己再写个代码即可,
    dangyuluo
    dangyuluo
    OP
    Jan 24, 2017
    9
    @sunorg 理论上是这样,但是总觉得开源社区的代码更成熟吧,坑比自己写一个要少多了。
    dangyuluo
    dangyuluo
    OP
    Jan 24, 2017
    10
    @lhbc 哦我懂你的意思了,你说的对。所以我需要加上定时取消订单的功能。
    chenjf2k
    chenjf2k
    Jan 24, 2017
    11
    数据库定时任务,每分钟执行一次 SQL 脚本。
    janxin
    janxin
    Jan 24, 2017
    12
    这种之前讨论过很多次了 https://www.v2ex.com/t/334992
    mikaka
    mikaka
    Jan 24, 2017
    13
    java 的话有延迟队列 DeplayQueue
    mikaka
    mikaka
    Jan 24, 2017
    14
    @mikaka DeplayQueue -> DelayQueue
    stackboom
    stackboom
    Jan 24, 2017
    15
    quartz
    snnn
    snnn
    Jan 24, 2017 via Android
    16
    两种方式结合, double check 。
    内存中构造一个优先队列
    jyf
    jyf
    Jan 24, 2017
    17
    beanstalkd
    pubby
    pubby
    Jan 24, 2017 via Android
    18
    轻量就用 beanstalk
    mcfog
    mcfog
    Jan 24, 2017 via Android
    19
    rabbitmq 有延时功能的,但因为是队列,所以 expiration 只检查队首元素,如果你的超时是固定 1800s 的话倒是够用了。 我有不少逻辑都是借助 rabbitmq 延时走的
    mcfog
    mcfog
    Jan 24, 2017 via Android
    20
    队列的好处是不怕进程死掉, redis 事件没了就没了,队列不处理就一直压在队列里
    pubby
    pubby
    Jan 24, 2017 via Android
    21
    @pubby 以前用 rabbitmq ,后来改 beanstalk 了。很多地方都用,爬虫、邮件、短信、各种任务处理。楼主的需求我也用它做过
    CallMeHoney
    CallMeHoney
    Jan 24, 2017
    22
    beanstalk
    ahkxhyl
    ahkxhyl
    Jan 24, 2017
    23
    beanstalkd
    l1905
    l1905
    Jan 24, 2017
    24
    简单处理的话, 感觉可以写个 cron 脚本, 每分钟定时执行, 去扫描这些待支付订单是否已过期
    Mirana
    Mirana
    Jan 24, 2017
    25
    放在 redis 有序队列里,定时轮询就可以
    star7th
    star7th
    Jan 24, 2017
    26
    我写的 HTQ 的定时异步队列可满足要求

    https://github.com/star7th/htq
    mingyun
    mingyun
    Jan 24, 2017
    27
    redis 简单
    yepinf
    yepinf
    Jan 25, 2017
    28
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   774 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 137ms · UTC 23:12 · PVG 07:12 · LAX 15:12 · JFK 18:12
    ♥ Do have faith in what you're doing.