单线程 while(true) 监听 Redisson 延时队列有几个注意点
生产上线不要夹带私货, 私货往往没有经过完整的测试流程验证, 容易出问题
开发使用 Redisson 延时队列, 完成编码后, 自测没有问题, 在发版时以夹带私货的方式上线了, 在生产运行中出现消息消息无法消费的情况
原因是在线程方法体中有一些条件判断, 当消息不符合条件的时候, 会通过 return 阻断流程执行. 开发自测时模拟的数据有限, 且都没有走到阻断分支, 所以没有发现问题. 而生产上有一些数据会走到阻断流程, 执行 return 导致线程方法体退出死循环并执行结束, 最终导致线程终止, 无法再继续监听消息
Redisson (3.17.7) 延时队列 利用 Redis List 和 ZSet 以及 发布/订阅 功能实现, 整个过程会涉及到 3 个 Key
监听线程死循环 take 阻塞队列, 当延时队列中的消息到期, 会被转存到阻塞队列共监听线程消费, 如果一定时间内未消费, 则会创建普通队列, 并把消息转存进去, 待监听线程重新上线, 先读取普通队列内的消息, 读取完后会删除普通队列, 再阻塞读取阻塞队列内的消息