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

1 kafka网络模型运行原理

        kafka broker 在启动的时候,会根据你配置的listeners 初始化它的网络组件,用来接收外界的请求,这个listeners你可能没配置过,它默认的配置是listeners=PLAINTEXT://:9092就是告诉kafka使用哪个协议,监听哪个端口,如果我们没有特殊的要求的话,使用它默认的配置就可以了,顶多是修改下端口这块。这个listeners是支持配置多套的,就是你可以监听多个端口,一个listener就对应着内部这么一套网络模型,我们就介绍一个listener的,多个其实都是一样的,就是对应着多套网络模型而已。

        首先会创建一个accept 组件,这个组件对应着一个线程运行它,它主要是负责监听这个端口,打开一个selector,不用质疑就是jdk nio的东西,打开一个serverSocketChannel,然后专门监听accept事件,建立网络连接的。

        接着会为这个accept组件建立创建几个processor组件,每个processor都对应这个一个线程运行,默认是3个,是由num.network.threads这个参数配置的,这几个processor专门是接收请求,发送响应的,每个processor都会打开一个selector用于事件监听。

        当accept组件收到一个新连接请求的时候,会建立一个新连接,就会拿到一个socketChannel,将这个连接交给processor,processor拿到这个channel之后就会注册到对应的selector上面,监听它的read事件,然后后续关于这个连接发送的请求就由某个processor线程来处理,处理完之后再将响应写回到这个连接对应的channel中(事实上kafka中实际的业务逻辑处理不是processor处理的)。

        到这里你以为就完事了?其实如果了解过netty的话,你会发现它跟netty的网络模型很像,netty也是一个线程组处理新连接的创建,一个线程组处理连接数据读取,处理,数据写回,其实这种网络模型就是reactor模型。你如果对netty有个比较深入的了解的话,你可能还会发现netty的pipeline中某个handler 是可以指定处理线程组的,好了我们接着介绍。

        一开始的时候还会创建一个RequestChannel 组件,这个组件主要是几个队列,其中1个请求队列,专门存放请求的,还有几个是响应队列,响应队列的数量是与processor线程数量一样多,一个processor对应一个响应队列。

        kafka broker 初始化的时候还会创建一个RequestHandlerPool组件,这个RequestHandlerPool从名字上也能猜出来是某个资源池,它初始化的时候,会创建几个RequestHandler线程放到这个Pool中,创建数量是由num.io.threads 参数配置的,默认是8个,它专门是干什么的呢?主要是从RequestChannel 的请求队列中获取请求,然后进行具体的业务处理,将处理完的响应再放到对应processor的响应队列中。

到这kafka broker 网络模型涉及到的核心组件以及主要作用介绍完了,下面我们将这些组件的运作流程串起来。

        accept组件监听9092端口,当一个客户端发起建立连接请求时,accept会完成一个新连接的建立,拿到对应的channel,然后将这个channel交给某个processor线程,由它来监听处理这个连接的read ,write事件,就是请求与响应。当这个客户端发送一个请求的时候,processor线程就能监听到,拿到对应的请求信息后,将请求信息塞到RequestChannel 组件里面的请求队列中。

        然后一堆RequestHandler 线程不停的从这个请求队列中获取请求信息,然后进行相应的业务逻辑处理,比如说发送消息的请求,它就会找到对应的parittion,写到对应partition在磁盘的文件中。处理完成业务逻辑后会有个处理结果需要告诉客户端,这个时候handler线程会将处理结果塞到对应processor的响应队列中。

        processor会不停的从自己对应的那个响应队列中获取响应,然后写回给对应的客户端。

