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

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

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

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

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

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

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

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

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

    https://github.com/star7th/htq
        27
    mingyun   2017-01-24 23:22:39 +08:00
    redis 简单
        28
    yepinf   2017-01-25 19:35:31 +08:00
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1732 人在线   最高记录 4236   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 16:25 · PVG 00:25 · LAX 08:25 · JFK 11:25
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1