摘要:Kafka网络模块之Server端,介绍Server端启动、接收请求和处理请求的过程。

本文分享自华为云社区《Kafka网络模块-Server端》,原文作者:中间件小哥 。

SocketServer 是 Kafka server 端用于处理请求的模块,在 Kafka 启动过程创建、初始化、启动。

SocketServer启动过程:

  • 按照 endpoint 顺序初始化 Acceptor,每个 endpoint 对应一个 Acceptor,为每个 Acceptor 创建 Processor(数量由 num.network.threads 配置项决定),并启动 Acceptor,Acceptor 启动后会通过 selector 监听连接,并将新建立的连接交给 Processor 处理(轮询选择 Processor)
  • 启动所有 Processor
    Acceptor启动、监听连接过程:

  • Acceptor启动后,会创建一个 serverSocketChannel,监听在该 acceptor 对应的 endpoint 上,并在 selector 上注册 OP_ACCEPT,然后进入死循环,每次循环,通过 selector 获取就绪的 key(即前面注册的 serverSocketChannel),表明有连接来到,然后通过 accept() 创建一个和该连接对应的 socketChannel,然后从该 acceptor 负责的 processors 中轮询选择一个,将该 socketChannel 交给选择的 processor 处理,即将连接交给 processor。
  • Acceptor 将连接交给 processor 处理,是将 socketChannel 加入 processor 的连接队列 newConnection 中,processor 在 run 方法中会不断地从中获取并处理。
  • Processor 从 newConnection 获取到 socketChannel 后,在 selector 上注册 OP_READ,并创建对应的 KafkaChannel。

Server端接收请求、处理的过程:

  • Processor 收到 OP_READ 的事件就绪后,检查并尝试完成 SSL 握手和 SASL 校验(此时不一定握手完成,所以在 Processor 收到 OP_READ 的事件就绪后,要先检查并确保握手已经完成,SSL/SASL相关参考 9.4 节)
  • SSL 握手和 SASL 校验完成后,从 channel 中读取数据,构造 NetworkReceive 对象,并入队 stagedReceives
  • 取出 stagedReceives 队首元素(移除),加入 completedReceives
  • 将 completedReceives 中的元素取出(不移除),构造 Request 对象,加入 requestQueue,移除对 OP_READ 的事件注册,并将对应的 KafkaChannel 置为 MUTED,再置为 MUTED_AND_RESPONSE_PENDING
  • KafkaRequestHandler 从 requestQueue 取出元素(移除),并交给 KafkaApi 模块处理请求
  • KafkaApi 处理完请求后,将响应放入对应的 processor 的 responseQueue 和 inflightResponses 中,并唤醒其 selector
  • Processor 从 responseQueue 中取出响应(移除),若响应是需要发回给客户端的,则将响应的 send 赋值给 KafkaChannel,并注册 OP_WRITE 事件
  • 当 channel 写就绪后,将 send 写入 channel 的写 buffer,当 send 写完后,移除对 OP_WRITE 事件的注册,并将 send 加入 completedSends
  • 从 inflightResponses 中移除对应的响应,执行响应回调,将 KafkaChannel 置为 MUTED,再从 MUTED 置为 NOT_MUTED,并重新添加 OP_READ 事件注册

点击关注,第一时间了解华为云新鲜技术~

Kafka 源码解析:Server 端的运行过程的更多相关文章

  1. Netty源码解析---服务端启动

    Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...

  2. Flink 源码解析 —— JobManager 处理 SubmitJob 的过程

    JobManager 处理 SubmitJob https://t.zsxq.com/3JQJMzZ 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1 ...

  3. Flink 源码解析 —— TaskManager 处理 SubmitJob 的过程

    TaskManager 处理 SubmitJob 的过程 https://t.zsxq.com/eu7mQZj 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink ...

  4. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

  5. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  6. 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本

    老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...

  7. Netty 源码解析(九): connect 过程和 bind 过程分析

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第九篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...

  8. Netty源码解析 -- 服务端启动过程

    本文通过阅读Netty源码,解析Netty服务端启动过程. 源码分析基于Netty 4.1 Netty是一个高性能的网络通信框架,支持NIO,OIO等多种IO模式.通常,我们都是使用NIO模式,该系列 ...

  9. 【转】aiohttp 源码解析之 request 的处理过程

    [转自 太阳尚远的博客:http://blog.yeqianfeng.me/2016/04/01/python-yield-expression/] 使用过 python 的 aiohttp 第三方库 ...

  10. Fabric1.4源码解析:客户端创建通道过程

    在使用Fabric创建通道的时候,通常我们执行一条命令完成,这篇文章就解析一下执行这条命令后Fabric源码中执行的流程. peer channel create -o orderer.example ...

随机推荐

  1. 从0到1实现 OpenTiny 组件库跨框架技术

    本文分享自华为云社区<从0到1实现 OpenTiny 组件库跨框架技术>,作者:华为云社区精选 . 在华为云<DTSE Tech Talk>技术直播第44期<0基础玩转 ...

  2. 飞码LowCode前端技术系列(一):数据结构设计

    简介 飞码是京东科技研发的低代码产品,可使营销运营域下web页面快速搭建.飞码是单web页面搭建工具,从创建页面到监测再到投产的一站式解决方案.会通过七篇文章介绍飞码,分别是:(1)背景与数据结构设计 ...

  3. 组合的输出 题解(lgP1157)

    一看就是 dfs 然而窝并不会做 调了一个多小时才调出来.漏洞连篇.(第一次写的基本没有对的地方QAQ 题解见注释. #include<bits/stdc++.h> using names ...

  4. 2022-10-22 CSP赛前隔离时的模拟赛 2:3

    T1 简单红题,不懈于写. 锐评:镜子反射出来的竟然没有镜像一下. T2 坑人东西调了 2h. 类似于 round1 的 T4. 线性 \(\Theta(n)\) 过. T3 T4 其实简单,负边权要 ...

  5. 关于MM32F001无法debug的问题

    以下问题仅来自于个人的调试发现和猜测, 并不代表芯片有任何问题. 实际上我也仅仅是试用了一下. 主要发现芯片总是被锁住(FLASH被写保护?),具体如下: (1) 内存溢出时芯片被写保护, 导致再次d ...

  6. WPF --- 如何重写WPF原生控件样式

    引言 上一篇中 WPF --- 重写DataGrid样式,因新产品UI需要,重写了一下微软 WPF 原生的 DataGrid 的样式,包含如下内容: 基础设置,一些基本背景色,字体颜色等. 滚动条样式 ...

  7. Django学习(一) 之 环境搭建

    写在前面 最近比较迷AI绘图,那就上个图吧,我感觉还挺好看的. 可能会有人说,之前不一致分享的是flask吗,怎么突然改到django了? 这个问题问得好,开发环境遇到了一些小困难! 不过django ...

  8. maven使用指定的pom文件构建子模块

    有条件的同学建议直接浏览原文: https://stackoverflow.com/questions/33396390/custom-pom-xml-filename-in-maven-multim ...

  9. 本地数据备份与FTP远程数据迁移

    数据是电脑中最重要的东西.为了保证数据安全,我们经常会对数据进行备份.之前一直采用将重要数据拷贝至移动硬盘的方式实现备份,实现简单但每次都需要把所有文件拷贝一次,当文件很大时效率较低. 因此,考虑使用 ...

  10. C与Verilog差别

    C没有时钟概念,Verilog有时钟边沿触发. C无建立保持时间要求,Verilog要计算建立保持时间,并进行优化 C与工艺无关,Verilog依赖底层工艺cell,相同代码不同cell差异较大. V ...