什么情况下会消息丢失?如何保证消息的可靠性?
这里以 RocketMQ 来说明,从三个角度来看
先献上一张图,网上找的,侵删
一. 生产者
描述:生产者因为网络原因发送时丢失,
解决办法:
- 发送失败重试,生产者发送失败换broker和queue,这是MQ自己帮我们做的,不需要自己编写代码处理
- 通过MQ自带事务来编码处理,但是性能会有所下降。具体思想类似两阶段提交:
如下图所示
二. broker
描述:broker自己存储消息数据失败而丢失,或者MQ磁盘损坏但没有副本
解决办法:
- 刷盘方式采用同步刷盘,即消息存储成功后才告诉生产者发送成功
- 采用集群部署,如多Master多Slave同步模式
三. 消费者
描述:消费者消费消息后,还没处理完,就返回消费成功,但是突然消费者挂了,实际消息没有消费但是MQ以为消费了,即消息丢失
解决办法:
- 使用同步消费,即消费处理完成后才返回结果
四、总结
只要愿意去做,通过修改参数,RocketMQ可以做到消息零丢失,但是性能和吞吐量会有大幅度下降。其他MQ如kafka也是如此。
我们需要根据具体的业务场景来判断是否需要加事务、同步发送、同步消费等。
比较核心的业务通常需要保证消息零丢失,除了通过MQ来做,也可以使用一些定时器去补偿,从而避免数据错误,导致用户利益损失。
像一些场景是允许少量数据丢失的,对MQ的吞吐量要求较高,比如日志采集。
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