Kafka 保证消息不丢失:只对已提交的消息 (committed message) 做有限度的持久化保证
Kafka Producer 是异步发送消息的 ,调用 producer.send(msg)
,会立即返回,就无法知道消息是否发送成功
消息发送不成功的原因:
解决方法:Producer 用 producer.send(msg, callback)
有回调通知的发送 API
Consumer 端的位移:
Consumer 的对位移的消息丢失解决:
Consumer 用多个线程异步处理消息,并自动更新位移
min.insync.replicas
目的 :下限的限制min.insync.replicas
Producer | producer.send(msg, callback) | 用带回调通知的 send 方法 |
---|---|---|
acks = all | all:所有副本 Broker 都接收到消息,才认为已提交 | |
retries > 0 | 自动重试消息发送,避免消息丢失 | |
Broker | unclean.leader.election.enable = false | 不允许落后 Leader的Broker,成为新Leader |
replication.factor >= 3 | 消息多副本 | |
min.insync.replicas > 1 | 消息至少要写入 n 个副本才是已提交 | |
replication.factor = min.insync.replicas + 1 | 防止一个副本挂了,整个分区就无法正常工作 | |
Consumer | enable.auto.commit = false | 手动提交位移 |