Kafka网络模型

Kafka的架构模型以及工作流程 一、前言 由于工作需要,自学kafka,以下是鄙人对kafka的一些认知,分享与各位道友,如有错误请指正,欢迎各位道友一起探讨。 二、简介 1.Kafka是什么? Kafka是基于 发布-订阅模式的分布式流处理平台(消息队列)。 2.我们为什么要选择Kafka? Kafka用于流式数据的处理,被广泛应用于大数据实时计算、日志采集领域(我将其理解为数据量大就用kafka?.?) 三、Ka... 阅读详情

  Kafka的网络通信模型是基于NIO的Reactor多线程模型来设计的。Kafka的网络通信层模型,主要采用了 1(1个Acceptor线程)+N(N个Processor线程)+M(M个业务处理线程) 。

线程数线程名线程具体说明
1kafka-socket-acceptorAcceptor线程,负责监听Client端发起的请求
Nkafka-network-threadProcessor线程,负责对Socket进行读写
Mkafka-request-handlerWorker线程,处理具体的业务逻辑并生成Response返回

Kafka网络通信层的完整框架图如下图所示:
在这里插入图片描述
Kafka网络通信模型中的几个重要概念:

(1)Accept Thread:负责与客户端建立连接链路,然后把Socket轮转交给Process Thread

(2)Process Thread:负责接收请求和响应数据,Process Thread每次基于Selector事件循环,首先从Response Queue读取响应数据,向客户端回复响应,然后接收到客户端请求后,读取数据放入Request Queue

(3)KafkaRequestHandler :M个请求处理线程,包含在线程池—KafkaRequestHandlerPool内部,从RequestChannel的全局请求队列—requestQueue中获取请求数据并交给KafkaApis处理,M的大小由 “num.io.threads” 决定

(4)RequestChannel :其为Kafka服务端的请求通道,该数据结构中包含了一个全局的请求队列 requestQueue和多个与Processor处理器相对应的响应队列responseQueue,提供给Processor与请求处理线程KafkaRequestHandler和KafkaApis交换数据的地方

(5)NetworkClient :其底层是对 Java NIO 进行相应的封装,位于Kafka的网络接口层。Kafka消息生产者对象—KafkaProducer的send方法主要调用NetworkClient完成消息发送

(6)SocketServer :其是一个NIO的服务,它同时启动一个Acceptor接收线程和多个Processor处理器线程。提供了一种典型的Reactor多线程模式,将接收客户端请求和处理请求相分离

(7)KafkaServer :代表了一个Kafka Broker的实例;其startup方法为实例启动的入口

(8)KafkaApis :Kafka的业务逻辑处理Api,负责处理不同类型的请求;比如 “发送消息”、 “获取消息偏移量—offset” 和 “处理心跳请求” 等

Kafka网络通信层的设计与具体实现

在这里插入图片描述
Kafka的通信流程:

  • Client向Server发送请求时,Acceptor负责接收TCP请求,连接成功后传递给Processor线程
  • Processor线程接收到新的连接后,将其注册到自身的Selector中,并监听READ事件
  • 当Client在当前连接对象上写入数据时,会触发READ事件,根据TCP协议调用Handler进行处理
  • Handler处理完成后,可能会有返回值给Client,并将Handler返回的结果绑定Response端进行发送

  网络通信层包括几个重要元素:SocketServer、Acceptor、Processor、RequestChannel和KafkaRequestHandler。

SocketServer
  SocketServer是接收客户端Socket请求连接、处理请求并返回处理结果的核心类,Acceptor及Processor的初始化、处理逻辑都是在这里实现的。在KafkaServer实例启动时会调用其startup的初始化方法,会初始化1个 Acceptor和N个Processor线程(每个EndPoint都会初始化,一般来说一个Server只会设置一个端口)

Acceptor
  Acceptor是一个继承自抽象类AbstractServerThread的线程类。Acceptor的主要任务是监听并且接收客户端的请求,同时建立数据传输通道—SocketChannel,然后以轮询的方式交给一个后端的Processor线程处理(具体的方式是添加socketChannel至并发队列并唤醒Processor线程处理)。

