最近在开发一套电商系统,遇到一个难点。用户下单后半小时内必须支付,超时订单作废,商品自动释放。
我现在的方法是在数据库内记录下单时间戳,并且在进入支付页面、执行支付等动作时检查是否超时。但是感觉这种被动的检查订单是否超时方法有点不优雅,每一项和订单有关的操作都需要这么繁琐得检查。
我想使用一套定时触发的任务系统,比如用户下订单后就生成一个 1800 秒后执行的任务,任务内容为关闭订单+返回商品库存+向用户发送通知。我目前只使用了 rabbitMQ ,但是好像 rabbitMQ 并没有提供类似 cron 的定时任务功能。
不知道大家有什么推荐的解决方案么?
1
dangyuluo OP 目前了解到有个服务叫 Atrigger ,能提供类似的功能,但是需要远程调用。而我希望能自己搭建服务。
|
2
alexsunxl 2017-01-24 03:04:59 +08:00
|
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
|
6
dangyuluo OP @alexsunxl 程序目前没有使用 redis 的订阅功能,因此可能并不能实现。还是希望以回掉的方式进行
|
8
sunorg 2017-01-24 08:45:21 +08:00 via iPhone
1.访客量不大时硬编码就好了
2.归根结底还是锁资源加轮询,其他工具的实现 也大致如此,只是帮你实现好了而已。已有消息队列了,自己再写个代码即可, |
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
|
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
|
27
mingyun 2017-01-24 23:22:39 +08:00
redis 简单
|
28
yepinf 2017-01-25 19:35:31 +08:00
|