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

2017-01-24 02:48:20 +08:00
 dangyuluo

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/336557

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX