如何确保消息不会丢失?
检测消息丢失的方法
- 我们可以利用消息队列的有序性来验证是否有消息丢失。
- 在 Producer 端,我们给每个发出的消息附加一个连续递增的序号,然后在 Consumer 端来检查这个序号的连续性。
- 如果没有消息丢失,Consumer 收到消息的序号必然是连续递增的,或者说收到的消息,其中的序号必然是上一条消息的序号 +1。
- 如果检测到序号不连续,那就是丢消息了。
- 还可以通过缺失的序号来确定丢失的是哪条消息,方便进一步排查原因。
- 如果 IT 基础设施比较完善,一般都有分布式链路追踪系统,使用类似的追踪系统可以很方便地追踪每一条消息。
确保消息可靠传递
-
一条消息从生产到消费完成这个过程,可以划分三个阶段:
- 生产阶段
- 在这个阶段,从消息在 Producer 创建出来,经过网络传输发送到 Broker 端。
- 你在编写发送消息代码时,需要注意,正确处理返回值或者捕获异常,就可以保证这个阶段的消息不会丢失。
- 同步发送时,只要注意捕获异常即可。
- 异步发送时,则需要在回调方法里进行检查。
- 存储阶段
- 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被复制到其他的副本上。
- 如果对消息的可靠性要求非常高,可以通过配置 Broker 参数来避免因为宕机丢消息。
- 对于单个节点的 Broker,需要配置 Broker 参数,在收到消息后,将消息写入磁盘后再给 Producer 返回确认响应。
- 如果是 Broker 是由多个节点组成的集群,需要将 Broker 集群配置成:至少将消息发送到 2 个以上的节点,再给客户端回复发送确认响应。
- 消费阶段
- 在这个阶段,Consumer 从 Broker 上拉取消息,经过网络传输发送到 Consumer 上。
- 不要在收到消息后就立即发送消费确认,而是应该在执行完所有消费业务逻辑之后,再发送消费确认。
- 生产阶段