RocketMQ如果丢消息了,可能的原因是什么
发送端
用了单向发送RocketMQ 提供了一种发送方只负责发送消息,不等待服务端返回响应且没有回调函数触发,即只发送请求不等待应答的发送方式,叫做单向发送。
producer.sendOneway(msg); |
用了这种发送方式,是非常有可能发送不成功,导致消息丢失
未处理发送失败的情况
如果使用了同步发送或者异步发送,但是没有处理好异常的情况,没有进行合理的重试,那么也会导致消息丢失
同步
try { |
异步
// 异步发送消息, 发送结果通过callback返回给客户端。 |
发送过程中,Producer挂了
这种情况也有可能出现,就是消息正准备发呢,但是没等发出去,应用就挂了,那么消息也可能会丢了
Broker端
Broker挂了(不常见)
最常见的就是Broker挂了的情况,还没来及做消息的持久化以及同步,他挂了,那么消息就可能会丢了
leader 还没同步给 follower,就挂了(不常见)
如果在 acks=1这种情况下,但 leader broker 在follower还没同步完成之前就挂了,那么数据就丢了。
未开启主从同步或者没有集群部署,leader挂了(不常见)
这种也是有可能的,就只有一个leader在抗,挂了就完蛋了。
消费一直不成功
RocketMQ的消息默认保存72小时,在消息过期前,消费者一直没有消费成功,到期后消息会被删除。这种情况也可能会导致消息丢失。
消费者端
没处理成功就自动提交了offset
如果代码里 try-catch 后忽略了异常,或者消费失败后,仍然返回 CONSUME_SUCCESS,那消息就不会再投递,这就等同于丢失了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CYK's Blog!
评论
