保证消息不丢失
生产者端
- 设置ack = all 所有副本分都收到消息才行
- 使用回调通知api:producer.send(msg,callback);
- 设置retries(自动重试)为较大的值
消费者端
- 手动提交位移,消费完成后提交位移
Broker端
- 配置unclean.leader.election.enable = false(不允许同步不完全的Broker成为Leader)
- replication.factor >= 3 (消息多保存几份)
- min.insync.replicas > 1 (消息写入多少个副本才算已提交)
不重复消费
Producer
- 幂等Producer:设置enable.idempotence = ture (自动去重)只能保证单个分区上幂等。
- 事务Producer:
和幂等性 Producer 一样,开启 enable.idempotence = true。
设置 Producer 端参数 transactional. id。
producer.initTransactions();
消费者端,设置 isolation.level 参数的值
read_uncommitted read_committed
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}