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

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

大概说一下功能场景:

  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.mzph.cn/news/32128.shtml

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

相关文章

解决ElementUI动态表单校验验证不通过

这里记录一下&#xff0c;写项目时遇到的一个问题&#xff1a;就是动态渲染的表单项&#xff0c;加验证规则后一直不通过&#xff01;&#xff01;&#xff01; 原代码 html部分&#xff1a; <el-form-itemv-for"(teaclass,index) in addFom.classIds":label&quo…

C++ 代码常用规范记录

根据代码review时&#xff0c;大家给的commonts中的常见问题做此记录&#xff0c;后续编写代码时需要自行check是否有以下问题 一、参数合理性check 函数输入参数&#xff0c;如指针是否为空的check&#xff1b;配置文件中设置的参数是否合法&#xff0c;是否超过限制等 二、…

JVM运行时五大数据区域详解

前言&#xff1a; java虚拟机再执行Java程序的时候把它所拥有的内存区域划分了若干个数据区域。这些区域有着不同的功能&#xff0c;各司其职。这些区域不但功能不同&#xff0c;创建、销毁时间也不同。有些区域为线程私有&#xff0c;如&#xff1a;每个线程都有自己的程序计数…

什么是MVVM?

MVVM&#xff0c;是Mode1-View-ViewModel的简写&#xff0c;是M/-V-VM三部分组成。它本质上就是MVC的改进版。MVVM就是将其中的View的状态和行为抽象化&#xff0c;其中ViewModel将视图U和业务逻辑分开&#xff0c;它可以取出Model的数据间时帮忙处理View中由于需要展示内容而涉…

“深入解析JVM:探索Java虚拟机的工作原理“

标题&#xff1a;深入解析JVM&#xff1a;探索Java虚拟机的工作原理 摘要&#xff1a;本文将深入解析Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;从字节码到执行过程&#xff0c;从内存模型到垃圾回收机制&#xff0c;逐步剖析JVM的核心组成部分和工作原理。…

linux脚本

程序后台运行&#xff1a; nohup java -jar xxx.jar &>hello.log & 后台运行java-jar命令&#xff0c;并且将日志输出到hello.log文件 防火墙&#xff1a; 开启防火墙&#xff1a;systemctl start firewalld 开放指定端口&#xff1a;firewall-cmd --zonepublic --…

【Java可执行命令】(十八)可视化监控和管理工具 jconsole:获取 JVM的内存使用情况、线程活动、GC 行为等重要指标的可视化工具 ~

Java可执行命令之jconsole 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式3.2 注意事项 4️⃣ 应用场景&#x1f33e; 总结 1️⃣ 概念 jconsole 是 Java Development Kit (JDK) 自带的一款图形化监控和管理工具。它旨在提供一个简单而强大的界面&#xff0c;用于监视和管…

java代理模式

为什么需要代理模式 比如现在项目经理有一个需求&#xff1a;在项目现有所有类的方法前后打印日志。如何实现&#xff1f; 静态代理 interface SmsService {void send(String message); }class SmsServiceImpl implements SmsService {public void send(String message) {Sys…

mysql索引介绍

索引可以提升查询速度&#xff0c;会影响where查询&#xff0c;以及order by排序。MySQL索引类型如下&#xff1a; 从索引存储结构划分&#xff1a;B Tree索引、Hash索引、全文索引 从应用层次划分&#xff1a;主键索引、唯一索引、单值索引、复合索引 从索引键值类型划分&am…

【C++进阶】继承、多态的详解(继承篇)

【C进阶】继承、多态的详解&#xff08;继承篇&#xff09; 目录 【C进阶】继承、多态的详解&#xff08;继承篇&#xff09;继承的概念及定义继承的概念继承的定义定义格式继承关系和访问限定符继承基类成员访问方式的变化 基类和派生类对象赋值转换继承中的作用域派生类的默认…

prometheus监控k8s服务并告警到钉钉

一、监控k8s集群 要监控k8s集群需要使用到以下服务用于收集监控的资源信息&#xff0c;node_exporter用于监控k8s集群节点的资源信息&#xff0c;kube-state-metrics用于监控k8s集群的deployment、statefulset、daemonset、pod等的状态&#xff0c;cadvisor用于监控k8s集群的p…

JVM内存管理

文章目录 1、运行时数据区域1.1 程序计数器&#xff08;线程私有&#xff09;1.2 JAVA虚拟机栈&#xff08;线程私有&#xff09;1.3 本地方法栈1.4 Java堆&#xff08;线程共享&#xff09;1.5 方法区&#xff08;线程共享&#xff09;1.6 直接内存&#xff08;非运行时数据区…

vue动态生成行

vue代码 <el-table :data"form.lineInfos" :bordertrue style"width: 99.99%;"> <el-table-column type"index" label"序号" width"50"></el-table-column> <el-table-column prop"unitPrice&qu…

golang协程池(goroutine池)ants库实践

golang中goroutine由运行时管理&#xff0c;使用go关键字就可以方便快捷的创建一个goroutine,受限于服务器硬件内存大小&#xff0c;如果不对goroutine数量进行限制&#xff0c;会出现Out of Memory错误。但是goroutine泄漏引发的血案&#xff0c;想必各位gopher都经历过&#…

在Qt中使用LoadLibrary无法加载DLL

Qt系列文章目录 文章目录 Qt系列文章目录前言一、问题分析 前言 最近因项目需要使用qt做开发&#xff0c;之前使用LoadLibrary加载dll成功&#xff0c;很庆幸&#xff0c;当一切都那么顺风顺水的时候&#xff0c;测试同事却发现&#xff0c;在windows平台上个别电脑上加载dll会…

Redis BitMap/HyperLogLog/GEO/布隆过滤器案例

面试问题&#xff1a; 抖音电商直播&#xff0c;主播介绍的商品有评论&#xff0c;1个商品对应了1系列的评论&#xff0c;排序展现取前10条记录用户在手机App上的签到打卡信息&#xff1a;1天对应1系列用户的签到记录&#xff0c;新浪微博、钉钉打卡签到&#xff0c;来没来如何…

【Grafana】中文界面配置 v10.0.3

比如通过 docker run -d -p 3000:3000 -v /e/code/monitor/grafana/grafana.ini.txt:/etc/grafana/grafana.ini grafana/grafana运行一个容器&#xff08;最新是v10.0.3&#xff09;。 在 /admin/settings 可以看到 users 部分有一个 default_language 配置。 所以在挂载到 …

速看!Milvus JavaScript 客户端入门级使用指南

Milvus 是一款云原生的开源向量数据库&#xff0c;专为向量相似性搜索和 AI 应用赋能。Milvus 支持水平扩展&#xff0c;可以处理海量数据&#xff0c;同时&#xff0c;Milvus 还提供多语言的 SDK &#xff08;包括 JavaScript&#xff09;。 使用 Milvus node.js SDK&#xff…

php代码审计,php漏洞详解

文章目录 1、输入验证和输出显示2、命令注入(Command Injection)3、eval 注入(Eval Injection)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL 注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking…

vue 后端返回文件流,前端导出下载

vue 后端返回文件流&#xff0c;前端导出下载 配置axios响应拦截器 request.interceptors.response.use((response) > {const res response.data// 关键代码: 返回的是文件流if (res instanceof Blob) {return response}if (res.code 200 || res true) {return res} el…