在该线程类中主要有两个重要的变量:
(1)nioSelector :通过NSelector.open()方法创建的变量,封装了JAVA NIO Selector的相关操作
(2)serverChannel :用于监听端口的服务端Socket套接字对象

  Acceptor线程启动后,首先会向用于监听端口的服务端套接字对象—ServerSocketChannel上注册OP_ACCEPT 事件。然后以轮询的方式等待所关注的事件发生。如果该事件发生,则调用accept()方法对OP_ACCEPT事件进行处理。这里,Processor是通过 round robin 方法选择的,这样可以保证后面多个Processor线程的负载基本均匀。

Acceptor的accept()方法的作用主要如下:

(1)通过SelectionKey取得与之对应的serverSocketChannel实例,并调用它的accept()方法与客户端建立连接

(2)调用connectionQuotas.inc()方法增加连接统计计数;并同时设置第(1)步中创建返回的socketChannel属性(如sendBufferSize、KeepAlive、TcpNoDelay、configureBlocking等)

(3)将socketChannel交给processor.accept()方法进行处理。这里主要是将socketChannel加入Processor处理器的并发队列newConnections队列中,然后唤醒Processor线程从队列中获取socketChannel并处理。其中,newConnections会被Acceptor线程和Processor线程并发访问操作,所以newConnections是ConcurrentLinkedQueue队列(一个基于链接节点的无界线程安全队列)

Processor
  Processor同Acceptor一样,也是一个线程类,继承了抽象类AbstractServerThread。其主要是从客户端的请求中读取数据和将KafkaRequestHandler处理完响应结果返回给客户端。在该线程类中有以下几个重要的变量:
(1)newConnections :在上面的 Acceptor 一节中已经提到过,它是一种ConcurrentLinkedQueue[SocketChannel]类型的队列,用于保存新连接交由Processor处理的socketChannel

(2)inflightResponses :是一个Map[String, RequestChannel.Response]类型的集合,用于记录尚未发送的响应

(3)selector :是一个类型为KSelector变量,用于管理网络连接

Processor处理器线程run方法执行的流程如图所示:
在这里插入图片描述
上面的流程图中能够可以看出Processor处理器线程在其主流程中主要完成了这样子几步操作:

(1)处理newConnections队列中的socketChannel 。遍历取出队列中的每个socketChannel并将其在selector上注册OP_READ事件

(2)处理RequestChannel中与当前Processor对应响应队列中的Response 。在这一步中会根据responseAction的类型(NoOpAction/SendAction/CloseConnectionAction)进行判断,若为“NoOpAction”,表示该连接对应的请求无需响应;若为“SendAction”,表示该Response需要发送给客户端,则会通过“selector.send”注册OP_WRITE事件,并且将该Response从responseQueue响应队列中移至inflightResponses集合中;“CloseConnectionAction”,表示该连接是要关闭的

(3)调用selector.poll()方法进行处理 。该方法底层即为调用nioSelector.select()方法进行处理

(4)处理已接受完成的数据包队列—completedReceives 。在processCompletedReceives方法中调用“requestChannel.sendRequest”方法将请求Request添加至requestChannel的全局请求队列—requestQueue中,等待KafkaRequestHandler来处理。同时,调用“selector.mute”方法取消与该请求对应的连接通道上的OP_READ事件

(5)处理已发送完的队列—completedSends 。当已经完成将response发送给客户端,则将其从inflightResponses移除,同时通过调用“selector.unmute”方法为对应的连接通道重新注册OP_READ事件

(6)处理断开连接的队列 。将该response从inflightResponses集合中移除,同时将connectionQuotas统计计数减1

RequestChannel
  在Kafka的网络通信层中,RequestChannel为Processor处理器线程与KafkaRequestHandler线程之间的数据交换提供了一个数据缓冲区,是通信过程中Request和Response缓存的地方。因此,其作用就是在通信中起到了一个数据缓冲队列的作用。Processor线程将读取到的请求添加至RequestChannel的全局请求队列—requestQueue中;KafkaRequestHandler线程从请求队列中获取并处理,处理完以后将Response添加至RequestChannel的响应队列—responseQueue中,并通过responseListeners唤醒对应的Processor线程,最后Processor线程从响应队列中取出后发送至客户端

KafkaRequestHandler
  KafkaRequestHandler也是一种线程类,在KafkaServer实例启动时候会实例化一个线程池—KafkaRequestHandlerPool对象(包含了若干个KafkaRequestHandler线程),这些线程以守护线程的方式在后台运行。在KafkaRequestHandler的run方法中会循环地从RequestChannel中阻塞式读取request,读取后再交由KafkaApis来具体处理

