消息丢失的产生原因
- 生产端丢失: 网络故障,发送消息失败
- 服务器端丢失: 消息持久化执之前,服务器宕机
- 消费端丢失:消息处理完成前,服务异常,自动提交offset
避免消息丢失从哪方面进行防御?
- 生产者producer端
- 服务器broker端
- 消费者consumer端
生产者producer端如何保证消息不丢失?
Rabbitmq:
- rabbitmq有两个Callback函数,分别是【生产者–>Exchange】【Exchange–>队列】,通过回调函数来保证消息投递到交换机与队列中
- 确保消息发送成功后,并成功刷到磁盘保存,则可以确保不丢失
Kafka:
- 通过ACK机制: ACK = 0 ,1, all
ack = 0 : 只要消息发送成功,则返回成功
ack = 1 : 消息发送成功,并且Leader成功落盘,则返回成功
ack = 2 : 消息发送成功,并且Leader 与 Follow同时成功落盘,则返回成功
Kafka 与 Rabbitmq都需要做的:
- 做好消息发送日志,记录关键字段,【投递时间, 投递状态, 重试次数, 请求体, 响应体】等。
服务器broker端如何保证消息不丢失?
- 做集群处理,确保某个服务器宕机不会影响
- 做异地容灾,同城容灾,两地三中心等
- 同步双写, 异步刷盘。
同步双写 = 即master 与 slave都已经同步到内存,然后返回成功。
异步刷盘 = 所有节点落盘是异步的,当然如果为了绝对安全,可以同步刷盘,但会损失性能
消费者consumer端如何保证消息不丢失?
- 做好日志采集,方便日后排查
- 通过ACK机制,kafka与rabbitmq都是通过ack机制的