Reactor网络线程模型

目录

传统下网络服务模型 

事件监听模型

 NIO核心概念

单线程Reactor模式 

多线程Reactor模式 

Kafka 的网络设计

主要概念 

类比思维理解

参考文章


传统下网络服务模型 

  • 线程太多
  • 无法处理大规模请求

事件监听模型

 NIO核心概念

nio是实现reactor模式的底层API代码 

单线程Reactor模式 

优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成;

缺点1:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈;

缺点2:可靠性问题,线程意外终止,或进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障;
 

多线程Reactor模式 

整体工作流程如下:

  1. Reactor线程接受新的客户端连接,并通过Acceptor初始化连接。
  2. Reactor线程继续监听并分发读写事件,不执行任何业务逻辑计算。
  3. 对于需要处理的请求,Reactor将任务提交到线程池。
  4. 线程池中的工作线程按需从队列中取出任务,执行解码、计算和编码操作。
  5. 一旦响应准备好,相关的数据可以返回给Reactor线程,由它发送回客户端。 

链接: Scalable IO in Java.pdf 

Kafka 的网络设计

Kafka 的网络设计和 Kafka 的调优有关,这也是为什么它能支持高并发的原因: 

主要概念 

Kafka的网络设计采用了Reactor模式,这是一种高效处理并发网络连接的模式。在Reactor模式中,有几个关键的组件:

  1. Acceptor

    • 负责处理新的网络连接请求。
    • 通常运行在单独的线程上,监听指定的端口。
    • 一旦有新的连接请求,它会接受连接并创建一个socket channel。
  2. Processor

    • 处理来自socket channel的I/O事件(如读写操作)。
    • Processor通常维护一个或多个socket channels,并使用非阻塞I/O来同时服务多个连接。
  3. Socket Channel

    • 表示与客户端之间的网络连接。
    • 在非阻塞模式下,socket channel可以在没有I/O操作可以执行时返回,这允许单个线程高效处理多个连接。
  4. 请求队列(Request Queue)响应队列(Response Queue)

    • 网络线程接收数据后,会把请求放入请求队列,由后台的I/O线程(或请求处理器)进行处理。
    • 处理完的响应被放入响应队列,等待网络线程读取并发送回客户端。

在Kafka中,这个模型被用来实现高效的网络通信。网络线程(Processor)只负责网络I/O的读写,实际的消息处理逻辑(例如消息的解码、提交到日志等)由其他线程处理,从而实现了计算和I/O的解耦,提高了整体的性能和可伸缩性。

具体到Kafka的实现,它使用了一个或多个网络线程来处理所有网络活动,每个线程可以处理多个连接。这些线程不断地检查socket channels,看是否有新的数据可读或是否可以写入数据到网络。使用非阻塞I/O确保了单个线程可以有效地处理多个网络请求,而不会因为某个慢速的连接而阻塞。

我们可以看到Acceptor和Processor的逻辑分工,以及请求和响应在系统中如何流动。请求被放入队列,处理器从队列中拉取请求进行处理,然后处理完的响应被放回另一个队列等待发送。这个设计允许Kafka的网络层高效地处理成千上万的并发连接。

类比思维理解

想象你在一个快餐店,这个快餐店的运作非常类似于Reactor网络线程模型:

  1. Acceptor(接待员):

    • 顾客一进门,接待员负责迎接并指引顾客到点餐台。
    • 在Reactor模型中,Acceptor相当于是接受新连接的组件,一旦有新的网络连接,它接受连接并创建一个通信通道。
  2. Processor(点餐台工作人员):

    • 点餐台的工作人员负责处理顾客的订单。他们听取顾客的要求,记录订单,然后将订单传递给厨房。
    • 在Reactor模型中,Processor处理来自客户端的I/O事件,比如读取数据(接受订单)和写入数据(发送订单到厨房)。
  3. Socket Channel(订单流转路径):

    • 订单从点餐台到厨房再到顾客手中的路径。
    • 在Reactor模型中,Socket Channel是客户端和服务端通信的通道。
  4. 请求队列(订单队列):

    • 订单被记录在订单队列中,等待厨房处理。
    • 在Kafka的网络模型中,请求队列保存了待处理的网络请求。
  5. 厨房(业务处理器):

    • 厨房的工作人员根据订单制作食物。
    • 在Reactor模型中,业务逻辑处理器执行类似的角色,它处理业务逻辑并准备响应。
  6. 响应队列(成品出餐区):

    • 制作完成的食物被放在成品区,等待服务员送到顾客手中。
    • 在Reactor模型中,响应队列用于存放处理完毕的数据,等待发送回客户端。

