分布式异步任务组件(八)

news2024/10/6 0:33:30

分布式异步任务组件网络通信线程模型设计--

大概说一下功能场景:

  1. 从节点和主节点建立连接,负责和主节点的网络IO通信,通信动作包括投票,心跳,举证等,步骤为读取主节点的信息,写入IO队列中,然后从IO队列中读取解码,翻译成具体的协议命令,发送给上层线程处理;或者从上层线程接受命令,编码成字节流,写入IO队列,通信线程从IO队列中读取需要发送的字节buffer,通过网络发送给主节点;
  2. 主节点和多个从节点建立连接,负责每个从节点的网络IO通信,包括投票,心跳,举证操作,具体操作和从节点的操作相同,多了一个建立连接的步骤--如图

初期线程模型设计--

每条网络数据传输通道一条线程,即一条线程负责网络IO处理,另外一条线程处理数据编解码,整体使用同一个IOQueue--其实这里是两个;读写队列分开;但在线程模型里我们认为面对的是一个IOQueue即可;如图

首先说一下线程拆分的原则--

基于事件反应器设计下的原子性保证--

NIO中的一个socketchannel面对的是一个连接,底层可以理解为一个线程在处理数据IO,IO事件通过selector发布;这里一个selector可以处理多个Socket连接的多个事件,但是selector本身的设计实现是同步模式的,多线程读取selector中的事件需要阻塞,也就是说同一时刻只能有一个线程读取selector中的事件并消费;如果有多个线程同时监听selector中的事件未获取到锁的线程只能阻塞,所以这里对一个selector对象只使用一个线程处理IO事件(读写可以分开为两个事件);

对于同一个通信连接中的数据可能出现拆包和粘包的现象,所以这里对一个连接只使用一个IO队列;相对应的,对同一个读写队列也只使用一个线程来处理--但是这里读写队列是分开的;

对于同一个命令的处理也应该是原子的,所以对同一个命令也需要一个线程来操作;

主要关注一下可以线程拆分的几个点:

  1. JavaNIO实现的TCP是半双工通道,也就是同一个channel可以读也可写,但是同一时刻只能进行读或者写操作中的同一个,所以这点对于底层通信线程设计很重要;
  2. 同一个通信连接的读和写操作是否需要拆分:
    1. 一个线程负责读数据,一个线程负责写数据;
    2. 如果对一个Socketchannel的读写分开两个线程操作的话,有两种设计方案:一个socketchannel只注册到一个selector上,读写线程各自监听同一个selector的读写事件,分别处理读操作和写操作;
    3. 另一种是两个线程分别拥有自己的selector,每个线程从各自的selector上单独监听读事件或者写事件--这样其实已经违反了NIO设计的原则,--NIO核心是一个线程可以监听多个channel,如果一个channel使用多个线程监听的话反而不如使用BIO来处理,因为channel实际上是半双工实现,读和写操作都是同步进行的;
    4. --综上,读写同步进行的情况下,使用多线程读写并不能实际上增加并发度;因为如果读写分开的话,读线程必须等写线程写完数据才可以读取;反之一样;而读写数据本身的操作只不过是完成一个队列操作;
    5. 另外,如果多线程对同一IO队列并发读写要考虑顺序问题
  3. 这里实现为为每个IO连接维护命令队列,可以使用线程池进行编解码--具体那种效果最好要看后期压测结果;

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

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

相关文章

Kotlin基础(十一):反射和注解

前言 本文主要讲解kotlin反射和注解。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 kotlin反射 1.1.1 kotlin反射概念和常见使用场景 在Kotlin中,反射是一种能够在运行时动态地获取、检查和操作类、属性、方法等结构的能力。Kotlin为反射提供了一…

vue新学习 05vue的创建运行原理

01.vue的创建过程 Vue的生命周期是指Vue实例从创建到销毁的整个过程中经历的一系列阶段。Vue的生命周期分为8个阶段,分别是: beforeCreate(创建前):在实例初始化之后,数据观测和事件配置之前被调用。此时…

后台管理系统中----菜单的展开和收起

1.下载vuex npm i vuex3.6.2 2.创建文件夹 src/store/index import Vue from "vue"; import Vuex from "vuex"; Vue.use(Vuex); import tab from "./tab"; export default new Vuex.Store({modules: {tab,}, });注册Vuex并且注册tab模块 来控…

Spring系列三:基于注解配置bean

文章目录 💗通过注解配置bean🍝基本介绍🍝快速入门🍝注意事项和细节 💗自己实现Spring注解配置Bean机制🍝需求说明🍝思路分析🍝注意事项和细节 💗自动装配 Autowired&…

RISC-V基础之内存分布与映射