用这样以下几点优势:

  • 能够单独指定Handler的线程数,便于调优和管理
  • 防止一个过大的请求阻塞一个Processor线程
  • Request、Handler、Response之间都是通过队列来进行连接的,这样它们彼此之间不存在耦合现象,对提升Kafka系统的性能很有帮助

KafkaApis
  KafkaApis是用于处理对通信网络传输过来的业务消息请求的中心转发组件。该组件反映出Kafka Broker Server可以提供哪些服务

kafka网络模型 Kafka基于高吞吐率和效率考虑,并没有使用第三方网络框架,而且自己基于java nio封装的,总体网络模型如下: Broker的内部处理流水线化,分为多个阶段来进行(SEDA),以提高吞吐量和性能,尽量避免Thead盲等待,以下为过程说明。 Accept Thread负责与客户端建立连接链路,然后把Socket轮转交给Process Thread Process Thread负责接收请求和响应数据,Process Thread每次基于Selector事件循环,首先从Response Queue读. 阅读详情

相关推荐

Kafka消息模型与工作原理详解

Kafka作为一个强大的分布式流处理平台,在大数据领域中发挥着重要的作用。它的高吞吐量、可扩展性、持久性等特点,使其能够满足各种复杂的应用场景需求。无论是日志收集、流式处理,还是消息系统和事件驱动架构,Kafka都能提供高效、可靠的解决方案。随着大数据技术的不断发展,Kafka的应用前景也将更加广阔。如果你还没有尝试过Kafka,不妨在自己的项目中使用一下,相信它会给你带来意想不到的惊喜。

giser@2011的博客 1724

消息中间件—简谈Kafka中的NIO网络通信模型

摘要: 很多人喜欢把RocketMQ与Kafka做对比,其实这两款消息队列的网络通信层还是比较相似的,本文就为大家简要地介绍下Kafka的NIO网络通信模型 本文主要通过对Kaf...

466

聊聊 Kafka: Producer 的网络模型

我们前面几篇有说 Producer 发送流程的源码分析,但那个是大的轮廓,涉及到发送很多相关的内容,比如:获取 topic 的 metadata 信息key 和 value 的序列化获取该 record 要发送到的 partition向 RecordAccmulator 中追加 record 数据唤醒 sender 线程发送 RecordBatch那这篇老周主要来说下 Producer 的网络模型,这里直接给出 Producer 的网络模型图,如下:从图中可以看出,KafkaProducer 相当于客户端,

m0_67698950的博客 262

架构必备能力——kafka的选型对比及应用场景

经过上述的讲解,我们不难知道Kafka的应用场景非常广泛,你可以只把他当MQ组件,也可以使用它进行日志传输或流处理。它的特点也非常鲜明,就是强大的吞吐量、扩展性和可靠性。当然它与传统MQ组件对比,它在复杂场景下的使用会比较麻烦。但其在大数据领域应用广泛,比如经常作为 Hadoop 的数据源,将数据传输到 Hadoop 中进行存储和处理。当然,在实际选型中我们往往要考虑更多问题,除了明确需求和场景,还要考虑已用的技术栈情况、开发语言支持、版本更新情况。并没有哪一种框架是万金油。

战斧的博客 1万+

Qt 5.12.8在Linux下编译qtvirtualkeyboard模块,我踩过的那些坑(附完整解决方案)

本文详细介绍了在Linux系统下为Qt 5.12.8单独编译qtvirtualkeyboard模块的完整解决方案。通过分析模块缺失原因、提供精准的编译步骤和常见问题处理,帮助开发者高效解决虚拟键盘模块缺失问题,避免重新编译整个Qt源码的繁琐过程。

weixin_29248611的博客 458

手把手教你用Logisim搞定华科计组实验:单总线CPU硬布线控制器设计(含Excel自动生成电路技巧)

本文详细解析了如何使用Logisim完成华科计组实验中的单总线CPU硬布线控制器设计,特别分享了利用Excel自动生成电路逻辑的高效技巧。从实验准备、状态机表格填写到模块化构建和系统联调,提供全流程实战指导,帮助读者快速掌握计算机组成原理核心概念,大幅提升实验效率。

weixin_28744423的博客 321

手绘模型图带你认识Kafka服务端网络模型

Kafka中的网络模型就是基于主从Reactor多线程进行设计的。

华为云官方博客 3568

智能硬件产品 App 全球发布 第 1 章:全球 App 发布战略设计