在这个快餐店模型中,点餐台工作人员(Processor)可以同时处理多个顾客的订单(非阻塞I/O),并且不需要自己做饭(业务逻辑处理)。这种工作流程让快餐店(服务器)可以高效地服务众多顾客(并发连接)。当食物准备好后,服务员(网络线程)将其送到顾客手中(发送响应)。这样的模型允许快餐店以最小的人力高效运作,类似地,Reactor模型使得服务器能够以最小的资源高效处理大量并发网络请求。

所以这就是一个加强版的 Reactor 网络线程模型。

参考文章

Reactor 线程模型_reactor模型_HoryC的博客-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SparkSQL】SparkSQL函数定义(重点:定义UDF函数、使用窗口函数)

【大家好,我是爱干饭的猿,本文重点介绍SparkSQL 定义UDF函数、SparkSQL 使用窗口函数。 后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】 上一篇文章:《【SparkSQL…

C++相关闲碎记录(2)

1、误用shared_ptr int* p new int; shared_ptr<int> sp1(p); shared_ptr<int> sp2(p); //error // 通过原始指针两次创建shared_ptr是错误的shared_ptr<int> sp1(new int); shared_ptr<int> sp2(sp1); //ok 如果对C相关闲碎记录(1)中记录的shar…

【前缀和]LeetCode1862:向下取整数对和

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 …

一文带你了解网络安全简史

网络安全简史 1. 上古时代1.1 计算机病毒的理论原型1.2 早期计算机病毒1.3 主要特点 2. 黑客时代2.1 计算机病毒的大流行2.2 知名计算机病毒2.3 主要特点 3. 黑产时代3.1 网络威胁持续升级3.2 代表性事件3.3 主要特点 4 高级威胁时代4.1 高级威胁时代到来4.2 著名的APT组织4.3 …

Python之Requests模块简介与安装

Requests模块简介 在python的标准库中&#xff0c;虽然提供了urllib,utllib2,httplib&#xff0c;但是做接口测试&#xff0c;requests使用更加方便快捷&#xff0c;正如官方说的&#xff0c;“让HTTP服务人类”。 Requests是用python语言基于urllib编写的&#xff0c;采用的是…

利用异或、取反、自增bypass_webshell_waf

目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件&#xff1a; function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…

折扣因子的变化图(Python)

var 3 var_list [3] for _ in range(50):var * .95var_list.append(var)import matplotlib.pyplot as plt import numpy as np plt.plot(np.arange(len(var_list)), var_list, linewidth1) plt.show()

美丽的时钟

