从kafka的请求处理模型理解Reactor模式

深度剖析:Kafka 请求是如何处理的? 看完这篇文章彻底懂了 大家好,我是 华仔, 又跟大家见面了。 最近工作比较忙,外加上在弄公众号迁移开通留言功能, 原创文章已经鸽了一个多月, 让大家久等了。 上一篇作为专题系列的第一篇,我们深度剖析了关于 Kafka 存储架构设计的实现细节,今天开启第二篇,我们来深度剖析下「Kafka Broker 端网络架构和请求处理流程」是如何设计的? 相信使用... 阅读详情

内容总结于课程: kafka请求是怎么被处理的

扩展阅读: Scalable IO in Java

简介

Kafka 自己定义了一组请求协议,用于实现各种各样的交互操作。比如常见的 PRODUCE 请求是用于生产消息的,FETCH 请求是用于消费消息的,METADATA 请求是用于请求 Kafka 集群元数据信息的。所有的请求都是通过 TCP 网络以 Socket 的方式进行通讯的。

今天主要整理一下kafka Broker 端处理请求的全流程

关于处理请求,很容易想到的两个方案:

1、单线程处理请求: 由于单线程,吞吐量极差,
2、线程池处理请求: 确实优化了很多,但是每一个线程的粒度太大,处理了连接、处理、返回等操作。
3、Reactor模式: Reactor 模式是事件驱动架构的一种实现方式,特别适合应用于处理多个客户端并发向服务器端发送请求的场景。
在这里插入图片描述
client: 客户端,多个客户端会发送请求给到 Reactor
dispatch(acceptor): Reactor 有个请求分发线程 Dispatcher,也就是图中的 Acceptor,它会将不同的请求下发到多个工作线程中处理。Acceptor 线程只是用于请求分发,不涉及具体的逻辑处理,非常得轻量级,因此有很高的吞吐量表现。而这些工作线程可以根据实际业务处理需要任意增减,从而动态调节系统负载能力。

对比到kafka中的模型图:

在这里插入图片描述
Broker端有ScoketServer组件,类似于 Reactor 模式中的 Dispatcher,也有对应的 Acceptor 线程和一个工作线程池,只不过在 Kafka 中,这个工作线程池有个专属的名字,叫网络线程池。Kafka 提供了 Broker 端参数 num.network.threads,用于调整该网络线程池的线程数。其默认值是 3,表示每台 Broker 启动时会创建 3 个网络线程,专门处理客户端发送的请求。

Acceptor线程采用轮询方式将请求公平分发到所有网络线程,防止请求处理的倾斜。

网络线程池处理请求

在这里插入图片描述
网络线程将进来的请求放入到一个共享请求队列中。Broker 端还有个 IO 线程池,负责从该队列中取出请求,执行真正的处理。如果是 PRODUCE 生产消息请求,则将消息写入到底层的磁盘日志中;如果是 FETCH 请求,则从磁盘或页缓存中读取消息。

IO线程处理的才是真正处理的逻辑。Broker通过参数num.io.threads加粗样式控制了这个线程池中的线程数。目前该参数默认值是 8,表示每台 Broker 启动后自动创建 8 个 IO 线程处理请求。

Purgatory组件: 用来缓存延迟请求,一些未满足条件不能立即执行的请求。比如设置acks=all的produce请求,需要等待收到ISR中所有的副本都持久化消息后才将请求返回,此时处理该请求的IO线程必须等待其他Broker的写入。

kafka请求分类
  • PRODUCE 和 FETCH 这类请求称为数据类请求
  • 负责更新 Leader 副本、Follower 副本以及 ISR 集合的 LeaderAndIsr 请求,负责勒令副本下线的 StopReplica 请求等为控制类请求
思考,不同类型的请求,是否需要分开处理呢?
问题:

假设我们有个主题只有 1 个分区,该分区配置了两个副本,其中 Leader 副本保存在 Broker 0 上,Follower 副本保存在 Broker 1 上。假设 Broker 0 这台机器积压了很多的 PRODUCE 请求,此时你如果使用 Kafka 命令强制将该主题分区的 Leader、Follower 角色互换,那么 Kafka 内部的控制器组件(Controller)会发送 LeaderAndIsr 请求给 Broker 0,显式地告诉它,当前它不再是 Leader,而是 Follower 了,而 Broker 1 上的 Follower 副本因为被选为新的 Leader,因此停止向 Broker 0 拉取消息。
这时,一个尴尬的场面就出现了:如果刚才积压的 PRODUCE 请求都设置了 acks=all,那么这些在 LeaderAndIsr 发送之前的请求就都无法正常完成了。就像前面说的,它们会被暂存在 Purgatory 中不断重试,直到最终请求超时返回给客户端。

