最近在开发一套电商系统,遇到一个难点。用户下单后半小时内必须支付,超时订单作废,商品自动释放。
我现在的方法是在数据库内记录下单时间戳,并且在进入支付页面、执行支付等动作时检查是否超时。但是感觉这种被动的检查订单是否超时方法有点不优雅,每一项和订单有关的操作都需要这么繁琐得检查。
我想使用一套定时触发的任务系统,比如用户下订单后就生成一个 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 脚本。 |
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 |