Kafka 学习(三)kafka 生产者幂等性

简介

幂等性:执行多次操作与执行一次操作的影响一致

kafka 生产者幂等性

kafka 生产者生产消息到 partition
如果直接发送消息,kafka 会将消息保存到分区中,但 kafka 会返回一个ACK 给生产者,标识当前操作是否成功,是否已经保存了这条消息。
如果 ACK 响应失败,生产者会重试,继续发送未发送成功的消息,kafka 又会保存一条一模一样的问题

配置幂等性

props.put("enable.idempotence", true);

幂等性原理

kafka 有一个 Producer ID 和 Sequence Number 的概念

  • PID:每个生产者 Producer 在初始化时,会分配一个唯一的 PID,这个 PID 对用户来说是透明的
  • Sequence Number:针对每个生产者发送到指定主题分区的消息都对应一个开始递增的 Sequence Number

步骤:

  1. kafka 发送消息携带 PID 和 Sequence Number 发送
  2. kafka 收到消息,一并保存下来。
  3. ACK 响应失败后,生产者重试,再次发送消息,根据 pid、 Sequence Number 判断是否需要再保存一条消息
  4. 判断条件:生产者发送的 Sequence Number 是否小于等于 partition 中消息对应的 sequence Number
  5. 成功保存消息,当前发送的 sequence Number = 0,spid 对应的 sequence 不保存消息
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Kafka生产者是一种可以保证消息只被发送一次的生产者Kafka生产者可以避免由于生产者重试机制导致的重复消息和由于网络问题导致的消息丢失等问题,提高了Kafka的可靠和稳定Kafka生产者主要通过以下两个机制来实现: 1. 序列号:每个消息都有一个唯一的序列号,序列号由生产者自动生成。生产者在发送消息时,会将消息的序列号和其他元数据一起发送到Kafka broker。Kafka broker会根据序列号来判断消息是否重复,并保证重复消息不会被写入到Kafka的日志中。 2. 重试缓存:如果生产者在发送消息时发生错误,会进行重试。Kafka生产者会将需要重试的消息缓存到重试缓存中,并在下一次重试时将缓存中的消息重新发送。由于消息具有唯一的序列号,重试缓存可以避免重复发送相同的消息。 Kafka生产者在保证消息只被发送一次的同时,也需要注意以下几点: 1. 序列号的唯一:为了保证序列号的唯一生产者需要为每个消息生成唯一的序列号。可以使用时间戳、UUID等方式来生成序列号。 2. 序列号的连续:为了保证序列号的连续生产者需要在发送消息之前查询数据库或者使用缓存等方式来获取上一条消息的序列号。可以使用AtomicLong等数据结构来保证序列号的连续。 3. 能影响:由于需要对每条消息进行序列化和添加序列号等操作,Kafka生产者能会受到一定的影响。因此,在使用Kafka生产者时,需要根据具体的应用场景和需求来权衡可靠能的平衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起来搬砖呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值