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

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

大概说一下功能场景:

  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.rhkb.cn/news/85069.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15.3.2 【Linux】系统的配置文件:/etc/crontab,/etc/cron.d/*

这个“ crontab -e ”是针对使用者的 cron 来设计的,如果是“系统的例行性任务”时, 该怎么办呢?是否还是需要以 crontab -e 来管理你的例行性工作调度呢?当然不需要,你只要编辑/etc/crontab 这个文件就可以。有一点需…

Prometheus技术文档-基本使用-配置文件全解!!!!!

简介: Prometheus是一个开源的系统监控和告警系统,由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种时间序列数据,比如系统性能、网络延迟、应用程序错误等。Prometheus通过采集监控数据并存储在时间序列数据库中,…

【SpringBoot】日志是什么+基于lombok的日志输出

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE进阶 在我们日常的程序开发中,日志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗…

【华秋推荐】新能源汽车中的T-BOX系统,你了解多少?

近几年,新能源汽车产业进入了加速发展的阶段。我国的新能源汽车产业,经过多年的持续努力,技术水平显著提升、产业体系日趋完善、企业竞争力大幅增强,呈现市场规模、发展质量“双提升”的良好局面。同时,通过国家多年来…

TypeScript 中【class类】与 【 接口 Interfaces】的联合搭配使用解读

导读: 前面章节,我们讲到过 接口(Interface)可以用于对「对象的形状(Shape)」进行描述。 本章节主要介绍接口的另一个用途,对类的一部分行为进行抽象。 类配合实现接口 实现(impleme…

VR全景在建筑工程行业能起到哪些作用?

在建筑工程领域,数字化技术为行业的发展起到巨大的推动作用,虽然建筑施工行业主要是依赖于工人劳动力和施工设备,但是VR全景在该行业中方方面面都能应用,从设计建模到项目交付,帮助建筑师以及项目方更好的理解每个环节…

斗象科技-2023攻防演练必修高危漏洞集合下载(2个版本)

高危风险漏洞一直是企业网络安全防护的薄弱点,也成为HW 攻防演练期间 红队的重要突破口;每年HW 期间爆发了大量的高危风险漏洞成为红队突破网络 边界防护的一把利器,很多企业因为这些高危漏洞而导致整个防御体系被突破、 甚至靶标失守而遗憾出…

photoshop生成器引入到electron项目(electron与photoshop建立通信)

Photoshop引入了nodejs,在启动的时候,通过pipe调起nodejs运行时核心generator-builtin,通过KLVR机制与ps进行通信和交互,同时会加载用户编写的扩展。 这里记录一下引入时的踩坑过程 generator-core就是它的源码,elect…

Unity 编辑器资源导入处理函数 OnPreprocessAudio :深入解析与实用案例

Unity 编辑器资源导入处理函数 OnPreprocessAudio 用法 点击封面跳转下载页面 简介 在 Unity 中,资源导入是一个非常重要的环节,它决定了资源在项目中的使用方式和效果。Unity 提供了一系列的资源导入处理函数,其中之一就是 OnPreprocessAud…

Qt应用开发(基础篇)——拆分器窗口 QSplitter

一、前言 QSplitter继承于QFrame,QFrame继承于QWidget,是Qt的一个基础工具类。 框架类QFrame介绍 QSplitter拆分器,用户通过拖动子部件之间的边界来控制子部件的大小,在应用开发中数据分模块展示、图片展示等场景下使用。 二、QSp…

【金融量化】对企业进行估值的方法有哪些?

估值的方法有哪些? 如何对企业进行估值?有2个方法估算。 1 绝对估值法 它是一种定价模型,用于计算企业的内在价值。 比如说你可以根据公司近N年的现金流情况。借此去预测未来N年的现金流情况。所有的现金流数据都可以在年报上查询到。最后…

ip地址怎么改 手机ip地址怎么修改

IP地址是指互联网协议地址,是给互联网上的每台设备分配的一个唯一的标识符。改变IP地址是在一定的条件下,为了实现一些特定的目的而对设备的网络配置进行调整。下面将介绍一些常见的改变IP地址的方法。我们可以通过重启路由器或者计算机来更改IP地址。在…

那些年的Android开发经验记录

Android Studio 新版Logcat 从惊艳到放弃 AS总算更新了这个logcat了,原来的logcat真是使用起来贼难受,动不动过滤就失效,或者日志不打印,新版的logcat初步使用下来,那是贼舒服,先上一张界面图 一眼看…

柜柜软件报价单滑动闪屏解决办法

柜柜下载地址:家具设计软件免费下载-家居设计软件手机版下载-柜柜App官网 出现的问题现象: 原因:笔记本使用的集成显卡,切换到独立显卡即可解决 异常修复.

shell脚本条件测试语句,if,case

shell脚本条件测试语句,if,case 一.条件测试1.1test命令1.2文件测试1.2.1文件测试常见选项 1.3数值比较1.4字符串比较1.5逻辑测试 二.if语句2.1单分支结构2.3多分支 三.case语句 一.条件测试 1.1test命令 测试特定的表达式是否成立,当条件成…

嵌入式是大坑吗?

嵌入式不是坑,但里面遍地是坑。一不小心,你就会掉进去。 嵌入式覆盖的范围太广,低端的产品太多。 单片机叫嵌入式,开发板叫嵌入式,摄像头叫嵌入式,手机、平板电脑、通讯基站、无人机、机器人、自动驾驶汽…

PEFD-多投影蒸馏详细论文与代码解读(Improved Feature Distillation via Projector Ensemble)

论文链接:https://papers.nips.cc/paper_files/paper/2022/file/4ec0b6648bdf487a2f1c815924339022-Paper-Conference.pdf 源码链接:https://github.com/chenyd7/PEFD 文章目录 前言一、论文核心二、论文摘要三、论文内容四、集成投影方法五、源码环境安…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计em

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…

Java基础入门篇——修饰符

在Java中,修饰符(Modifiers)是一种用于修改类、方法、变量和其他实体的访问权限、行为或特性的关键字。Java提供了一组修饰符,可以用于实现对代码的封装、继承、多态和访问控制等功能。 1、访问修饰符(Access Modifie…

使用雅克比矩阵计算Rossler映射的lyapunov exponent图谱

Rossler映射如下: matlab代码如下: clear;%% ===========初始化输入============== yinit = [0.1,0.1,0.1]; orthmatrix = [1 0 0;0 1 0;0 0 1];y = zeros(12,1); y(1:3) = yinit; y(4:12) = orthmatrix;mod = zeros(3,1); lp = zeros(3,1);%% ============迭代控制=======…