Kafka是如何应用NIO实现网络通信的?(上)

简介: Kafka是如何应用NIO实现网络通信的?

网络通信层

Kafka网络通信层架构

kafka请求全处理流程

image.png

请求处理流程:

  1. Clients或其他Broker通过Selector机制发起创建连接请求
  2. Processor线程接收请求,并将其转换成可处理的Request对象
  3. Processor线程将Request对象放入Request队列
  4. KafkaRequestHandler线程从Request队列中取出待处理请求,并进行处理
  1. KafkaRequestHandler线程将Response放回到对应Processor线程的Response队列
  2. Processor线程发送Response给Request发送方

生产者-消费者模式的应用

Acceptor和Processor之间缓存SocketChannel newConnections队列,保证线程安全顺序。


Processor和KafkaRequestHandler之间缓存阻塞队列RequestChannel的Request全局队列和Response局部队列。


Kafka网络通信组成

  • SocketServer
    核心,主要实现了Reactor模式,用于处理外部多个Clients(广义Clients,可能包含Producer、Consumer或其他Broker)的并发请求,并负责将处理结果封装进Response中,返还给Clients。

SocketServer是Kafka网络通信层中最重要的子模块。它的Acceptor线程、Processor线程和RequestChannel等对象,都是实施网络通信的重要组成部分。

KafkaRequestHandlerPool

I/O线程池,里面定义了若干个I/O线程,用于执行真实的请求处理逻辑。KafkaRequestHandlerPool线程池定义了多个KafkaRequestHandler线程,而KafkaRequestHandler线程是真正处理请求逻辑的地方。

两者共通处在于SocketServer中定义的RequestChannel对象和Processor线程。

在代码中,线程本质都是Runnable类型,不管是Acceptor类、Processor还是KafkaRequestHandler类。


相较于KafkaRequestHandler,Acceptor和Processor最多算请求和响应的“搬运工”。


SocketServer

image.png

AbstractServerThread类

这是Acceptor线程和Processor线程的抽象基类


Acceptor线程类

接收和创建外部TCP连接的线程。每个SocketServer实例只会创建一个Acceptor线程。

唯一作用创建连接,并将接收到的Request传递给下游的Processor线程。


Processor线程类

每个SocketServer实例默认创建若干个(num.network.threads)Processor线程。

负责


将接收到的Request添加到RequestChannel的Request队列

将Response返还给Request发送方

Processor伴生对象类

仅定义一些与Processor线程相关的常见监控指标和常量等,如Processor线程空闲率等。


ConnectionQuotas类

image.png

TooManyConnectionsException类

image.png

  • SocketServer类
    实现了对以上所有组件的管理和操作,如创建和关闭Acceptor、Processor线程。
  • SocketServer伴生对象类
    定义了一些有用的常量,同时明确了SocketServer组件中的哪些参数是允许动态修改的。

Acceptor线程

经典Reactor模式的Dispatcher接收外部请求并分发给下面的实际处理线程。在Kafka中,这个Dispatcher就是Acceptor线程。

参数

endPoint

定义的Kafka Broker连接信息,比如PLAINTEXT://localhost:9092

image.png

sendBufferSize

image.png

recvBufferSize

image.png

如果在你的生产环境中,Clients与Broker的通信网络延迟很大(RTT>10ms),推荐增加控制缓冲区大小的两个参数:sendBufferSize和recvBufferSize,一般默认值100KB太小了。

Acceptor线程的自定义属性:


nioSelector

Java NIO库的Selector对象实例,也是后续所有网络通信组件实现Java NIO机制的基础

processors

网络Processor线程池。Acceptor线程在初始化时,需要创建对应的网络Processor线程池。Processor线程是在Acceptor线程中管理和维护的。

Processor相关API

  • addProcessors
  • image.png
  • removeProcessors
  • image.png
  • 于是Acceptor类就具备Processor线程池管理功能。
  • Acceptor类的run方法 - 处理Reactor模式中分发
  • 8.png
  • Acceptor线程会先为每个入站请求确定要处理它的Processor线程


