RabbitMQ和Kafka零消息丢失解决方案

rabbitmq丢失数据的情况:

1、生产者端:消息因为网络问题丢失或者发送到rabbitmq时出错了。

2、rabbitmq服务端:未做持久化。

3、消费者端:打开了autoAck,在未完成消费之前就自动回复了。

 

rabbitmq丢失数据的解决:

1、生产者端:通过confirm模式异步确认消息发送成功,在失败后的回调函数中处理失败的逻辑。

2、服务端:打开持久化机制。这里涉及到两个参数,一个是建立queue的时候,持久化那个queue。另外一个是生产者发送消息的时候,把deliveryMode设置为2,让MQ把这条数据也给持久化。但是尽管如此,如果在极端情况下,在rabbitmq中内存写成功,但是还没来及持久化时,rabbitmq宕机,这部分在内存里面的数据也会丢失,不过几率很小。

3、消费者端:去掉autoAck,在自己完成逻辑后手动提交ack。

 

kafka出现数据丢失的情况:

1、生产者端:和rabbitmq类似,如果没能确认写成功,也没有重发那么也会丢失。

2、服务端:如果未来得及和从节点同步数据就宕机了,那么这部分数据就会丢失。

3、消费者端:和rabbitmq类似,如果自动提交offset依旧会出现丢失。

 

kafka出现数据丢失的解决:

1、生产者端:设置参数,要求每个从节点都写成功后才任务成功,另外如果发送失败,重试次数设置一个很大的值。

2、服务端:设置参数,要求从节点起码大于1,且至少有一个能被感知到。

3、消费者端:取消掉自动回复。 不过,强一致的保证消息不丢失,必然会影响到吞吐量。

 

posted @ 2020-05-08 16:23  gaopengpy  阅读(500)  评论(0编辑  收藏  举报