Kafka生产常见问题分析与总结
作者:mmseoamin日期:2024-04-27
Kafka生产常见问题分析与总结
消息丢失
- 生产者
- acks = 0
- 不需要等待任何Broker确认收到消息的回复就可以继续发消息
- 性能最高,但是最容易丢消息,对于数据丢失不敏感的场景可以使用,如大数据统计报表
- acks = 1
- 只要等待Broker中的leader成功写入数据成功就可以继续发消息
- 如果follower没有成功备份数据而此时leader刚好挂了,就会丢消息
- acks = -1 或 all
- 等待Broker中的leader、follower都写入成功才可以继续发消息
- 只要保证有一个副本存活就不会丢消息,一般使用在金融场景,当然如果配置副本只有一个也可能会丢消息跟acks=1情况类似
- 消费者
- 如果消费者配置的是自动提交,恰好此时消费服务挂了,没有处理完的所有数据,这样就导致了数据丢失,下次也消费不到了
重复消费
- 生产者
- 发送消息如果配置了重试机制,比如网络抖动时间过长导致发送端发送超时,实际Broker可能已经接受到消息,但发送方会重发消息
- 消费者
- 如果消费消息配置了自动提交,刚拉取了一批处理了一部分,但是尚未提交,服务挂了,下次重启时又会拉取到相同的一批数据重复处理,一般情况下消费端会进行幂等性处理
消费乱序
- 如果发送端配置重试机制,Kafka不会等之前那条消息完全发送成功才去发送下一条消息,这样可能会出现发送了1、2、3三条消息,第1条消息超时了,后面2条消息发送成功,然后再重试发送第1条消息,这时Broker端分区存入的消息顺序为2、3、1,所以是否需要配置重试机制得根据业务去定,当然也可以用同步发送的模式去发送并且acks≠0,这样也能保证消息从发送到消费是全链路有序的
- 发送端的消息发送模式
- 发后即忘
- 不关心消息是否成功到达,对返回结果不做任何判断处理,这种方式注重吞吐量,但是无法保证消息的可靠性
- 同步
- 消息发送出去之后,关心消费端是否成功接受,只有成功了才能继续下一条
- 异步
- 在发送消息的同时通过指定的回调函数去进行消费端的响应处理
- 注意: Kafka保证全链路消息顺序消费需要从生产端开始
- 方案一: 将所有有序消息发送到同一个分区,然后使用一个消费者去消费,但是这种性能较低
- 方案二: 可以在消费者端接受到消息后将需要保证顺序消费的几条消息发送到内存队列(可以整多个),一个内存队列安排一个线程去顺序处理
消息积压