kafka 生产者消费者设计思考

news/发布时间2024/5/15 15:31:10

生产者

负载均衡

生产者直接发送消息给分区leader,而不需要通过中间者进行转发。

这意味着生产者需要知道哪些服务器是存活的,以及主题分区leader在哪里的元数据请求。同时这也意味着生产者可以根据情况决定发给哪个broker,那么既可以随机负载,也可以进行散列

批量发送

生产者会尝试收集数据,然后在单次请求中发送大量数据,以牺牲少量额外延迟来换取更好的吞吐量。

消费者

push or pull?

kafka选择了pull。这是因为基于push的系统由broker控制着数据传输的速率,尽可能使消费者更快消费,但是如果消费者消费速度远低于生产速度,那这就成为一种拒绝服务攻击了。而消费者pull则能很好根据实际情况去pull消费,消费快就快pull,消费慢就慢pull

不过pull也会陷入轮询的陷阱。为了解决这种问题,kafka在pull request中设置参数使允许堵塞在长轮询中,直到数据到达

消费到哪里了?

确定消费到哪里了,并不是一个简单的问题。如果broker在发送消息后,立刻认为消息已经被消费了,那么在传输未到达等原因引发的消费未处理情况会使得这样的认为并不正确

如果采用消费者ack的模式,也就是消费者消费完成之后发送确定消息,那么如果消费者在发送ack的时候也失败了,这就会导致重复消费问题。此外,对每个消息进行状态维护也会对性能造成影响

为了避免这些问题,kafka将消息划分到有序的分区中,那么只要记录每个分区被每个消费者组消费数据即可。并且还可以支持回退到之前被消费的消息,以允许重复消费

那么kafka是如何解决重复消费的问题的呢?很可惜,kafka最多只能支撑生产者不发送重复的消息,如果是上述场景中消费者没有ack成功导致的重复消费,还是要进行额外幂等处理的

消息传递机制

  • 至多一次:消息可能会丢失,并永远不会重新传递
  • 至少一次:消息不会丢失,但可能被重新传递
  • 只有一次:每个消息仅传递一次,既不会丢失,也不会重复

kafka支持生产者若没有收到ack,能重新发送消息,这样能保证至少一次的传递机制。并且还添加了(0.11.0.0之后)幂等,也就保证重发不会出现重复条目。

此外还提供了一个“事务”,也就是支持发送消息到多个topic partitions的能力,要么都写入成功,要么都不成功

实现幂等的方法是为每个生产者分配id,并采用生产者发送的序列号去去重

从消费者角度来说,当消费者控制消息处理位置

  • 读取消息后,更新已处理,最后处理消息。

    这保证了至多一次。但如果消费者在消费失败后,反馈消费失败之前宕机,那么就会导致存在消息没有被消费

  • 读取消息后,处理消息,最后更新已处理。

    保证了至少一次。如果在消费成功之后宕机,那么将会重复收到已经处理过的消息

为了达成只有一次的情况,我们可以利用kafka事务功能,在事务被中止之后将消费者处理位置恢复到之前

Ref

  1. https://kafka.apache.org/documentation/#theproducer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.bcls.cn/eXHR/5353.shtml

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

第九届大数据与计算国际会议 (ICBDC 2024) 即将召开!

2024年第九届大数据与计算国际会议(ICBDC 2024)将于2024年5月24至26日在泰国曼谷举行。本次会议由朱拉隆功大学工程学院工业工程系主办。ICBDC 2024的宗旨是展示大数据和计算主题相关科学家的最新研究和成果,为来自不同地区的专家代表们提供一…

美创科技荣获“2023年网络安全国家标准优秀实践案例”

近日,全国网络安全标准化技术委员会正式公布2023年网络安全国家标准优秀实践案例获奖名单。 杭州美创科技股份有限公司(以下简称:美创科技)申报的“GB/T 20281-2020《信息安全技术 防火墙安全技术要求和测试评价方法》在政企领域数…

sql-labs32关宽字节注入

一、环境 网上有自己找很快 二、如何通关 2.1解释 虚假预编译没有参数绑定的过程,真实预编译有参数绑定的过程 宽字节注入出现的本质就是因为数据库的编码与代码的编码不同,导致用户可以通过输入精心构造的数据通过编码转换吞掉转义字符。 在32关中…

构建React TodoList应用:管理你的任务清单

构建React TodoList应用:管理你的任务清单 在日常生活和工作中,任务管理是一项至关重要的任务。为了更好地组织和管理我们的工作和生活,我们需要一个高效而简单的任务管理工具。本文将介绍如何使用React框架构建一个功能丰富的TodoList应用&…

C# CAD2016 cass10宗地Xdata数据写入

