本文共 713 字,大约阅读时间需要 2 分钟。
数据不丢失
1)从生产端:acks = -1,(ack应答机制)从生产端到节点端,当所有isr集合里的节点备份完毕后返回成功;
2)从节点端:每个partition至少需要一个isr节点(同步)存活保证数据安全
3)从消费端:关闭自动提交,使用手动提交。
数据不重复消费
1)生产端
生产者幂等性实现:PID和Sequence Number
为了实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。 PID:每个新的Producer在初始化的时候会被分配一个唯一的PID,这个PID对用户是 不可见的。
Sequence Numbler:(对于每个PID,该Producer发送数据的每个 都对应一个从0开始单调递增的Sequence Number。
Broker端在缓存中保存了这seq number,对于接收的每条消息,如果其序号大于Broker 缓存中序号则接受它,否则将其丢弃。这样就可以避免消息重复提交了。
但是,只能保证单个Producer对于同一个的Exactly Once语义。不能保证同一个Producer一个topic不同的partion幂等。
2)消费端
消费者幂等处理:
1.将消息的offset存在消费者应用中或者第三方存储的地方
可以将这个数据存放在redis或者是内存中,消费消息时,如果有这条数据的话,就不会去做后续操作
2.数据落库的时候,根据主键去过滤
在落库时,如果不不在这条数据,则去新增,如果存在则去修改
如果不能幂等处理,则将consumer的提交方式设置为同步提交,是最大程度地保证一致性的方法,缺点是性能会降低很多。
转载地址:http://ftowx.baihongyu.com/