本章阐述智能硬件 App 全球发布战略,涵盖市场分析、竞争格局、用户画像及资源配置。通过制定可执行的全球化推广路径,整合地区法规合规、渠道分发策略与营销活动设计,助力团队快速进入主流商店并确立品牌影响力。同时构建可量化的 KPI 监控体系,指导项目进度追踪与效果复盘,确保产品迭代持续优化,降低运营总成本。

moton2017的博客 156

kafka源码_Kafka 源码解析之 Producer NIO 网络模型(四)

本文是 Kafka 源码解析的第四篇,在写这篇文章之前,专门看了一下 Java NIO 相关的内容,只有理解了 Java NIO 模型才能更好地理解 NIO 在 Kafka 中是如何应用的以及 Producer 如何利用 Java NIO 构建其网络模型,同时,本文也是对 Producer 整个流程的一个总结,主要讲述以下两个问题:Producer 的大概网络模型,与 Java NIO 模型之间关...

weixin_39822147的博客 341

多标签图像分类:标签依赖关系建模的最新论文解读与实战应用

多标签图像分类:标签依赖关系建模的最新论文解读与实战应用 ,人工智能,计算机视觉,大模型,AI,本文解读了最新相关论文,包括基于图神经网络(GCN)的ML-GCN方法,通过构建标签相关矩阵建模依赖关系;区域潜在语义依赖的RLSD模型,定位关键区域并利用RNN建模语义依赖;以及语义图表示学习的SSGRL框架,结合语义解耦与交互模块。通过实战应用,展示了基于PyTorch的ML-GCN模型实现,包括图像特征提取、标签依赖建模及训练评估流程,为多标签图像分类提供了有效解决方案。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

利用恒源云云端GPU高效训练YOLOv11模型全流程:从环境搭建到模型部署,让你摆脱硬件束缚

记住,云端GPU的核心优势是“弹性算力+一键环境”,只要把握好这一工具特性,再结合YOLOv11的高性能模型架构,你也能在计算机视觉领域快速落地项目。接下来,我们从工具准备到模型部署,一步步带你实现高效训练,真正帮你解决资源与效率的核心痛点。凭借其在目标检测、实例分割任务上的卓越性能,成为众多开发者的首选。据统计,使用云端GPU训练YOLOv11,在处理百万级数据集时,训练效率较本地普通GPU提升。在安防监控中,YOLOv11可实时检测人员、车辆异常行为,某园区采用该方案后,异常事件识别准确率达。

LXY_LOVE36的博客 213

深度解析kafka broker网络模型运行原理

原创不易,转载请注明出处 文章目录前言1.kafka网络模型运行原理2.对比一下RocketMQ的网络模型总结 前言 本文将介绍下kafka broker 端的网络模型,会从宏观角度介绍下kafka broker网络模型是啥样子的,都有哪些组件,组件之间的运作流程是啥样子的,里面涉及到的一些比较重要的参数,接着就是将RocketMQ网络模型拿出来与kafka 的比较一下。 1.kafka网络模型运行原理 kafka broker 在启动的时候,会根据你配置的listeners 初始化它的网络组件,用来.

猿上生活 1802

LLM制造业最佳实践:基于大语言模型处理最优化问题,制造业如何更优排产,提升资源利用率

随着制造业数字化转型加速,生产排产优化成为提升企业效率和竞争力的关键环节。大语言模型(LLM)凭借其强大的多模态数据处理、动态优化和智能推理能力,在复杂排产场景中展现出独特优势。谷歌、DeepSeek等机构的研究表明,LLM可通过自然语言交互和生成式决策,突破传统优化算法的局限性。本报告结合半导体行业实践案例与技术路径,系统分析LLM在排产优化中的应用潜力与挑战。

shiter编写程序的艺术 939

kafka之网络模型总结

弄清楚kafka的网络模型原理,能很好的帮助理解和优化kafka服务。kafka底层的网络通信,没有使用第三方rpc实现,如netty等,而是使用了java的NIO实现的一套自己的通信框架协议。本文主要描述kafka基础网络通信的相关实现原理,版本为1.1.0。 java NIO具体细节不再描述,主要包含3个部分: Channel:连接,如FileChannel、SocketChannel等,表...

zhaorongsheng的专栏 246

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有帮助,可以清晰帮你展示出模型速度性能的提升以及轻量化的效果(模型大小),对于以提高精度为目的的读者本文也能够帮助大家展示出现阶段的模型速度指标。所以本文的内容是十分有用的机制,对于大家发表论文来说,下面的图片为运行后的效果可以看到,该有的指标均已打印(本文内容为我独家创新,全网无第二份)下面是效果图和文