Acceptor线程使用Java NIO的Selector、SocketChannel循环轮询就绪的I/O事件(SelectionKey.OP_ACCEPT)。一旦接收到外部连接请求,Acceptor就指定一个Processor线程,并将该请求交由它,让它创建真正的网络连接。


Processor线程

  • 源码
  • image.png
  • 执行流程
  • 9.png
  • 每个Processor线程在创建时都会创建3个队列:可能是阻塞队列,也可能是一个Map对象
目录
相关文章
|
21天前
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色🌐。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信🔗。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用📚。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
1天前
|
安全 网络协议 算法
【计算机网络】http协议的原理与应用,https是如何保证安全传输的
【计算机网络】http协议的原理与应用,https是如何保证安全传输的
|
1天前
|
监控 安全 算法
网络安全与信息安全:防范漏洞、应用加密技术与提升安全意识
【4月更文挑战第29天】在数字化时代,网络安全和信息安全已成为我们日常生活和工作中不可或缺的一部分。本文将深入探讨网络安全中的漏洞问题,加密技术的应用以及提升个人和企业的安全意识。通过对这些方面的知识分享,希望能帮助读者更好地理解和应对网络安全挑战。
|
1天前
|
安全 算法 网络安全
网络安全与信息安全:防范漏洞、应用加密技术与培养安全意识
【4月更文挑战第29天】 在数字化时代,网络安全与信息安全保障已成为全球关注的焦点。随着网络攻击手段的不断演进和信息技术的快速发展,个人、企业乃至国家安全均面临着前所未有的挑战。本文深入探讨了网络安全漏洞的概念、成因及其对信息系统的潜在威胁,同时分析了现代加密技术的基本原理和应用实例,并强调了提升全民网络安全意识的重要性。通过阐述这些关键要素,旨在为读者提供全面的网络安全知识架构,以更好地应对网络环境中的安全风险。
|
3天前
|
Rust 前端开发 安全
【专栏】WebAssembly 技术:开启高性能网络应用新时代
【4月更文挑战第27天】WebAssembly是种虚拟机格式,用于在浏览器中运行编译后的C/C++、Rust等语言代码,提供高性能、高可移植性和安全性。其优势在于更快的执行速度、跨平台兼容及安全的沙箱环境。广泛应用在游戏开发、图形处理、计算机视觉等领域。未来,WebAssembly将支持更多语言,结合低代码平台,优化开发流程,同时应对优化编译和安全性的挑战,引领高性能网络应用新时代。
|
3天前
|
安全 物联网 5G
|
4天前
|
存储 SQL 安全
网络安全与信息安全:防范漏洞、应用加密技术与提升安全意识
【4月更文挑战第26天】 在数字化时代,网络安全和信息安全已成为保护个人隐私、企业资料以及国家安全的关键。本文深入探讨了网络安全的脆弱点——包括软件漏洞、人为错误及外部攻击,并详细分析了加密技术如何作为防御工具来确保数据传输的安全。文章还强调了增强个人和组织的安全意识对于构建坚固防线的重要性。通过实际案例分析和最新的研究成果,本文旨在为读者提供一个全面的网络安全策略框架,以应对不断演变的威胁。
|
5天前
|
安全 网络协议 网络安全
探索 SOCKS5 代理在跨境电商中的网络安全应用
跨境电商面临网络安全挑战,如数据泄露和欺诈。SOCKS5代理和代理IP技术成为解决方案。SOCKS5提供安全连接和匿名性,保护企业网络和数据;代理IP隐藏真实IP,降低攻击风险。通过数据加密、防止地理限制和抵御竞争对手分析,这两项技术助力跨境电商强化安全,扩展全球市场。但需结合其他安全措施,构建全面防护体系,以实现安全发展。
|
6天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
12天前
|
机器学习/深度学习 语音技术 网络架构
【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
【视频】LSTM神经网络架构和原理及其在Python中的预测应用|数据分享
22 0

热门文章

最新文章