场景:
需要实现一个定时提醒任务,用户设置时间,后端到时间后提醒。有点类似闹钟的功能,因此要尽可能没有延迟。目前使用量不是很大。现阶段是使用xxl-job做的定时任务,每5分钟执行一次。但是这样可能会延迟1-5分钟,如果用户量大了处理时间可能更长。(我们没有app端,只有公众号和小程序,因此无法依赖用户端)
考虑方案:
每天定时任务将当天的要执行的任务塞到mq的延迟队列中,对于修改和新设置的单独处理,修改时,修改消息的id,不撤回消息,在处理时校验消息id,没有则不投递,新增的当天的任务,单独添加。
但这样需要跟运维确认rocketmq的延迟等级设置。感觉也并不是很好。
不知各位大佬有什么比较好的方案,能降低延迟投递。
你可以使用xxl-job生成一次性任务,一个提醒一个任务,到期后这个任务就结束了。
用户设定时间即可后端开启一个定时任务,并不需要把用户设定的时间放队列里,后端开启定时任务定期扫描执行。
把定时任务转换成延时任务,然后使用redisson的延时队列去处理。其实xxl-job也是基于延时任务处理的,只是它的下一处理时间存的是数据库。redisson的话存redis上。
使用redis的订阅功能,订阅key过期事件,每5分钟查询一次,把5分钟内需要提醒的任务id作为key放到redis中,计算好过期时间
这不适合做Runnable或者Thread,完全就是一个Timer,用户设置时间的时候,生成Timer,到期自动提醒,提醒结束自动关闭。