外观
Kafka 如何保证消息的的不丢失
生产者端
- 设置
acks
参数:acks
参数决定了生产者在收到 Broker 的确认响应后才认为消息发送成功。acks=0
:不等待任何确认,消息可能丢失。acks=1
:仅等待Leader
副本写入成功,但可能在Leader
副本故障时丢失。acks=all
(推荐):等待所有副本写入成功,确保消息不会丢失。
- 启用重试机制:通过设置
retries
参数,生产者可以在消息发送失败时自动重试。 - 幂等性和事务:
Kafka
提供幂等性(Idempotence
)和事务(Transaction
)机制,确保消息在发送过程中不会重复或丢失。
Broker
端
- 副本机制:
Kafka
通过副本机制(Replication
)来保证数据的可靠性。每个分区有多个副本(Leader
和Follower
),Leader
负责读写,Follower
负责同步。 ISR
和Leader
选举:ISR
(In-Sync Replicas
)是与Leader
同步的副本集合。当Leader
副本故障时,Kafka
会从ISR
中选举新的Leader
,确保数据的完整性和一致性。- 刷盘机制:
Kafka
使用异步刷盘机制,将消息先写入PageCache
,然后由操作系统异步刷盘。虽然这种方式可能在 Broker 宕机时丢失数据,但通过副本机制可以弥补这一缺陷。 - 配置参数:
replication.factor
:副本数量,建议设置为3
或更高。min.insync.replicas
:消息至少写入的副本数量。unclean.leader.election.enable=false
:防止非ISR
中的副本被选举为Leader
。
消费者端
- 手动提交偏移量:消费者可以通过手动提交偏移量(
auto.commit=false
),确保在消息处理成功后再提交,避免消息丢失。 - 幂等性处理:在消费逻辑中,确保消息处理的幂等性,防止重复消费。
- 幂等性处理:在消费逻辑中,确保消息处理的幂等性,防止重复消费。