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

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

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

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

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