内存映射是指将地址空间划分为不同的部分或段,每个段有不同的用途和属性。这段话介绍了五个段:文本段、全局数据段、动态数据段、异常处理器段和操作系统(OS)段。下面是对每个段的简要说明: 文本段:存放程序…

cookie、sessionStorage、localStorage的使用介绍,通过localStorage保存当前菜单、已打开菜单

这篇文章主要介绍前端常用的几种存储技术cookie、storage(sessionStorage、localStorage)的简单介绍和使用方法。 一、cookie 1、在JavaScript中使用cookie 使用原生的cookie // 设置cookie document.cookie "nameTom;age18;";// 获取coo…

使用Python和wxPython构建中文OCR截图工具

引言: 随着数字化时代的到来,我们经常需要从图像中提取文本信息。而在处理中文文本时,OCR(Optical Character Recognition,光学字符识别)技术发挥着重要作用。本文将介绍如何使用Python编程语言和wxPython图…

powershell几句话设置环境变量

设置环境变量比较繁琐,现在用这段话,在powershell中就可以轻松完成。 $existingPath [Environment]::GetEnvironmentVariable("Path", "Machine") $newPath "C:\Your\Path\Here"if ($existingPath -split ";"…

ORACLE常用基础

. 1.oracle开机启动流程 su - oracle lsnrctl start lsnrctl status sqlplus / as sysdba startup 2、如何查看数据库版本 select * from v$version; 3.如何查看用户从那个设备连接的数据库 SELECT DISTINCT machine , terminal FROM V$SESSION; 4.如何查看表结构 selec…

【严重】Apache Airflow Run Task 权限绕过漏洞

漏洞描述 Airflow 是一个开源的工作流自动化平台,它允许用户定义、调度和监视工作流任务的执行。Run Task 是通过 Airflow 的 Web 界面或命令行工具。 在 Airflow 受影响版本中,Run Task 功能允许用户手动触发执行特定的任务,而不受正常的任…

CASAIM与迈普医学合作,基于CT数据三维重建和设计,在医疗辅具研究开发中实现高精度三维建模和偏差比对

近期,CASAIM与广州迈普再生医学科技股份有限公司(简称:迈普医学)合作,基于CT数据三维重建和设计,在医疗辅具研究开发中实现高精度三维建模和偏差比对,实现与缺损区域的精确匹配。 迈普医学&…

全新二开美化版UI好看的社区源码下载/反编译版

2023全新二开美化版UI精美的社区源码下载/反编译版 之前我分享过Rule原版,相信大家已经有很多人搭建好了。这次我要分享的是RuleAPP的二开美化版(请尊重每个作者的版权),这个版本没有加密,可以进行反编译,…

C#实现SqlServer数据库同步

实现效果: 设计思路: 1. 开启数据库及表的cdc,定时查询cdc表数据,封装sql语句(通过执行类型,主键;修改类型的cdc数据只取最后更新的记录),添加到离线数据表; 2. 线程定时查询离线数据表&#xf…

访问器模式(C++)

定义 表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。 应用场景 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接…

分布式理论之CAP与BASE

分布式理论之CAP与BASE 一、什么是CAP1. 一致性(Consistency):2. 可用性(Availability):3. 分区容错性(Partition tolerance):4. CAP小结: 二、AP&CP如何…

通向架构师的道路之weblogic与apache的整合与调优

一、BEAWeblogic的历史 BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、 网络应用和数据库应 用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的 开发、集成、部署和管理之中。 BEA WebLogic Server拥有处理关键Web应…

气味传感器

本文将通过图文及视频的形式为各位介绍太阳诱电因应市场需求而开发的气味传感器产品。高浓度端采用QCM型,较低浓度端采用MEMS半导体型。另外还准备有FBAR型转换器。 太阳诱电为实现高灵敏度感应而开发了3款转换器。  高浓度端采用QCM型,较低浓度端采用…

python excel 操作

excel文件内容如下: 一、xlrd 读Excel 操作 1、打开Excel文件读取数据 filexlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r 2、常用函数 (1)获取一个sheet工作表 table file.sheets(…

LeetCode 热题 100 JavaScript--234. 回文链表

function ListNode(val, next) {this.val val undefined ? 0 : val;this.next next undefined ? null : next; }var isPalindrome function (head) {if (!head || !head.next) {return true; }// 使用快慢指针法找到链表的中间节点let slow head;let fast head;while …

在win10上安装Docker desktop,并在docker中安装mysql

操作步骤: 安装docker 去 官网 下载安装软件;选择windows 2. 依次点击安装; 安装完成后无需登录,直接启动即可; 如果有提示需要更新wsl,执行以下命令更新: wsl --update wsl --status 查看状态 验证一下 适用命令:docker run hello-world 设置国内镜像 docker安装mysql…