发布网友 发布时间:9小时前
共1个回答
热心网友 时间:5小时前
消息丢失的场景
在Kafka中,如果Producer使用“发后即忘”的方式发送消息,消息将立即返回,但并不保证消息已成功发送。消息丢失主要由网络抖动或消息过大导致,过大消息在实际生产中遇到,通过在发送前将消息分包并依次发送解决问题。
解决方法是使用带有回调通知的发送方式,即producer.send(msg, callback)。回调方法可确认消息提交成功,消息发送失败时,可进行容错及补救,如重试或调整消息格式。
消费者丢失数据
消费者丢失数据主要发生在消息处理结束前宕机,消费者重启后从上次位移后的下一个位置开始消费,未处理完成的消息不会再次处理。解决方法是消息处理完成后手动提交位移,避免异常发生时丢失消息。
Broker端丢失数据
Broker端数据丢失原因包括:选举出落后Leader太多的Broker成为新Leader导致消息丢失;消息写入内存页缓存而非立即持久化至磁盘,Broker宕机后重启丢失消息;设置多副本机制避免此类问题。
避免消息丢失的实践
使用带有回调的发送方式,设置acks = all确保消息提交成功,设置retries以重试失败消息,禁止不清洁选举,设置复制因子和位移提交策略以防止消息丢失。
精确一次消费
Kafka默认提供消息至少一次的可靠性,消息可能重复发送。为确保消息消费为最多一次,禁止Producer重试,使用幂等性或事务性机制确保消息不重复发送。
幂等性确保消息重复发送时结果一致,通过PID和序列号实现消息去重。事务机制则保证消息原子性地写入多个分区,确保消息精确一次处理。
Kafka提供的精确一次消费手段包括幂等性Producer和事务性Producer,前者适用于单分区会话,后者适用于跨分区和会话的精确处理,但效率较低。