个人解决:

Broker中实现一个有限队列,将控制类的请求赋予更高的优先级。存在的问题,一旦优先队列满了之后,无法处理新的控制类请求。

社区解决方案:

完全拷贝网络处理架构,将两类请求进行分离,scoket使用的不同端口,使用起来需要提供不同的listeners配置,指定哪个端口处理哪一类的请求

深入浅出kafka原理-4-kafka网络机制原理 深入浅出kafka原理-本文将以常见面试题为主线,从浅入深介绍kafka的原理,涉及常见的如何保证消息不丢失,副本的同步机制,请求流程,网络机制等。 阅读详情

相关推荐

reactor-kafka:带有 Reactor 的React式 Kafka 驱动程序

React堆卡夫卡 您需要安装 。 构建 Reactor Kafka jars ./gradlew jar 运行单元测试 ./gradlew test 构建IDE项目 ./gradlew eclipse ./gradlew idea 样本生产者和消费者 有关示例React式生产者,请参阅 。 有关示例React性消费者,请参阅 。 设置 Kafka 集群并创建主题: 启动 Zookeeper 和 Kafka 服务器 创建主题“演示主题” 运行示例生成器: 如果需要,更新 SampleProducer.java 中的 BOOTSTRAP_SERVERS 和 TOPIC 编译并运行 reactor.kafka.samples.SampleProducer(例如从 IDE 作为 Java 应用程序)) 运行示例消费者: 如果需要,更新 SampleConsumer.java 中

【重新理解通信模型】Reactor 模式在 Redis 和 Kafka 中的应用

每个框架都有自己的通信模型,用于处理网络事件。只是不同的框架依据自身的侧重点,对网络通信的要求和实现方式不一样。

林立可 877

stream-reactor:具有Kafka和Kafka-Connect的ETL的流参考架构。 您可以在http://lenses.io上找到更多信息,以了解我们如何提供统一的解决方案来管理连接器,用于Kafka和Kafka Streams的最先进SQL引擎,集群监视和警报等

随便加入我们 Apache Kafka镜头 Lenses提供SQL(用于数据浏览和Kafka流),Kafka Connect连接器管理,集群监视等。 您可以在上找到更多 流React器 用于构建实时摄取管道的组件的集合。 Kafka兼容性 Kafka 2.5+(汇合5.5)-物流React器2.0.0+ Kafka 2.0-> 2.4(汇合5.4)-流式React器1.2.7 连接器 请花一点时间阅读文档,并确保满足软件前提条件!! 连接器 类型 描述 文件 AWS S3 水槽 将数据从Kafka复制到AWS S3。 AzureDocumentDb 水槽 从Kafka和Azure

18、kafka的Reactor设计模型

kafka的Reactor设计模型(2)认识Linux的epoll模型(3)kafka Server Reactor模型 kafka作为一种高性能、高并发的消息中间件,必须要求大量的客户端连接、必须做到高并发,kafka使用了久经检验的Reactor模型。在了解之前,首先了解一下如下几个概念(Reactor模型是基于Java NIO的,是linux的epoll模型的改造): #(1)认识Java ...

lixiang987654321的专栏 1199

摄像机实时接入分析平台视频分析网关AI智能分析智慧营业厅方案

通过智能化的改造,可以提高营业厅的运营效率,降低运营成本,同时提升客户体验和安全保障。

EasyDarwin开源社区技术博客 703

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

Kafka如何基于Reactor设计模式高并发处理请求? (深度好文)

阅读本文大约需要 30 分钟。 开篇三问:Kafka Broker 端网络架构和请求处理到底是使用了哪些高大上的技术?它到底解决了什么问题?究竟是怎么解决的? 只有了解了这些, 我们才能深刻掌握 Kafka 服务端设计精髓所在,更加深刻理解一个高并发、高性能服务端架构该如何设计。 相信使用过 Kafka 的朋友都知道其吞吐量可以高达百万,但很少人理解其中的设计原理。认真读完这篇文章,你会对Kafka Broker请求处理流程和网络架构设计实现细节,有更加深刻的理解。 这篇文章干货很多,希望大家..

