kafka如何保证数据的消息不丢失(最简洁)

一、kafka 本身配置层面

1.1、replication.factor 默认值1

创建kafka的topic时候,每个分区设置的副本数, 根据broker数量酌情设置, 建议业界通常做法设置为3

1.2、min.insync.replicas 默认值1

消息至少要被写入到min.insync.replicas这么多副本才算成功时候,通常使用小于replication.factor,当request.required.acks = all时生效

二、kafka的生产者层面

2.1、设置副本确认

request.required.acks 有3个取值,分别是0,1,all

0:表示无需等待broker确认就认为写入成功,风险大,一般不使用

1:表示当leader确认写入成功就认为成功了,有数据丢失风险,不建议使用

all:leader和follower都确认写入成功,才能认为是写入成功了,推荐使用(-1在新版本已弃用

2.2、设置重试次数

retries  默认值0,不重试。kafka返回写入消息失败,生产者进行重新发送,直到成功, 根据业务合理设置重试次数

 2.3、消息补偿机制

虽设置了重试次数,但不可能一直重试,如重试3次后仍然失败,这时候可把失败消息放入本地消息表,用定时任务轮询消息表, 重新生产推送到kafka

三、kafka的消费者层面

3.1 关闭自动 offset

设置 enable.auto.commit  = false , 默认值true,自动提交

3.2 手动提交offset

使用kafka的Consumer的类,用方法consumer.commitSync()提交

或者使用spring-kafka的 Acknowledgment类,用方法ack.acknowledge()提交(推荐使用)

你可能感兴趣的:(MQ,Kafka)