Snu77的博客 3628

Unity零基础到进阶 | Unity中的内存泄漏全解析,原因、排查及避免

Unity 内存泄漏并非传统C++语境中的野指针或未释放堆内存,而是基于其「托管内存(C#)+ 原生内存(引擎/非托管)」双架构的特殊问题——即已废弃、不再被业务逻辑使用的内存块,无法被引擎或系统自动回收,持续占用内存空间,最终引发内存暴涨、GC卡顿、OOM(内存溢出)崩溃,其中移动端、主机端受影响最显著。 Unity 内存主要分为三类,其中泄漏仅发生在前两类,栈内存因系统自动分配/释放,无泄漏风险:

努力前行,总会成为自己心中的那道光 1万+

Kafka网络模型分析

  Kafka基于高吞吐率和效率考虑,并没有使用第三方网络框架,而且自己基于java nio封装的,总体网络模型如下:      Broker的内部按照SEDA模型处理网络请求,处理过程如下:   Accept Thread负责与客户端建立连接链路,然后把Socket轮转交给Process Thread   Process Thread负责接收请求和响应数据,Process Threa...

weixin_30410999的博客 256

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

吃透Kafka七:Producer NIO 网络模型

主要讲述以下两个问题: Producer 的大概网络模型,与 Java NIO 模型之间关系; Producer 整体流程及其整体流程详解。 Producer 的网络模型 KafkaProducer 通过 Sender 进行相应的 IO 操作,而 Sender 又调用 NetworkClient 来进行 IO 操作,NetworkClient 底层是对 Java NIO 进行相应的封装,其网络模型如下图所示 从图中可以看出,Sender 为最上层的接口,即调用层,Sender 调用 NetworkCl

吃透Java 540

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【云原生进阶之PaaS中间件】第三章Kafka-4.3.2-broker网络模型

kafka broker 在启动的时候,会根据你配置的listeners 初始化它的网络组件,用来接收外界的请求,这个listeners你可能没配置过,它默认的配置是listeners=PLAINTEXT://:9092就是告诉kafka使用哪个协议,监听哪个端口,如果我们没有特殊的要求的话,使用它默认的配置就可以了,顶多是修改下端口这块。

junbaozi的专栏 1573

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

从源码层面分析Kafka Broker 网络模型、副本机制

背景 驱动学习: kafka是业界消息中间件之楷模,他从网络设计、副本同步机制设计的很优秀,业界也很多公司都使用了kafka,当初我在腾讯的内部后端serve有些场景也是通过Kafka解耦和实现一次性语义,我们公司目前kafka使用的场景也比较多例如tracking收集数据,前端能效组采集接口数据,埋点、大数据平台实时流计算,基本都使用kafka作为采集端,完成数据上报。 心得感受: 第一次看kafka broker的源码的时候,我是一个不懂scala语言的人,刚开始看这个代码很难受,过来这个难受时期,你会

qq_30561643的博客 612

Kafka - 网络模型:NIO通信机制与Selector设计

本文深入剖析了Kafka的高性能网络通信模型。Kafka采用Java NIO构建异步网络框架,通过Selector实现I/O多路复用,结合Reactor模式大幅提升并发处理能力。文章首先对比BIO的线程瓶颈问题,阐述NIO非阻塞I/O的优势;随后详细解析Kafka的网络架构,包括Acceptor接收连接、Processor处理读写事件的核心流程,并配以代码示例和Mermaid架构图展示完整数据流。该设计通过分离连接接收与请求处理,实现单线程管理数千连接,为Kafka百万级消息吞吐提供网络基础。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

图解Kafka的服务端的网络通信模型

类:这是Acceptor线程和Processor线程的抽象基类,它定义了一个抽象方法wakeup(),主要是用来唤醒Acceptor线程和Processor对应的Selector的, 当然还有一些共用方法在这里插入图片描述KafkaServer启动的时候,会根据listeners的配置来初始化对应的实例。一个listeners对应一个Acceptor,一个Acceptor持有若干个()Processor实例。

2401_83384536的博客 991

Kafka网络模型之Producer

10年老JAVA大数据技术人的专栏 1449
上一篇: 跳表
下一篇: SparkSQL用户自定义函数
K. Bob
博客等级 码龄8年 82粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值