2 对比RocketMQ的网络模型

        在RocketMQ中,使用的网络框架是netty,如果你了解netty更好,不了解也没关系,我这里将RocketMQ创建使用netty创建server的源码截出来,我们一起分析下。

        我们上面也介绍过,netty也是reactor模型,一个boss线程组负责建立连接,一个work线程组负责连接 请求信息读取与响应信息的写回,如果你是普通使用的话,work线程组还会处理你相应的业务逻辑。

        当一个客户端请求建立连接的时候,boss线程组就会与客户端建立连接,然后将连接分配到work线程组某个线程上去,让work线程处理这个连接后续 请求信息读取与响应信息的写回。到这里你会发现,boss线程组与kafka中的accept组件干的事差不多,然后work线程组与kafka中的processor线程干的事情差不多,可能唯一不一样的时候processor 将请求信息交出去了,然后这个work 线程自己处理了,其实在work线程处理的时候有个pipeline,你可以理解为有个链(理解为过滤器组都行, 就是个责任链模式)要经过一堆自定义的handler,这些handler就可能有你的处理逻辑,比如说拆包粘包,编解码,业务逻辑处理,但是你可以为某个handler,或者是某些handler指定处理的线程池。也就是某个或者某些handler的业务逻辑交给这个线程池处理。要是将业务逻辑的handler单独交给某个线程池处理,是不是就对应了kafka的RequestHandler线程干的活,你就会发现他们的运行处理逻辑差不多了。接下来看看RocketMQ broker使用netty框架的网络模型是啥样的。

  1. 第一个红框是boss线程组,默认是1个线程,而且是写死的。 ------》 对应着kafka accept 1个线程
  2. boss线程组后面那个红框work线程组 eventLoopGroupSelector,默认是3个线程,可以通过serverSelectorThreads 参数配置。------》对应着 kafka processor线程 3个。
  3. 最下面那个框 defaultEventExecutorGroup 具体业务逻辑线程组,主要业务逻辑的处理是在NettyServerHandler中,默认是8个线程,可以通过serverWorkerThreads 参数配置。—》对应着kafka requestHandler线程 8个。

        你会发现kafka与RocketMQ使用的网络模型相似,几乎一样,然后连默认的线程数都是一样的。其实不光网络模型相似,日志存储顺序写, 充分利用os cache高速写。

 参考链接

Kafka基本原理详解-CSDN博客

这是最详细的Kafka应用教程了 - 掘金

Kafka : Kafka入门教程和JAVA客户端使用-CSDN博客

简易教程 | Kafka从搭建到使用 - 知乎

kafka简介-CSDN博客

Kafka 架构及基本原理简析

kafka是什么

再过半小时,你就能明白kafka的工作原理了(推荐阅读)

Kafka 设计与原理详解

Kafka【入门】就这一篇! - 知乎

kafka简介_kafka_唏噗-华为云开发者联盟

kafka详解

Kafka 设计与原理详解_kafka的设计初衷不包括-CSDN博客

kafka学习知识点总结(三)

Kafka知识总结之Broker原理总结_kafka broker-CSDN博客

深度解析kafka broker网络模型运行原理_kafka broker原理-CSDN博客

Kafka源码分析及图解原理之Broker端 

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

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

相关文章

如何在 emacs 上开始使用 Tree-Sitter (archlinux)

文章目录 如何在emacs上开始使用Tree-Sitter(archlinux) 如何在emacs上开始使用Tree-Sitter(archlinux) 在archlinux上使用比windows上不知道要方便多少倍! $ sudo pacman -S emacs $ sudo pacman -S tree-sitter这里…

containerd中文翻译系列(十五)转运服务

传输服务是一种简单灵活的服务,可用于在源和目的地之间传输人工制品对象。灵活的应用程序接口(API)允许传输接口的每个实施方案决定是否可以在源和目的地之间进行传输。这样,实现者就可以直接添加新功能,而无需对应用程…

Java算法练习4

