理论上无论什么组件都会有数据丢失和重复;我们只能从 源头和出口来解决数据的质量。
基本保证
broker可靠性
- 副本系数:replication.factor = 3
- ⼀般设为3,为了更高的安全性,可以设为5,同时考虑副本的分布
- 不完全的选举:unclean.leader.election.enable = true/false
- 允许不同步的副本成为首领:可用性和一致性之间权衡
- 最少同步副本:min.insync.replicas = 2
- 同步副本小于min.insync.replicas,会阻止生产者继续写入消息 NotEnoughReplicasException
生产者可靠性
- 发送确认:acks = 0/1/all
- 0 代表生产者能够通过网络把消息发送出去
- 1 代表首领副本已经收到消息并把它写入到分区文件
- ALL 代表所有副本都收到消息
- 失败重试:retries = 3
- 可用于解决可重试的错误:如LEADER_NOT_AVAILABLE、网络异常等
- 额外的异常处理:无法通过自动重试解决的问题
- 可用于解决不可重试的错误:如消息大小错误、认证错误、序列化错误,或者重试达到上限
消费者可靠性
- group.id = <集群内唯一>
- 不同的消费者配置不同的group.id,确保各自能消费topic的全量数据
- auto.offset.reset = earliest / latest
- 在没有偏移量提交时或请求的偏移量在broker上不存在时,启用此配置
- enable.auto.commit = true
- auto.commit.interval.ms = 300000
- 自动提交的频度,默认值是每5秒钟一次