Java搜索工程技术栈 1702

9 Kafka Server Reactor设计模型

Kafka Server Reactor设计模型更多干货分布式实战(干货)spring cloud 实战(干货)mybatis 实战(干货)spring boot 实战(干货)React 入门实战(干货)构建中小型互联网企业架构(干货)python 学习持续更新ElasticSearch 笔记kafka storm 实战 (干货)一、概述二、Java NIO由以下几个核心部分组成 :Channel...

架构师的成长之路的博客 1313

Vitis Model Composer闪退?手把手教你用命令行启动Vivado 2021后的System Generator

本文详细解析了Vitis Model Composer闪退问题的根本原因,并提供了命令行启动Vivado 2021后System Generator的完整解决方案。从环境变量配置、组件缺失排查到权限问题处理,手把手教你通过命令行深度排错,并分享高级自动化脚本和系统优化技巧,帮助开发者高效使用Vitis Model Composer与System Generator进行HDL开发。

weixin_26905487的博客 348

基于STM32F103C8T6的循迹避障小车完整制作过程(详细)----上篇(第123点)

基于STM32F103C8T6的循迹避障小车完整制作过程 由于本人的一个小项目,要做一个基于STM32的循迹避障小车,前后花了约1周的时间,这个过程种也参考了很多大神分享的资料,学到很多的东西。但是资料都比较分散,有些东西也不好找,在这里就想把自己制作小车的一个整体过程记录分享一下,希望能够帮到你。 我自己也算是一个小白,之前有做过 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎...

weixin_43924857的博客 14万+

reactor模型_实现高并发Reactor模型 , Kafka利用多线程去处理I/O与业务分发

一、从《Apeche Kafka源码剖析》上搬来的概念和图Kafka网络采用的是Reactor模式,是一种基于事件驱动的模式。熟悉Java编程的读者应该了解Java NIO提供了Reactor模式的API。常见的单线程Java NIO编程模式如图所示。 熟悉NIO编程都应该知道这个Selector,我们可以通过轮询它来获取监听事件,然后通过事件来进行不同的处理,比如OP_ACCEPT连接,OP_R...

weixin_39775910的博客 272

深入解析TOM模块的PWM输出与ADC触发机制:从配置到DMA数据传输

本文深入解析了TOM模块在嵌入式系统中的核心应用,详细阐述了如何配置其PWM输出功能,并实现与ADC模块的硬件触发同步。重点介绍了通过DMA机制高效传输ADC采样数据的完整流程,涵盖时钟配置、工作模式选择、引脚映射及联调实战,为电机控制、数字电源等实时系统提供了一套硬件自动化的高效解决方案。

weixin_29227585的博客 367

面试官:来来来,说说 Kafka 处理请求的全流程!

我的新课《C2C 电商系统微服务架构120天实战训练营》在公众号儒猿技术窝上线了,感兴趣的同学,可以长按扫描下方二维码了解课程详情:课程大纲请参见文末本文来源:yes的练级攻略叨叨在进入...

石杉的架构笔记 704

YOLOv8中Bottleneck模块的残差连接机制解析

本文深入解析了YOLOv8目标检测模型中Bottleneck模块的核心设计,重点阐述了其残差连接机制。该机制通过构建一条信息“捷径”,有效缓解了深层网络中的梯度消失问题,稳定了训练过程,并提升了特征提取效率。文章结合代码详细拆解了模块结构,并探讨了其在YOLOv8骨干网络与检测头中的关键作用及参数调优思路。

weixin_29061821的博客 253

aistudio高效解压zip文件的实用技巧

本文详细介绍了在百度AI Studio平台上高效解压ZIP文件的实用技巧。针对深度学习项目数据准备中的常见痛点,重点讲解了使用Python zipfile库和Linux unzip命令两种核心方法,并提供了路径设置、大文件处理、中文乱码等关键问题的解决方案,帮助用户提升数据处理效率。

salt的博客 784

深度剖析:Kafka 请求是如何处理? 看完这篇文章彻底懂了!

