prodcer同步发送的机制虽然能保证消息不丢失,但是不推荐生产环境使用,性能很差。
一般都是采用异步方式发送消息,把消息先放入缓冲区,然后再由IO线程推送出去,存在消息丢失的风险,而且可能发生乱序。
下面给出Kafka无消息丢失的配置:
Producer端配置
- block.on.buffer.full = true
0.9版本后已经废弃,改用max.block.ms代替,推荐用户显示设置为true,使得缓冲期填满时,producer处于阻塞状态并停止接收新的消息而不是抛出异常。 - acks = all
保证消息写入所有ISR集合,才能确认提交确认成功 - retries = Integer.MAX_VALUE
开启无限重试,当前producer只会重试那些可恢复的异常情况,所以放心的设置为一个较大的值 - max.in.flight.requests.per.connection=1
主要防止topic同分区下的消息乱序问题,这个参数实际上限制了producer在单个broker连接上能够发送的未响应请求的数量。 - 使用带有回调机制的send
- Callback逻辑中显示关闭producer,显示调用kafkaProducer.close(0);
Broker端的配置
- unclean.leader.election.enable = false
关闭unclean选举,不允许非ISR的副本被选举为Leader,从而避免broker端因日志水位截断造成的消息丢失 - replication.factor >=3
参考了Hadoop以及业界的三备份原则 - min.insync.replicas > 1
用于控制某条消息至少被写入ISR中多少个副本才算成功。设置大于1 - 确保replication.factor > min.insync.replicas
若两者相等,那么只要一个副本挂掉,分区就无法工作。推荐replication.factor = min.insync.replicas + 1
原文地址:https://www.cnblogs.com/fubinhnust/p/11967907.html
时间: 2024-11-08 09:57:04