使用Kafka时,在消息的收发过程中都有可能会出现消息丢失。
一、生产者发送消息到broker过程中丢失
1. 设置异步发送
- 同步发送:会产生阻塞,一般使用异步发送。
- 异步发送:实现回调方法,消息发送失败时记录日志,或者重新发送,最终确保消息能够成功发送。
2. 设置消息重试机制
- 由于网络抖动问题,很快就会恢复正常,造成的消息丢失。
二、消息在broker中存储过程中丢失
Kafka中提供了一种发送确认机制,当生产者发送的消息到broker中,这些消息会存储在分区中。分区又分为leader和follower两种副本角色,其中,leader只有1个,follower可能有多个。分区收到消息后,首先保存到leader副本中,然后由leader副本把数据同步到follower副本中。
1. 发送确认机制acks
- acks=all:在所有的分区副本保存之后,才会发送确认,可以保证消息不丢失;这也是性能最低的一种。
- 在实际的生产环境中,最低也要设置acks=1,起码能让leader副本保存数据。
三、消费者从broker接收消息过程中丢失
一个Kafka集群是由多个broker(Kafka实例)组成,在每一个broker中存在不同的topic,且
1个topic可能存在多个分区(partition),分区也可能存在不同的broker中。
- 1个消费者组中可能存在多个消费者,它们都是消费同一个topic,每个消费者会去消费该topic下不同分区中消息。
- 每个分区都是按照偏移量(offset)来存储数据的,每个分区都是有顺序的、不可变的消息队列,且可以持续的添加消息。
- 分区中的消息都配备了一个序列号,称之为偏移量
- 同一个topic是由不同的消费者组去消费数据的,消费者去消费数据时也会按照偏移量去消费。
- 默认情况下,每个消费者每个5秒自动提交一次消费偏移量
- 如果消费者组出现重平衡情况,可能会重复消费或者消息丢失
- 重平衡:消费者组中某个消费者宕机,其负责消费的分区,交给组内其他消费者,重新分配消费分区过程中可能会出现重复消费或者消息丢失。
- 重复消费:某个消费者宕机时,当前消费偏移量是3,提交到Kafka的偏移量是1,导致重平衡后组内消费者重复消费某些数据。
- 消息丢失:某个消费者宕机时,当前消费偏移量是1,提交到Kafka的偏移量是3,导致重平衡后组内消费者重复消费某些数据。
1. 禁用自动提交偏移量,改为手动
导致这个原因就是消费者自动提交偏移量,提交的偏移量不准确,造成重复消费或者消息丢失。可以设置手动提交偏移量,消费多少就提交多少偏移量,如果宕机就不提交偏移量,这样偏移量就准确了。
- 同步提交:会阻塞
- 异步提交:如果消费失败,可能导致消费偏移量不准确
- 同步+异步组合提交:最佳方式
四、小结
五、模拟面试
- 由于网络抖动问题,很快就会恢复正常,造成的消息丢失。
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章