【消息队列】Kafka请求如何被处理的

news2024/10/5 23:30:13

前言

对于Kafka来说,分为几个阶段,一个是消息的生产请求,以及对应的消息的消费请求。一个是生产者发送到Broker,另一个是消费者通过pull的方式 请求Broker,那么Broker是如何处理这几个请求的。细分下来主要常见的是如下,所有的请求都是通过 TCP 网络以 Socket 的方式进行通讯的。

  • PRODUCE用于生产消息
  • FETCH用于消费消息
  • METADATA用户请求Kafka集群元数据信息

请求方式

顺序处理请求

while (true) {
     Request request = accept(connection);
     handle(request);
}

缺点是系统的吞吐量差,只适用于请求量不高的系统。

多线程处理

while (true) {
    Request = request = accept(connection);
    Thread thread = new Thread(() -> {
	handle(request);});
    thread.start();
}

为每个请求创建一个Thread 进行异步处理,但是频繁的创建Thread对系统的资源消耗比较好,并且没有池化。

Reactor模式

Reactor是事件驱动架构的一种实现方式,应用常见针对于大量客户端请求服务端的情况,比如Netty就是Reactor
在这里插入图片描述
从上图可以看到多个客户端请求服务端,其中有一个分发器,acceptor进行请求的转发,具体的逻辑处理则交给不同的work工作线程处理,这种好处就是可以很好的将请求转发和具体的业务逻辑处理相耦合。

Kafka Reactor原理详解

在这里插入图片描述
这就是Kafka类似的Reactor模式的图,可以看到请求到Broker后,也会通过类似于请求转发的组件Acceptor转发到对应的工作线程上,但是Kafka中被称为网络线程池,一般默认每个Broker上为3个工作线程,可以通过参数 num.network.threads 进行配置。并且采用轮询的策略,可以很均匀的将请求分发到不同的网络线程中进行处理。

在这里插入图片描述
但是实际的处理请求并不是由网络线程池进行处理的,而是会交给后续的IO线程池,当网络线程接受到请求的时候,会将请求写入到共享的请求队列中,而IO线程池会进行异步的处理,默认情况下是8个,可以通过 num.io.threads 进行配置。
IO线程池会进行判断,如果是PRODUCT请求,则将消息写入到底层的磁盘日志文件中,如果是FETCH请求,则会从日志或者页缓存中读取到消息,这个时候会将请求写入到请求响应队列中。
细心的朋友可能发现了请求队列是共享的,但是请求响应队列确实非共享的,这是因为请求队列只是转发,而响应队列需要根据不同的请求,返回其对应的结果值,比如请求A返回的是成功,而请求B返回的是失败。A和B的响应结果不能融合在一起。
缓存延时请求: 之前文章中提到过,请求的时候可能ack=All 那么这个时候比如A生产者发送了1条消息,有三个Broker,对应三个副本,那么必须所有Broker都返回成功后(也就是ISR),才可以将请求返回给生产者,这个时候就需要将请求暂存到Purgatory中,等到所有副本都成功之后,才返回请求给客户端。

控制与数据请求分离

说到这里,我们了解到其实Kafka内部有两类请求,一类是数据类请求,PRODUCT和FETCH。以及控制类请求 元数据的操作,leader 副本的选举的等都属于控制类请求。控制类请求可能导致数据类请求数据失效。

我们举一个极端的情况下,比如一个Topic有两个Broker,Broker1是Leader副本,Broker0是follower副本,Leader副本积压了很多的PRODUCT消息,但是当我们强制将follower副本变更为Leader副本的时候,Kafka内部控制器会发送LeaderAndISR请求给Leader副本告诉它不是leader,而是follower副本,这个时候如果在提交LeaderAndISR之前的PRODUCT可能就处理不了,一直在Purgatory中不断重试。直至超时失败。如果可以很好的将控制类请求和数据类请求分离开,那么可以很好的解决这个问题。
解决方案
一般遇到这种问题,我们可能尝试使用优先级队列进行解决,但是当队列满了之后没办法保证后续被拒绝的请求优先级。
社区如何解决的呢,其实采用了一套完全和上述图中的流程,只不过是后台异步执行的。

