求问,java不同团购活动倒计时如何实现?

OLESHI 发布于 2018/05/23 15:15
阅读 1K+
收藏 1

项目中,团购活动,不同活动到期时间不一样,活动到期后,要判断是否符合成团条件,做出相应处理。

原本想用rabbbitMq延时队列,但是由于活动到期时间不一样,不可行。

现在仍是使用的rabbbitMq延时队列,并统一延时1s, 系统处理如果没到时间,重新仍会MQ。

但是这样并不太好,求问开源大神们,有没有好的实现方法。

加载中
0
没有名字也不行?
没有名字也不行?

感觉redis的延迟队列其实也可以啊,没有数量限制

没有名字也不行?
没有名字也不行?
回复 @OLESHI : 其实任务丢失的问题也可以从持久层的数据库中恢复回来,举个例子:假如redis服务器宕机了,重启之后发现数据也没有了。所以这个恢复是很有必要的,只需要从表1也就是消息表中把消息状态不等于已消费的数据全部重新分发到延迟队列中去,然后同步一下状态就可以了。参考文档:https://www.cnblogs.com/peachyy/p/7398430.html
没有名字也不行?
没有名字也不行?
回复 @OLESHI : 嗯,单一部署会有这个问题,不行就弄个主从的redis,因为自己实现的嘛,肯定功能会比较简单,有利有弊
O
OLESHI
使用sorted set吗?之前没有相到,现在了解了一下, 应该可行,但是没有MQ的ACK机制,如果执行到一半,服务器重启了,可能会有一个任务丢失。。
0
开源中国-首席营养师

当然是要开一个后台进程去跑了

0
sxgkwei
sxgkwei

方案:使用 quartz job 方案。

1,建立团购活动的时候,设置的到期时间,转换成cron表达式,并存表

2,系统启动时,查询表中所有数据中还没结束的数据,使用每一条数据建立具体 job,并设置定时任务 cron 表达式进去。

3,因为一个完整的未来时间,必然只会转换出一个只能执行一次的 cron 表达式。所以,在 job 执行结尾,反向调用 jobManager 从管理中心删除此 job。

4,获得后台配置,允许配置 成团条件工厂类 的具体实现类。用具体的实现类,来判定每一种活动的具体成团条件是否达成,job 中调用配置的具体类字符串,反射创建出具体判定类,执行抽象判定方法。就是使用工厂模式。

5,有新的团请求发起时,在保存到1中提到的表时,根据此条数据,创建出job,放入任务管理中心。

 

整个流程就完了,应该能实现你要的效果。

sxgkwei
sxgkwei
回复 @OLESHI : 主要还是要看,结束时间是在模版对象内持有,还是模版本身持有。一般都是模版本身持有,那么当前能参与的模版并不会很多,问题不大。
sxgkwei
sxgkwei
回复 @OLESHI : 如果一个团,结束时间一致,你可以上层再抽象一次。如果结束时间不一致,那为了达到准时结束,只能这么搞
O
OLESHI
一千个团岂不是一千个job
0
跬步至千里
建立团购活动的时候增加一个到期时间,团购成功的条件是时间早于到期时间
0
村儿

实现个超时中心,将团购id和到期时间作为一条记录存储到db,定期扫描查询(以当前时间大于过期时间为条件),扫描处理后直接处理,或者塞到队列异步处理..

PS:或者自己实现一套基于redis的延时队列 https://cuner.github.io/blog/2018/05/30/delay-queue/

返回顶部
顶部