Java算法练习4 1.1 [145. 二叉树的后序遍历](https://leetcode.cn/problems/binary-tree-postorder-traversal/)1.2 [173. 二叉搜索树迭代器](https://leetcode.cn/problems/binary-search-tree-iterator/)1.3 [98. 验证二叉搜索树](https://leetcode.cn/problems/validate-bin…

【Java数据结构】ArrayList和LinkedList的遍历

一&#xff1a;ArrayList的遍历 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** ArrayList的遍历*/ public class Test {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(5);list…

MySQL篇之定位与优化MySQL慢查询

一、如何定位慢查询 1.方案一&#xff1a;开源工具 调试工具&#xff1a;Arthas。 运维工具&#xff1a;Prometheus 、Skywalking。 2.方案二&#xff1a;MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数&#xff08;long_query_time&#xff0c;单位&#xff1a;…

Filter 实现过滤符合条件的请求并落库

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、配置过滤器类 二、定义数据表、实体类、Mapper 2.1 DDL 2.2 实体类 2.3 Mapper 三、创建一个过滤器 四、实现 Nacos 配置…

分享86个行业PPT,总有一款适合您

分享86个行业PPT&#xff0c;总有一款适合您 86个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1avbzwqK8ILLWYIOylK1aRQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

住宅供暖设备行业调研:市场环境将稳定发展阶段中

为使人们生活或进行生产的空间保持在适宜的热状态而设置的供热设施。 向一定的空间加热量的办法&#xff0c;可以直接把产生热量的火炉装在其中;也可以抽出其中的空气&#xff0c;加热后再送回;也可以在其中装置保持在较高温度的物体&#xff0c;向所在空间放热。这种温度较高的…

Elasticsearch:通过 ingest pipeline 对大型文档进行分块

在我之前的文章 “Elasticsearch&#xff1a;使用 LangChain 文档拆分器进行文档分块” 中&#xff0c;我详述了如何通过 LangChain 对大的文档进行分块。那个分块的动作是通过 LangChain 在 Python 中进行实现的。对于使用版权的开发者来说&#xff0c;我们实际上是可以通过 i…

【c++】模板---函数模板

1.泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left,…

嵌入式学习之Linux入门篇笔记——18,makefile基本语法(下)

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.wildcard 函数 格式&#xff1a;$&#xff08;wildcard PAT…

爬虫系列-第一个爬虫

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 首先&#xff0c;我们需要回顾一下爬虫的概念&#xff0c;爬虫就是我们通过我们写的程序去抓取互联网上的数据资源&#xff0c;比如&#xff0c;此时我需要百度的资源&#xff0c;在不…

spring Bean生命周期 源代码分析 AbstractAutowireCapableBeanFactory createBean doCreateBean

文章目录 一、生命周期关键步骤1.1 前置条件1.2 创建bean 二、Bean生命周期、核心源码分析2.1 前置条件, 源代码2.2 创建bean, 源代码 一、生命周期关键步骤 1.1 前置条件 1.创建rootBean 生成RootBeanDefinition 2.对bean定义的方法&#xff0c;进行验证、重写 调用方法pre…

Blender教程(基础)-顶点挤出扩展-19

shiftA新建一个平面 编辑模式下&#xff0c;选中三个点&#xff0c;按X弹出按顶点删除 删除完成只剩下一个顶点 选中顶点按字母E在X轴挤出&#xff0c;按字母E在Y轴挤出 选中三个顶点按字母E延Z轴挤出 新建平面&#xff0c;按数字7到顶视图 选中顶点按E延X轴挤出 …

通用的网站炫酷底部美化代码分享

网站炫酷底部美化代码介绍 这段代码采用了最新的前端技术&#xff0c;确保在各种浏览器和设备上都能完美展现。它包含响应式设计元素&#xff0c;这意味着无论用户是通过电脑、平板还是手机访问您的网站&#xff0c;底部都能呈现出最佳的效果。 此外&#xff0c;我们还特别注…

单片机——ISP下载、ICP下载、IAP下载

文章目录 ISPICPIAP ISP 在线系统编程&#xff0c;使用引导程序加上外围UART/SPI接口烧录 其本质是将程序的hex文件烧录到板子里的过程 可以使用flymcu这个软件 System memory是STM32在出厂时&#xff0c;由ST在这个区域内部预置了一段BootLoader&#xff0c; 也就是我们常说…

机器人运动学林沛群——变换矩阵

对于仅有移动&#xff0c;由上图可知&#xff1a; A P B P A P B o r g ^AP^BP^AP_{B org} APBPAPBorg​ 对于仅有转动&#xff0c;可得&#xff1a; A P B A R B P ^AP^A_BR^BP APBA​RBP 将转动与移动混合后&#xff0c;可得&#xff1a; 一个例子 在向量中&#xff…

猫头虎分享已解决Bug || TypeError: this.$store.commit is not a function in Vue

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

c语言中的模拟多态性

在C语言中模拟多态性 多态性是面向对象编程中的一个核心概念&#xff0c;它允许我们通过一个共同的接口来操作不同的数据类型。虽然C语言是一种过程式语言&#xff0c;本身不直接支持面向对象的特性&#xff0c;如继承、封装和多态&#xff0c;但我们可以通过一些技巧来模拟这些…

@RequestBody、@RequestParam、@RequestPart使用方式和使用场景

RequestBody和RequestParam和RequestPart使用方式和使用场景 1.RequestBody2.RequestParam3.RequestPart 1.RequestBody 使用此注解接收参数时&#xff0c;适用于请求体格式为 application/json&#xff0c;只能用对象接收 2.RequestParam 接收的参数是来自HTTP 请求体 或 请…