论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
物联网
›
物联网
›
【Kafka】Kafka生产者怎样实现冥等的?
【Kafka】Kafka生产者怎样实现冥等的?
农民
论坛元老
|
2025-3-28 10:23:06
|
显示全部楼层
|
阅读模式
楼主
主题
1581
|
帖子
1581
|
积分
4743
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
Kafka的生产者在发送数据到broker,如果broker在收到消息后瓦解或者断开连接,导致生产者没有接收到成功响应,这时会触发重试机制,这种场景下回导致消息的重复。
冥等性
如果一个操纵被执行多次,结果与执行一次相同,那么这个操纵就是冥等的。
冥等生产者
冥等生产者的工作原理
启用了冥等生产者,那么每条消息都将包含
生产者的ID(PID)和序列号
。信息将与
目标的topic和分区
组合在一起,用于唯一表示一条消息。
broker收到了之前已经收到的消息,那么将拒绝接收该消息,并且返回错误信息。生产者记录该错误,反应在指标中,但是不抛出异常,也不触发告警。
生产者故障时冥等是怎样的?
生产者重启
:当一个生产者发生故障时,我们通常会创建新的生产者来代替他——手动重启或者自动拉起等,这是生产者在连接borker时会生成生产者ID,每次初始化时,都会产生一个新的id,这意味着如果一个生产者发生故障后,重启后的生产者发送了一条旧生产者已经发送过的数据,那么broker无法检测到重复。
broker发生故障
:当一个broker发生故障,控制器将会为首领副本在该broker上的分区重新推选首领。
每次生成新消息时,首领副本会用最后5个序列号更新内存中生产者状态,跟随者副本在复制消息时,会将该信息更新到自己的内存,以是当跟随者成为新首领时,已经有了最新的序列号来验证新消息的生成。
broker发生瓦解,但是没有更新最后一个快照时,由于生产者ID和序列号也是Kafak消息格式的一部分,在进行故障恢复时,通过旧快照+分区最新日志,可以恢复生产者的状态,等故障恢复完成之后,一个新的快照就生存好了。
不彻底的首领推选
:broker期望接收
消息2
后面就跟随的
消息3
,但是接收到了
消息27
,这时broker会抛出“乱序”的错误,如果利用了不带
事务
的冥等生产者,这个错误可能会被忽略。该场景下 有可能消息3-消息26发生了丢失,必要检查是否发生了
不彻底的首领推选
。
冥等生产者的局限性
仅能防止由生产者内部重试逻辑引起的消息重复。
不能防止代码中重复发送逻辑,由于这种对于kafka来说是两个消息
利用过程中发起利用生产者内置的重试机制,而不是在应用程序中自行进行重试。
利用冥等生产者
enable.idempotence:生产者设置设置该值为true,在acks=all的设置下,性能基本不会有差异
transactional.id:可选参数,重要用于事务
启用冥等性后生产者的变化
生产者启动时会额外调用一个API来获取生产者ID
每个消息批次中第一条消息包含生产者ID和序列号(批次中其他消息基于第一条消息递增)
broker会验证每一个生产者实例的序列号,包管没有重复消息
每个分区的消息顺序都将得到包管。
总结
通过启用Kafka的冥等生产者,可以包管每条消息在分区中仅被写入一次,即使触发了生产者重试机制也不会导致消息重复。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
农民
论坛元老
这个人很懒什么都没写!
楼主热帖
数据库入门
肝了五万字把SQL数据库从基础到高级所 ...
java反射大白话
iOS WebRTC 点对点实时音视频流程介绍 ...
Java中set集合简介说明
【R语言数据科学】(十二):有趣的概 ...
每日算法之数组中的逆序对
CentOS 7.9 安装 rocketmq-4.9.2
消息队列常见的使用场景
flume基本安装与使用
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
IOS
开源技术
云原生
SQL-Server
快速回复
返回顶部
返回列表