V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dangyuluo
V2EX  ›  程序员

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

  •  
  •   dangyuluo · 2017-01-24 02:48:20 +08:00 · 9383 次点击
    这是一个创建于 2845 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    https://github.com/star7th/htq
    mingyun
        27
    mingyun  
       2017-01-24 23:22:39 +08:00
    redis 简单
    yepinf
        28
    yepinf  
       2017-01-25 19:35:31 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:03 · PVG 06:03 · LAX 14:03 · JFK 17:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.