案例绘制一个时钟 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>美丽的时钟</title><script language"javascript">window.onloadfunction(){var clockdocument.getElementById("clock"…

你需要知道所有设计模式吗?

后续我会详细展开设计模式 &#x1d5d7;&#x1d5fc; &#x1d5ec;&#x1d5fc;&#x1d602; &#x1d5e1;&#x1d5f2;&#x1d5f2;&#x1d5f1; &#x1d5e7;&#x1d5fc; &#x1d5de;&#x1d5fb;&#x1d5fc;&#x1d604; &#x1d5d4;&#x1d5f9;&…

溜冰场电脑收银系统软件会员管理操作教程,佳易王溜冰场会员卡管理软件下载

溜冰场电脑收银系统软件会员管理操作教程&#xff0c;佳易王溜冰场会员卡管理软件下载 一、软件 部分功能简介&#xff1a; 1、会员信息登记 &#xff1a;可以直接使用手机号登记&#xff0c;也可以使用实体卡片&#xff0c;推荐用手机号即可。 2、会员卡类型 &#xff1a;可…

Redis:事务操作

目录 Redis事务定义相关命令事务的错误处事务冲突的问题Redis事务三特性 Redis事务定义 redis事务是一个单独的隔离操作&#xff0c;事务中的所有命令都会序列化、按顺序地执行&#xff0c;事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 redis事务…

HTAP 还可以这么玩?丨TiDB 在 IoT 智慧园区的应用

作者&#xff1a;某物联网公司设施云平台负责人 用户简介&#xff1a;我们是一家提供全链智慧园区整体解决方案的物联网公司&#xff0c;致力于打造可持续发展的智慧园区。 基础设施平台简介 基础设施平台是集团一线作业人员日常工作中高度依赖的重要系统&#xff0c;涵盖了各…

涉密计算机违规外联原因及防范措施

高度信息化的时代&#xff0c;涉密计算机违规外联已成为一种严重的安全威胁。涉密计算机违规外联是指涉密计算机通过互联网、电子邮件等方式与外部计算机或网络进行连接&#xff0c;导致机密信息泄露或被恶意攻击。 为了应对这一问题&#xff0c;本文将探讨涉密计算机违规外联的…

WPF实战项目十九(客户端):修改RestSharp的引用

修改HttpRestClient&#xff0c;更新RestSharp到110.2.0&#xff0c;因为106版本和110版本的代码不一样&#xff0c;所以需要修改下代码 using Newtonsoft.Json; using RestSharp; using System; using System.Threading.Tasks; using WPFProjectShared;namespace WPFProject.S…

wps备份功能 救了我一命

感谢wps备份功能 救了我一命 文章目录 感谢wps备份功能 救了我一命**&#x1f4dd;场景回现&#xff0c;往后再不干了**&#x1f9e3;灵光一现&#x1f4c7;备注中心的设置流程&#x1f58a;️最后总结 &#x1f4dd;场景回现&#xff0c;往后再不干了 小&#x1f42e;今天接到…

理解BatchNormalization层的作用

深度学习 文章目录 深度学习前言一、“Internal Covariate Shift”问题二、BatchNorm的本质思想三、训练阶段如何做BatchNorm四、BatchNorm的推理(Inference)过程五、BatchNorm的好处六、机器学习中mini-batch和batch有什么区别 前言 Batch Normalization作为最近一年来DL的重…

Spring Task

1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 为什么要在Java程序中使用Spring Task&#xff1f; 应用场景&#xff1a; 1). 信用卡…

MyBatis-Plus动态表名使用selectPage方法不生效问题解析与解决

文章目录 MyBatis-Plus动态表名简介selectPage方法不生效的问题解决方案&#xff1a;SqlParser注解与BaseMapper的selectPage方法示例代码实体类Mapper接口Service层Controller层 总结 &#x1f389;MyBatis-Plus动态表名使用selectPage方法不生效问题解析与解决 ☆* o(≧▽≦)…

【每日OJ —— 144. 二叉树的前序遍历】

每日OJ —— 144. 二叉树的前序遍历 1.题目&#xff1a;144. 二叉树的前序遍历2.方法讲解2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;144. 二叉树的前序遍历 2.方法讲解 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间&#xff0c;这样…

linux基础五:linux 系统(进程状态2:)

linux 系统 一.进程状态&#xff1a;1.睡眠状态(sleep)&#xff1a;2.磁盘休眠状态(disk sleep)&#xff1a;3.停止状态(stoped --- T)&#xff1a;4.死亡状态&#xff1a;5.控制状态&#xff08;t&#xff09; 二.僵尸进程和孤儿进程&#xff1a;1.僵尸状态&#xff1a;2.孤儿…