上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟Java DelayQueue是占用内存的。针对现用方案的不足,于是利用Redis的Sorted Set数据结构简单实现分布式延迟队列。
根据queueName分别创建中转队列(Sorted Set)和 目标队列key值,其中queueSize是中转队列的大小。
根据延迟消息的hash值,平均分配到不同的中转队列(Sorted Set)中去。
通过分布式锁来锁定唯一的线程来执行延迟消息迁移到目标队列的操作。遍历全部的中转队列,因为延迟消息是和延迟时间戳关联的,使用ZRANGEBYSCORE命令,取出延迟时间小于当前时间的50条消息并通过LPUSH命令放入目标队列里。
通过RPOP命令不断的从目标队列获取延迟消息,执行相应的消费逻辑。
本文描述的实现方案还有诸多异常情况尚未考虑,比如生产者发送失败、消费者消费失败的情况,无法保证极端情况下生产者和消费者两端的数据一致性。该方案可以满足业务量不是很大、延迟时间较长、允许部分数据可能丢失的场景,比如用户签到提醒,可以根据用户签到的时间,第二天在相应的时间点推送消息提醒用户继续签到。
原文:https://www.cnblogs.com/hujunzheng/p/13767887.html