一、 查看cass10写入信息 C# Cad2016二次开发获取XData信息(二) 一共有81条数据 XData value: QHDM XData value: 121321 XData value: SOUTH XData value: 300000 XData value: 141121JC10720 XData value: 权利人 XData value: 0702 XData value: YB…

【前沿热点视觉算法】-面向显著目标检测的注意区域空间金字塔池网络

计算机视觉算法分享。问题或建议,请文章私信或者文章末尾扫码加微信留言。 1 论文题目 面向显著目标检测的注意区域空间金字塔池网络 2 论文摘要 显著目标检测(SOD)的最新进展主要依赖于空间空间金字塔池(ASPP)模块…

经典Go知识点总结

开篇推荐 来来来,老铁们,男人女人都需要的技术活 拿去不谢:远程调试,发布网站到公网演示,远程访问内网服务,游戏联机 推荐链接 1.无论sync.Mutex还是其衍生品都会提示不能复制,但是能够编译运行 加锁后复制变量,会将锁的状态也复制,所以 mu1 其实是已…

Linux运维-Web服务器的配置与管理(PHP)

Web服务器的配置与管理(PHP) 项目场景 某企业在CentOS上搭建Web服务系统,以PHP作为网页开发环境,以MySQL为后台数据库。 基础知识 PHP PHP原始为Personal Home Page的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”(超…

正则表达式

用于匹配字符串中字符组合的模式。在js中,正则表达式也是对象 使用场景: 输入框的输入限制等。 语法: 判断是否有符合规则的字符串: test()检测是否匹配 了解:exec() 匹配成功返回数组&…

【SQL注入】靶场SQLI DUMB SERIES-24通过二次注入重置用户密码

先使用已知信息admin/admin登录进去查下题,发现可以修改密码 猜测可能存在的SQL语句:UPDATE user SET password新密码 WHERE user用户名 and password旧密码 假设我们知道有个admin用户,但是不知道其密码,如何可以将其密码重置&…

【GPTs分享】GPTs分享之Write For Me

Write For Me 是一个专门定制的GPT版本,旨在为用户提供高质量的文本内容创作服务。它适用于各种写作需求,从商业计划、学术文章到创意故事等。下面是从简介、主要功能、使用案例、优点和局限性几个方面对Write For Me 的详细介绍。 简介 Write For Me …

图片转PDF

选择图片右键——打开方式 ——照片、画图、截图工具 其他的选择性尝试 点击打印 在刚刚保存的路径哪里即可得到刚刚保存的PDF版的图片

ES项目应用

配置: ES存储了2-3亿条,几百GB ES集群有5 个节点 2主2副 ES返回数据量窗口大小设置 index.max_result_window 深度翻页 1.from size 方式 2.scroll相当于维护了一份当前索引段的快照信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任…

C# OpenVINO PaddleSeg实时人像抠图PP-MattingV2

目录 效果 项目 代码 下载 C# OpenVINO 百度PaddleSeg实时人像抠图PP-MattingV2 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Security.Cryptography; using System.Text; us…

LaunchPad 市场的复苏,Penpad 成新兴生力军

以 Fair Launch 为主要启动方式的铭文市场的爆发,推动了 LaunchPad 市场的复苏,绝多数所铭文项目都能通过 Fairr Launch 的方式筹集资金实现启动,该赛道的爆发不仅推动了数百亿美元的热钱开始在链上不断涌动,同时也进一步形成了新…

1129 - Host ‘192.168.10.1‘ is blocked because of many connection errors;

当我们在使用springboot连接mysql,因为出现连接多次错误,会产生1129的报错; 首先我们刷新下hosts 发现有1064的报错,于是,我们找到mysqladmin的根路径下,执行刷新host操作 但我们找不到mysqladmin的根目录…

vue 动态渲染本地图片不显示的解决方法

代码更改前 <img class"img" :src"/assets/images/${syntheticalGrade}.png" />data(){return{syntheticalGrade:"1"} }效果图&#xff1a; 解决代码 <img class"img" :src"require(/assets/images/${syntheticalGrad…

在having、select子句中使用子查询

目录 在having子句中使用子查询 统计出部门平均工资高于公司平均工资的部门编号、平均工资、部门人数 在select子句中使用子查询 查询每个员工的编号、姓名、职位、部门名称 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 在havin…

力扣 187. 重复的DNA序列

1.题目 DNA序列 由一系列核苷酸组成&#xff0c;缩写为 A, C, G 和 T.。 例如&#xff0c;"ACGAATTCCG" 是一个 DNA序列 。 在研究 DNA 时&#xff0c;识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s &#xff0c;返回所有在 DNA 分子中出现不止一…

【C++】类和对象(2)

目录 1. 初始化列表 2.explicit关键字 3. Static成员 3. 友元 3.1友元函数 3.2友元类 4. 内部类 5.匿名对象 1. 初始化列表 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值&#xff0c;但是这个过程并不能称为对对…
推荐文章