今天我们来深度剖析下「Kafka Broker 端网络架构和请求处理流程」是如何设计的? 相信使用过 Kafka 的朋友都知道其吞吐量可以高达百万,但很少人理解其中的设计原理。 那么 Kafka Broker 端网络架构和请求处理到底是使用了哪些高大上的技术?它到底解决了什么问题?究竟是怎么解决的? 只有了解了这些, 我们才能深刻掌握 Kafka 服务端设计精髓所在,更加深刻理解一个高并发、高性...

m0_62695120的博客 3096

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Kafka——请求是怎么被处理的?

Kafka——请求是怎么被处理的?:Kafka Broker 请求处理全解析

从知识输入到知识输出 1628

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Kafka 请求处理揭秘:从入门到精通

Reactor 模式是事件驱动架构的一种实现方式,特别适合处理多个客户端并发请求的场景。我们看看它的架构图:22)多个客户端发送请求给 Reactor,Reactor 的 Dispatcher 线程将请求分发到多个工作线程中处理。Dispatcher 线程不涉及具体逻辑处理,非常轻量级,因此有很高的吞吐量表现。

码上代码的博客 1659

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Reactor网络线程模型

Reactor模式由浅入深的设计

数据与算法架构提升之路专栏 1967

八、Kafka的请求是如何处理的

对于如何处理请求,我们很容易想到的两个方案。

ja_nus_的博客 400

深度剖析:Kafka 请求是如何处理?

相信使用过 Kafka 的朋友都知道其吞吐量可以高达百万,但很少人理解其中的设计原理。认真读完这篇文章,你会对Kafka Broker请求处理流程和网络架构设计实现细节,有更加深刻的理解。 开篇三问: Kafka Broker 端网络架构和请求处理到底是使用了哪些高大上的技术?它到底解决了什么问题?究竟是怎么解决的? 只有了解了这些, 我们才能深刻掌握 Kafka 服务端设计精髓所在,更加深刻理解一个高并发、高性能服务端架构该如何设计。 相信使用过 Kafka 的朋友都知道其吞吐量可以高达百万,但

m0_67322837的博客 444

kafka:Kafka请求处理全流程深度解析

Kafka采用Reactor模式+多阶段异步处理架构,完美支撑百万级QPSSendNetworkClientSocketServerAcceptorProcessorRequestChannelKafkaRequestHandlerKafkaApisReplicaManagerPartition 1.2 关键线程分工 线程类型 数量配置 职责 Acceptor 1个/监听端口 接收新连接 Processor num.network.threads 网络IO处理 Handler num

weixin_43290370的博客 821

Kafka高可用与可靠性深度解析:Reactor模式与网络层架构揭秘

在Kafka的上下文中,Reactor模式通过Java NIO实现了高度可控的网络层,能够精细优化连接管理和请求处理流程,这也是Kafka选择此模式的重要原因。此外,Kafka在2025年的演进中进一步优化了线程池的调度算法,引入了更智能的负载均衡策略,例如基于请求类型的优先级处理,确保控制平面请求(如元数据操作)优先于数据平面请求,从而提升系统响应速度。在Kafka的架构中,KafkaRequestHandlerPool作为请求处理的核心组件,承担着将网络层接收的请求转化为实际业务操作的关键职责。

zuiyuelong的博客 801

字节二面:能说说Kafka处理请求的流程么?越详细越好

今天来讲讲Kafka Broker端处理请求的全流程,剖析下底层的网络通信是如何实现的、Reactor在kafka上的应用。 再说说社区为何在2.3版本将请求类型划分成两大类,又是如何实现两类请求处理的优先级。 叨叨 不过在进入今天主题之前我想先叨叨几句,就源码这个事儿,不同人有不同的看法。 有些人听到源码这两个词就被吓到了,这么多代码怎么看。奔进去就像无头苍蝇,一路断点跟下来,跳来跳去,算了拜拜了您嘞。 而有些人觉得源码有啥用,看了和没看一样,看了也用不上。 其实上面两种想法我都有过,哈哈哈.

AI乔治 853
上一篇: 从kafka说起零拷贝机制的运用
下一篇: spring生命周期与集成apollo原理分析(动态生效配置中心)
Kindle_code
博客等级 码龄12年 21粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值