谈谈 Kafka 的幂等性 Producer
使用消息队列,我们肯定希望不丢消息,也就是消息队列组件,需要保证消息的可靠交付。消息交付的可靠性保障,有以下三种承诺:
- 最多一次(at most once):消息可能会丢失,但绝不会被重复发送。
- 至少一次(at least once):消息不会丢失,但有可能被重复发送。
- 精确一次(exactly once):消息不会丢失,也不会被重复发送。
默认是一般是 至少一次,也就是 Broker 收到并成功提交消息,并且 Producer 成功应答才会认为消息已经发送。
某些情况下,比如网络波动等,导致应答没有成功送达,会导致 Producer 重试,从而导致消息的重复发送。
这就要提到主角——幂等性 Producer 了。
幂等性,比如数学中的乘法运算,乘以 1 就是一个幂等操作。因为不管执行多少次乘法,结果都是一样的。
幂等性 Producer 就是在向 Broker 发送数据时,可以避免同个分区下的消息重复。
开启方式仅需指定 enable.idempotence 为 true!
但是!
有个很重要的一点,它针对的是单个分区下的幂等,而且是单个会话内的幂等,也就是说,如果进程重启,就没办法保证幂等性了。
而幂等性的实现原理,就得提到 ProducerID 和 SequenceNumber 了。
- ProducerID:Producer 初始化会被分配一个唯一标识,对客户端无感知,重启会发生变化;
- SequenceNumber:对于每个主题和分区,都对应一个从 0 开始单调递增的 SequenceNumber 值,Broker 也会存储。
判断重复的逻辑,原理就很简单了:
通过 ProducerID 和 SequenceNumber,去 Broker 查询队列 ProducerStateEntry.Queue(默认队列长度为 5)是否存在:
- 如果 Producer SequenceNumber == Broker SequenceNumber + 1,接收消息;
- 如果 Producer SequenceNumber == 0 && Broker SequenceNumber == MaxInt,接收消息(刚初始化);
- 否则,就是重复了,拒绝接收。
由此看出,ProducerID 和 SequenceNumber 可以避免消息的重复发送,也避免消息乱序(因为 SequenceNumber 单调递增)。
做到幂等性,也就意味着可以安全重试任何操作。从而做到了消息的可靠传输。
然而,还有个很重要的一点,就是上面说的,上面讲的都是分区下的幂等,多个分区的幂等性,需要通过 事务 来解决。
限于篇幅,今天先记录到这里,事务的待我好好研究下再写哈哈!最后,祝大家新年快乐!
文章来源于本人博客,发布于 2023-01-01,原文链接:https://imlht.com/archives/414/
谈谈 Kafka 的幂等性 Producer的更多相关文章
- Kafka设计解析(二十一)关于Kafka幂等producer的讨论
转载自 huxihx,原文链接 关于Kafka幂等producer的讨论 众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS) ...
- apache kafka系列之Producer处理逻辑
最近研究producer的负载均衡策略,,,,我在librdkafka里边用代码实现了partition 值的轮询方法,,,但是在现场验证时,他的负载均衡不起作用,,,所以来找找原因: 下文是一篇描 ...
- Kafka 0.8 Producer处理逻辑
Kafka Producer产生数据发送给Kafka Server,具体的分发逻辑及负载均衡逻辑,全部由producer维护. 1.Kafka Producer默认调用逻辑 1.1 默认Partiti ...
- Kafka 0.8 Producer (0.9以前版本适用)
Kafka旧版本producer由scala编写,0.9以后已经废除,但是很多公司还在使用0.9以前的版本,所以总结如下: 要注意包Producer是 kafka.javaapi.producer.P ...
- 关于Kafka幂等producer的讨论
众所周知,Kafka 0.11.0.0版本正式支持精确一次处理语义(exactly once semantics,下称EOS).Kafka的EOS主要体现在3个方面: 幂等producer:保证发送单 ...
- Kafka 之 async producer (2) kafka.producer.async.DefaultEventHandler
上次留下来的问题 如果消息是发给很多不同的topic的, async producer如何在按batch发送的同时区分topic的 它是如何用key来做partition的? 是如何实现对消息成批量的 ...
- Kafka 之 async producer (1)
问题 很多条消息是怎么打包在一起的? 如果消息是发给很多不同的topic的, async producer如何在按batch发送的同时区分topic的 它是如何用key来做partition的? 是如 ...
- Kafka 0.10 Producer网络流程简述
1.Producer 网络请求 1.1 Producer Client角度 KafkaProducer主要靠Sender来发送数据给Broker. Sender: 该线程handles the sen ...
- springboot kafka集成(实现producer和consumer)
本文介绍如何在springboot项目中集成kafka收发message. 1.先解决依赖 springboot相关的依赖我们就不提了,和kafka相关的只依赖一个spring-kafka集成包 &l ...
- Apache Kafka - KIP-42: Add Producer and Consumer Interceptors
kafka 0.10.0.0 released Interceptors的概念应该来自flume 参考,http://blog.csdn.net/xiao_jun_0820/article/det ...
随机推荐
- Mastering Regular Expressions(精通正则表达式) 阅读笔记:前言
General Concept(一般概念) If you master the general concept of regular expressions, it's a short step to ...
- selenium配置远程测试环境
开头 因为测试的时候需要不断打开浏览器,这样效率感觉不高,于是想着能不能开启一个浏览器,然后通过代码直接链接来调试就好了. 前提 要先安装好selenium 和 会查看配置自己的google版本和路径 ...
- vue全家桶进阶之路7:Vue的第一个程序
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- cv学习总结(11.21-11.27)
本周彻底完成了CNN的全部内容,包括CNN的原理,代码实现等.CNN是一种神经网络的framework,跟connected_layer相比,更加侧重于能够保持原来的空间结构不变:我们输入的图片是一个 ...
- python学习之一 OS 文件夹的操作和文件操作
# OS模块 :查看一个文件夹下所有文件,这个文件夹有文件夹,不能用walk# -- coding: UTF-8 --import osimport sys#C:\Users\Administrato ...
- OSPF 多区域配置实验
实验拓扑 实验需求 按照图示配置 IP 地址和loopback 接口 按照图示分区域配置 OSPF ,实现全网互通 为了路由结构稳定,要求路由器使用环回口作为 Router-id 在AR3上配置静默接 ...
- Apikit 自学日记:如何安装 Apikit
肯定会有和我一样的小白,第一次听说 Apikit这个工具,那么我今天和大家一起学习下这个工具如何安装. Apikit 有三种客户端,你可以依据自己的情况选择.三种客户端的数据是共用的,因此你可以随时切 ...
- NameError: name 'List' is not defined
当在python出现该问题是,使用from typing import List.
- WPF 入门笔记 - 05 - 依赖属性
如果预计中的不幸没有发生的话,我们就会收获意外的喜悦. --人生的智慧 - 叔本华 WPF属性系统 这一部分是中途加的,直接依赖属性有点迷糊,正好有了绑定的基础,理解起来还一些. WPF提供一组服务, ...
- 迟来的秋招面经,17家公司,Java岗位
一位朋友秋招面试了17家公司(都是中小公司或者银行),Java 后端岗.下面是他的个人情况.求职经验已经这17家公司的面经. 个人情况和求职经验 其实现在是挺后悔大学没有好好的学习的,因为基本上都会提 ...