复盘

本篇文章,主要接受了请求方式以及Kafka内部的实现机制,其中Acceptor线程、网络线程池、IO线程池、Purgatory组件是构成处理请求的核心模块。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OFDM-LS信道估计 MMSE信道估计公式推导

假设ofdmN个子载波之间是完全正交的,即不考虑ICI影响,通过发送训练序列来实现信道估计。 其中,在推导6.8的时候,需要将6.6先拆解一下。 X − 1 Y X − 1 ( X H Z ) X − 1 X H X − 1 Z H X − 1 Z X^{-1}Y X^{-1}(XHZ)…

【难学易用c++ 之 继承】

目录: 前言一、继承的概念及定义(一)概念(二)继承定义继承关系和访问限定符继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七…

TiDB实战篇-常用的高可用架构

简介 TiDB实战篇-常用的高可用架构。 高可用要考虑的问题 同城三中心 RTO<35秒 RPO0(因为一个数据中心挂点了&#xff0c;还有其他两个可以提供服务) (优点)数据副本不能在同一个数据中心&#xff08;raft多数存活&#xff09;&#xff08;PD的label标签能够解决这个问题…

OpenCV基础之常见的图像梯度算子

文章目录 OpenCV基础之常见的图像梯度Roberts交叉算子Prewitt算子Sobel算子Laplacian算子 OpenCV基础之常见的图像梯度 梯度是一个向量&#xff0c;梯度方向指向函数变化最快的方向&#xff0c;大小就是它的模&#xff0c;也是最大的变化率。 图像梯度是指在图像中某个位置处沿…

关于容器(Docker)的形象比喻

1 将容器比喻为样板间 容器是一种特殊的进程 容器依赖与Linux操作系统内核的几项技术&#xff1a;namespace、cgroup、chroot namespace 与编程语言里的 namespace 有点类似&#xff0c;它可以创建出独立的文件系统、主机名、进程号、网络等资源空间&#xff0c;相当于给进程…

回归问题(Regression)

Regression 前言Dependent vs. Explanatory VariablesHandle Numerical Labelssquared error和variance什么区别 Linear RegressionLinear Regression in 1 Dimension Least Squares &#xff08;最小二乘&#xff0c;重点&#xff09;Least Squares ObjectiveMinimizing a Dif…

确保软件项目成功——验收测试指南

确保软件项目成功——验收测试指南 在软件项目验收测试中&#xff0c;软件测试报告是非常重要的一部分&#xff0c;需要准备和提交。以山东省在2021印发的《政府采购履约验收管理办法》为例&#xff1a; 省级各国家机关、事业单位和团体组织&#xff08;以下统称“采购人”&…

会话跟踪——JWT令牌

会话指的是浏览器与服务器之间的一次连接&#xff0c;我们称之为一次会话。 在用户打开浏览器第一个访问服务器的时候&#xff0c;这个会话就建立了&#xff0c;只要有任何一方断开连接&#xff0c;此时会话就结束了。再一次会话中是可以包含多次请求和相应。那什么是会话跟踪呢…

动力节点springsecurity笔记14~18SpringSecurity 集成thymeleaf

15 SpringSecurity 集成thymeleaf 此项目是在springsecurity-12-database-authorization-method 的基础上进行 复制springsecurity-12-database-authorization-method 并重命名为springsecurity-13-thymeleaf 15.1 添加thymeleaf依赖 | <groupId>org.springframewor…

vue3+vite3+typescript使用wangEditor编辑器

文章目录 ⭐写在前面⭐步入正题&#x1f680;1.安装&#x1f680;2.配置2.1 存数据2.2 读数据 &#x1f680;3.跨域及其他问题3.1 跨域3.2 其他问题 &#x1f680;4.写在最后 ⭐写在前面 &#x1f680; 框架Vue3 Vite3 TypeScript&#xff1a; &#x1f449; Vue3&#xff…

地铁站人流检测硬件部分

目录 一、概述 二、驱动程序 2.1debug串口 2.2体重传感器HX711 2.3滴答定时器 2.4ESP8266 2.5人体检测 2.6 IIC的GPIO 2.7 OLED的IIC 2.8 LED 三、应用 四、中断 一、概述 使用STM32C8T6作为主控 A9 ---> tx&#xff08;调试串口&#xff09; A10 ---> …

算法训练 Day41 | 动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

【python装饰器:看懂这10个例子你就掌握了!】

基本说明 Python 装饰器是一种函数&#xff0c;它可以用来修改其他函数的功能。它是 Python 中的一项高级编程技术&#xff0c;也是 Python 中比较重要的语法之一。 简单来说&#xff0c;装饰器就是一个函数&#xff0c;它可以接受一个函数作为参数&#xff0c;并返回一个函数…

Obsidian+坚果云+FolderSync解决电脑端和安卓端同步方案

目录1.Obsidian电脑端准备 2.Obsidian安卓端准备 3.坚果云电脑端准备 4.坚果云手机端准备 5.FolderSync手机端准备 6.百度云冗余备份 1.Obsidian电脑端准备 这里以windows版本为例&#xff0c;下载后安装 1.Obsidian官网&#xff1a;https://obsidian.md/ 官网下载有时候…

电力电网行业IT运维方案

智能电网背景下&#xff0c;电力、电网企业信息化逐渐渗透到其业务链的各个环节&#xff0c;云计算、物联网、移动互联网等新技术的应用&#xff0c;更驱动信息化与业务创新深度融合。电力、电网企业集团信息系统群逐渐朝着一体化方向发展&#xff0c;信息链越来越长&#xff0…

银行数字化转型导师坚鹏:宏观经济趋势与资本行业机遇和挑战

2023年宏观经济趋势与资本行业机遇和挑战 课程背景&#xff1a; 很多学员存在以下问题&#xff1a; 不知道我国目前的宏观经济形势&#xff1f; 不清楚宏观环境对我国经济的影响&#xff1f; 不知道资本行业未来主要发展趋势&#xff1f; 课程特色&#xff1a; 精彩解…

基于php的校园校园兼职网站的设计与实现

摘要 近年来&#xff0c;信息技术在大学校园中得到了广泛的应用&#xff0c;主要体现在两个方面&#xff1a;一是学校管理系统&#xff0c;包括教务管理、行政管理和分校管理&#xff0c;是我国大学管理和信息传递的主要渠道。二是学生生活服务平台。而随着大学生毕业人数的年…

leetcode重点题目分类别记录(四)图论深入

文章目录 入度出度最大网络秩可以到达所有点的最少点数目 并查集省份数量等式方程的可满足性按字典序排列最小的等效字符串以图判树 二分图判断二分图 深度优先搜索封闭岛屿数量太平洋大西洋水流问题 广度优先搜索树上逃逸最短路径多源最短路径 拓扑排序DFS解决拓扑排序BFS解决…

MIPS指令集-mars-cpu

MIPS通用寄存器 MIPS有32个通用寄存器&#xff08;$0-$31&#xff09;&#xff0c;各寄存器的功能及汇编程序中使用约定如下&#xff1a; 下表描述32个通用寄存器的别名和用途 REGISTER NAME USAGE $0 $zero 常量0(constant value 0) $1 $at 保留给汇编器(Reserved f…

K近邻算法(手写代码+图像识别实践)

k近邻算法作为一个分类算法&#xff0c;他通过计算不同特征值之间的距离来进行分类&#xff0c;它的工作原理是存在一个样本集合作为训练样本集&#xff0c;且每个样本都存在一个标签&#xff0c;此时&#xff0c;输入一个新的样本不存在标签&#xff0c;我们通过计算这个新样本…