博文目录
文章目录
- 结论
- 过程
- 流程
结论
单线程 while(true) 监听 Redisson 延时队列有几个注意点
- 死循环内必须加 try-catch 捕获 Throwable, 防止报错终止线程
- 明确线程方法体死循环内的 return 语句是否会导致方法体执行结束, 进而导致线程终止, 考虑是否需要以 continue 替代
生产上线不要夹带私货, 私货往往没有经过完整的测试流程验证, 容易出问题
过程
开发使用 Redisson 延时队列, 完成编码后, 自测没有问题, 在发版时以夹带私货的方式上线了, 在生产运行中出现消息消息无法消费的情况
原因是在线程方法体中有一些条件判断, 当消息不符合条件的时候, 会通过 return 阻断流程执行. 开发自测时模拟的数据有限, 且都没有走到阻断分支, 所以没有发现问题. 而生产上有一些数据会走到阻断流程, 执服务器托管网行 return 导致线程方法体退出死循环并执行结束, 最终导致线程终止, 无法再继续监听消息
流程
Redisson (3.17.7) 延时队列 利用 Redis List 和 ZSet 以及 发布/订阅 功能实现, 整个过程会涉及到 3 个 Key
- 阻塞队列: redisson_delay_queue:{test}, 是一个 List, 通过阻塞操作 take 读取数据
- 延时队列: redisson_delay_queue_timeout:{test}, 是一个 ZSet, 通过 offer 写入数据
- 普通队列, test, 是一个 List, 当消息积压时, 可能会把积压消息转存进来
监听线程死循环 take 阻塞队列, 当延时队列中的消息到期, 会被转存到阻塞队列共监听线服务器托管网程消费, 如果一定时间内未消费, 则会创建普通队列, 并把消息转存进去, 待监听线程重新上线, 先读取普通队列内的消息, 读取完后会删除普通队列, 再阻塞读取阻塞队列内的消息
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 学习Source Generators之输出生成的文件
上一篇文章学习了通过获取和解析swagger.json的内容,来生成API的请求响应类。 但是其中无法移动与编辑。 那么本文将介绍如何输出生成的文件。 EmitCompilerGeneratedFiles 在控制台程序中,的PropertyGroup添加tru…