消息队列三大问题
如何确保消息不丢失
如何知道有消息丢失?
-
消息检测
- 消息生产端给每个消息指定全局唯一id
或者附加一个连续递增的版本号,然后再消费端做对应的版本校验
- 消息生产端给每个消息指定全局唯一id
-
全局唯一 ID 生成的实现方法
-
数据库自增
- 递增,不会重复,但是数据库宕机不可用
-
UUID
- 无序,极低概率重复,一直可用
-
Redis
- RDB持久化模式下,会出现重复,Redis宕机不可用
-
Snowkflake(推荐)
- 递增,不会重复,存在时钟回拨问题
-
哪些环节可能丢消息?
-
消息存储阶段
- confirm确认模式
-
消息消费阶段
- ack确认机制
如何确保消息不丢失?
- 利用拦截器机制将消息版本号注入消息中。再通过拦截器检测版本号的连续性或消费状态,这样实现的好处是消息检测的代码不会侵入到业务代码中,可以通过单独的任务来定位丢失的消息,做进一步的排查