当前位置: 首页 > news >正文

《消息队列高手课》课程学习笔记(八)

如何实现高性能的异步网络传输?

  • **异步与同步模型最大的区别是,同步模型会阻塞线程等待资源,而异步模型不会阻塞线程,它是等资源准备好后,再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法,可以很好地解决 IO 等待的问题。
  • 我们开发的绝大多数业务系统,都是 IO 密集型系统。
    • 跟 IO 密集型系统相对的另一种系统叫计算密集型系统。
    • IO 密集型系统大部分时间都在执行 IO 操作,这个 IO 操作主要包括网络 IO 和磁盘 IO,以及与计算机连接的一些外围设备的访问。
    • 与之相对的计算密集型系统,大部分时间都是在使用 CPU 执行计算操作。
    • 我们开发的业务系统,很少有非常耗时的计算,更多的是网络收发数据,读写磁盘和数据库这些 IO 操作。
    • 这样的系统基本上都是 IO 密集型系统,特别适合使用异步的设计来提升系统性能。
  • 应用程序最常使用的 IO 资源,主要包括磁盘 IO 和网络 IO。
    • 由于现在的 SSD 的速度越来越快,对于本地磁盘的读写,异步的意义越来越小。
    • 所以,使用异步设计的方法来提升 IO 性能,我们更加需要关注的问题是,如何来实现高性能的异步网络传输。

理想的异步网络框架 Netty

  • 大部分语言提供的网络通信基础类库都是同步的。
    • 一个 TCP 连接建立后,用户代码会获得一个用于收发数据的通道,每个通道会在内存中开辟两片区域用于收发数据的缓存。
    • 发送数据的过程比较简单,我们直接往这个通道里面写入数据就可以了。
      • 用户代码在发送时写入的数据会暂存在缓存中,然后操作系统会通过网卡,把发送缓存中的数据传输到对端的服务器上。
      • 只要这个缓存不满,或者说,我们发送数据的速度没有超过网卡传输速度的上限,那这个发送数据的操作耗时,只不过是一次内存写入的时间,这个时间是非常快的。
      • 所以,发送数据的时候同步发送就可以了,没有必要异步
    • 对于数据的接收方来说,它并不知道什么时候会收到数据。
      • 那我们能直接想到的方法就是,用一个线程阻塞在那⼉等着数据,当有数据到来的时候,操作系统会先把数据写⼊接收缓存,然后给接收数据的线程发一个通知,线程收到通知后结束等待,开始读取数据。
      • 处理完这一批数据后,继续阻塞等待下一批数据到来,这样周而复始地处理收到的数据。
  • 同步网络 IO 的模型(BIO)
    在这里插入图片描述
    • 同步网络 IO 模型在处理少量连接的时候,是没有问题的。
    • 但是如果要同时处理非常多的连接,同步的网络 IO 模型就有点力不从心了。
    • 因为,每个连接都需要阻塞一个线程来等待数据,大量的连接数就会需要相同数量的数据接收线程。
    • 当这些 TCP 连接都在进行数据收发的时候,会有大量的线程来抢占 CPU 时间,造成频繁的 CPU 上下文切换,导致 CPU 的负载升高,整个系统的性能就会比较慢。
  • 对于业务开发者来说,一个好的异步网络框架,它的 API 应该是什么样的呢?
    • 我们希望达到的效果,无非就是,只用少量的线程就能处理大量的连接,有数据到来的时候能第一时间处理就可以了。
    • 对于开发者来说,最简单的方式就是,事先定义好收到数据后的处理逻辑,把这个处理逻辑作为一个回调方法,在连接建立前就通过框架提供的 API 设置好。
    • 当收到数据的时候,由框架自动来执行这个回调方法就好了。
      在这里插入图片描述
  • 接下来我们看一下如何使用 Netty 实现异步接收数据。
    // 创建⼀组线性
    EventLoopGroup group = new NioEventLoopGroup();try{// 初始化 ServerServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(group);serverBootstrap.channel(NioServerSocketChannel.class);serverBootstrap.localAddress(new InetSocketAddress("localhost", 9999));// 设置收到数据后的处理的 HandlerserverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {protected void initChannel(SocketChannel socketChannel) throws ExceptionsocketChannel.pipeline().addLast(new MyHandler());}});// 绑定端⼝,开始提供服务ChannelFuture channelFuture = serverBootstrap.bind().sync();channelFuture.channel().closeFuture().sync();
    } catch(Exception e){e.printStackTrace();
    } finally {group.shutdownGracefully().sync();
    }
    
    • 首先我们创建了一个 EventLoopGroup 对象,命名为 group,这个 group 对象你可以简单把它理解为一组线程。这组线程的作用就是来执行收发数据的业务逻辑。
    • 然后,使用 Netty 提供的 ServerBootstrap 来初始化⼀个 Socket Server,绑定到本地 9999 端口上。
    • 在真正启动服务之前,我们给 serverBootstrap 传入了一个 MyHandler 对象,这个 MyHandler 是我们自己来实现的一个类,它需要继承 Netty 提供的一个抽象类:ChannelInboundHandlerAdapter,在这个 MyHandler 里面,我们可以定义收到数据后的处理逻辑。这个设置 Handler 的过程,就是预先来定义回调方法的过程。
    • 最后就可以真正绑定本地端口,启动 Socket 服务了。
  • 真正需要业务代码来实现的就两个部分:
    • 一个是把服务初始化并启动起来。
    • 还有就是,实现收发消息的业务逻辑 MyHandler。
    • 像线程控制、缓存管理、连接管理这些异步网络 IO 中通用的、比较复杂的问题,Netty 已经自动帮你处理好了。

使用 NIO 来实现异步网络通信

  • 在 Java 的 NIO 中,它提供了一个 Selector 对象,来解决一个线程在多个网络连接上的多路复用问题。
    • 在 NIO 中,每个已经建立好的连接用一个 Channel 对象来表示。
      在这里插入图片描述

    • 我们希望能实现,在一个线程里,接收来自多个 Channel 的数据。

      • Selecor 通过一种类似于事件的机制来解决这个问题。
      • 首先你需要把你的连接,也就是 Channel 绑定到 Selector 上,然后你可以在接收数据的线程来调用 Selector.select() 方法来等待数据到来。
      • 这个 select 方法是一个阻塞方法,这个线程会一直卡在这儿,直到这些 Channel 中的任意一个有数据到来,就会结束等待返回数据。
      • 它的返回值是一个迭代器,你可以从这个迭代器里面获取所有 Channel 收到的数据,然后来执行你的数据接收的业务逻辑。

相关文章:

《消息队列高手课》课程学习笔记(八)

如何实现高性能的异步网络传输&#xff1f; **异步与同步模型最大的区别是&#xff0c;同步模型会阻塞线程等待资源&#xff0c;而异步模型不会阻塞线程&#xff0c;它是等资源准备好后&#xff0c;再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法&#xff0c;…...

DC电源模块在工业自动化的应用

BOSHIDA DC电源模块在工业自动化的应用 随着自动化技术的不断发展&#xff0c;DC电源模块已成为工业控制系统中不可或缺的一个组成部分。在许多自动化系统中&#xff0c;如机器人、控制器、PLC等&#xff0c;都需要使用到直流电源模块来提供稳定可靠的电源&#xff0c;以确保系…...

Java容器-集合

目录 1.Java容器概述 2.集合框架 3.Collection接口中的方法使用 4.iterator() 5.List接口 2.ArrayList、LinkedList、Vector相同点 3.不同点 1.ArrayList 2.LinkedList 3.Vector 4.Vector源码分析 5.ArrayList源码分析 6.LinkedList源码分析 6.List中的常用方法 …...

总结890

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲2遍&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff…...

2023年5月青少年机器人技术等级考试理论综合试卷(二级)

青少年机器人技术等级考试理论综合试卷&#xff08;二级&#xff09;2023.6 分数&#xff1a; 100 题数&#xff1a; 45 一、 单选题(共 30 题&#xff0c; 共 60 分) 1.下图中的凸轮机构使用了摆动型从动件的是&#xff1f; &#xff08; &#xff09; A.a B.b C.c D.d 试题类…...

2023CCPC河南省赛 VP记录

感觉现在的xcpc&#xff0c;风格越来越像CF&#xff0c;不是很喜欢&#xff0c;还是更喜欢多点算法题的比赛 VP银了&#xff0c;VP银也是银 感觉省赛都是思维题&#xff0c;几乎没有算法题&#xff0c;感觉像打了场大型的CF B题很简单没开出来&#xff0c;一直搞到最后&…...

【ECCV2022】DaViT: Dual Attention Vision Transformers

DaViT: Dual Attention Vision Transformers, ECCV2022 解读&#xff1a;【ECCV2022】DaViT: Dual Attention Vision Transformers - 高峰OUC - 博客园 (cnblogs.com) DaViT&#xff1a;双注意力Vision Transformer - 知乎 (zhihu.com) DaViT: Dual Attention Vision Trans…...

Apache 配置与应用

Apache 配置与应用 一、构建虚拟 Web 主机httpd服务支持的虚拟主机类型包括以下三种: 二、基于域名的虚拟主机1&#xff0e;为虚拟主机提供域名解析方法一&#xff1a;部署DNS域名解析服务器 来提供域名解析方法二&#xff1a;在/etc/hosts 文件中临时配置域名与IP地址的映射关…...

OpenGL 纹理

1.简介 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;你可以想象纹理是一张绘有砖块的纸&#xff0c;无缝折叠贴合到你的3D的房子上&#xff0c;这样你的房子看起来就像有砖墙外表了。 为了能够把纹理映射(M…...

Jeston Orin Nnao 安装pytorch与torchvision环境

大家好&#xff0c;我是虎哥&#xff0c;Jeston Orin nano 8G模块&#xff0c;提供高达 40 TOPS 的 AI 算力&#xff0c;安装好了Jetpack5.1之后&#xff0c;我们需要配置一些支持环境&#xff0c;来为我们后续的深度学习开发提供支持。本章内容&#xff0c;我将主要围绕安装对…...

ROS:常用可视化工具的使用

目录 一、日志输出工具——rqt_console二、绘制数据曲线——rqt_plot三、图像渲染工具——rqt_image_view四、图形界面总接口——rqt五、Rviz六、Gazebo 一、日志输出工具——rqt_console 启动海龟键盘控制节点&#xff0c;打开日志输出工具 roscorerosrun turtlesim turtles…...

智能应用搭建平台——LCHub低代码表单 vs 流程表单 vs 仪表盘

1. LCHub低代码如何选择 「流程表单」:填报数据,并带有流程审批功能,适合报销、请假申请或其他工作流; 「表单」:填报数据,并带有数据协作功能,如修改、删除、导入、导出,并可以给不同的人不同的管理权限; 「仪表盘」:数据分析处理、结果展示功能,如数据汇总、趋…...

Mac下通过Docker安装ElasticSearch集群

1、安装ElasticSearch 使用docker直接获取es镜像&#xff0c;执行命令docker pull elasticsearch:7.7.0 执行完成后&#xff0c;执行docker images即可看到上一步拉取的镜像。 2、创建数据挂在目录&#xff0c;以及配置ElasticSearch集群配置文件 创建数据文件挂载目录 mkdir -…...

MySQL redo log、undo log、binlog

MySQL是一个广泛使用的关系型数据库管理系统&#xff0c;它通过一系列的日志来保证数据的一致性和持久性。在MySQL中&#xff0c;有三个重要的日志组件&#xff0c;它们分别是redo log&#xff08;重做日志&#xff09;、undo log&#xff08;回滚日志&#xff09;和binlog&…...

文件包含漏洞

一、原理解析。 开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用到某些函数时&#xff0c;可直接调用此文件&#xff0c;而无须再次编写&#xff0c;这种调用文件的过程被称为包含。 注意&#xff1a;对于开发人员来讲&#xff0c;文件包含很有用&#xf…...

Python 中的 F-Test

文章目录 F 统计量和 P 值方差(ANOVA) 分析中的 F 值 本篇文章介绍 F 统计、F 分布以及如何使用 Python 对数据执行 F-Test 测试。 F 统计量是在方差分析检验或回归分析后获得的数字&#xff0c;以确定两个总体的平均值是否存在显着差异。 它类似于 T 检验的 T 统计量&#xf…...

Docker网络模式

一、docker网络概述 1、docker网络实现的原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是 每个容器的…...

百度离线资源治理

作者 | 百度MEG离线优化团队 导读 近些年移动互联网的高速发展驱动了数据爆发式的增长&#xff0c;各大公司之间都在通过竞争获得更大的增长空间&#xff0c;大数据计算的效果直接影响到公司的发展&#xff0c;而这背后其实依赖庞大的算力及数据作为支撑&#xff0c;因此在满足…...

C++进阶之继承

文章目录 前言一、继承的概念及定义1.继承概念2.继承格式与访问限定符3.继承基类与派生类的访问关系变化4.总结 二、基类和派生类对象赋值转换基本概念与规则 三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员六、复杂的菱形继承及菱形虚拟继承七、…...

在 Transformers 中使用约束波束搜索引导文本生成

引言 本文假设读者已经熟悉文本生成领域波束搜索相关的背景知识&#xff0c;具体可参见博文 如何生成文本: 通过 Transformers 用不同的解码方法生成文本。 与普通的波束搜索不同&#xff0c;约束 波束搜索允许我们控制所生成的文本。这很有用&#xff0c;因为有时我们确切地知…...

Centos7更换OpenSSL版本

OpenSSL 1.1.0 用户应升级至 1.1.0aOpenSSL 1.0.2 用户应升级至 1.0.2iOpenSSL 1.0.1 用户应升级至 1.0.1u 查看openssl版本 openssl version -v选择升级版本 我的版本是OpenSSL 1.0.2系列&#xff0c;所以要升级1.0.2i https://www.openssl.org/source/old/1.0.2/openssl-…...

基于摄影测量的三维重建【终极指南】

我们生活的时代非常令人兴奋&#xff0c;如果你对 3D 东西感兴趣&#xff0c;更是如此。 我们有能力使用任何相机&#xff0c;从感兴趣的物体中捕捉一些图像数据&#xff0c;并在眨眼间将它们变成 3D 资产&#xff01; 这种通过简单的数据采集阶段进行的 3D 重建过程是许多行业…...

配置ThreadPoolExecutor

ThreadPoolExecutor为一些Executor 提供了基本的实现,这些Executor 是由Executors中的newCachedThreadPool、newFixedThreadPool和newScheduledThreadExecutor 等工厂方法返回的。ThreadPoolExecutor是一个灵活的、稳定的线程池,允许进行各种定制。 如果默认的执行策略不能满足…...

Yolov5s算法从训练到部署

文章目录 PyTorch GPU环境搭建查看显卡CUDA版本Anaconda安装PyTorch环境安装PyCharm中验证 训练算法模型克隆Yolov5代码工程制作数据集划分训练集、验证集修改工程相关文件配置预训练权重文件配置数据文件配置模型文件配置 超参数配置 测试训练出来的算法模型 量化转换算法模型…...

分布式补充技术 01.AOP技术

01.AOP技术是对于面向对象编程&#xff08;OOP&#xff09;的补充。是按照OCP原则进行的编写&#xff0c;(ocp是修改模块权限不行&#xff0c;扩充可以) 02.写一个例子&#xff1a; 创建一个新的java项目&#xff0c;在main主启动类中&#xff0c;写如下代码。 package com.co…...

QT 多对一服务插件 CTK开发(五)

CTK在软件的开发过程中可以很好的降低复杂性、使用 CTK Plugin Framework 提供统一的框架来进行开发增加了复用性 将同一功能打包可以提供多个应用程序使用避免重复性工作、可以进行版本控制提供了良好的版本更新迭代需求、并且支持动态热拔插 动态更新、开发更加简单快捷 方便…...

[Windows]_[初级]_[创建目录和文件的名字注意事项]

场景 在开发Windows程序时,会出现目录生成了,但是函数无法在目录里创建文件,怎么回事?说明 在之前说过Windows上有些字符是不能作为文件名的[1],但是检查了下出问题的目录名没有非法字符,所以不是这个原因。 把文件的绝对路径打印出来就发现了问题,目录名后边带了空格,…...

「QT」QT5程序设计目录

✨博客主页:何曾参静谧的博客 📌文章专栏:「QT」QT5程序设计 目录 📑【QT的基础知识篇】📑【QT的GUI编程篇】📑【QT的项目示例篇】📑【QT的网络编程篇】📑【QT的数据库编程篇】📑【QT的跨平台编程篇】📑【QT的高级编程篇】📑【QT的开发工具篇】📑【QT的调…...

ConcurrentHashMap核心源码(JDK1.8)

一、ConcurrentHashMap的前置知识扫盲 ConcurrentHashMap的存储结构&#xff1f; 数组 链表 红黑树 二、ConcurrentHashMap的DCL操作 HashMap线程不安全&#xff0c;在并发情况下&#xff0c;或者多个线程同时操作时&#xff0c;肯定要使用ConcurrentHashMap 无论是HashM…...

【Python】文件 读取 写 os模块 shutil模块 pickle模块

目录 1.文件 1.1 读取操作 1.2 写操作 1.3 os&#xff1a;文件管理 1.4 os.path&#xff1a;获取文件属性 1.5 shutil&#xff1a;文件的拷贝删除移动解压缩 1.6 pickle&#xff1a;数据永久存储 1.文件 文件编码 编码是一种规则集合&#xff0c;记录内容和二进制间相互…...

龙口建网站/北京seo关键词优化外包

前两天看了深入web请求过程的知识&#xff0c;比较陌生的就是DNS中几种域名解析的方式的点&#xff0c;这里记录一下。 linux中使用 dig www.taobao.com trace 就可以查看域名解析的过程&#xff0c;以下使用的是NS方式...

做一个微信小程序/小璇seo优化网站

第三部分 C核心编程二本阶段主要针对C面向对象编写&#xff0c;以及文件操作1&#xff0c;面向对象C面向对象的三大特性为&#xff1a;封装&#xff0c;继承&#xff0c;多态关于对象的说法&#xff1a;万事万物皆为对象&#xff0c;对象有其属性和行为eg:人可以作为对象&#…...

微信官网网站模板下载安装/长春今日头条新闻

求生之路2 脚本 是可以在游戏中的虚拟机里被运行的服务器端的脚本。它们使用Squirrel语言编写, 这是一种类似于Lua的脚本编译语言.本页面内容由Dazai Nerau译自英文版页面. 欢迎任何人补充新内容或者修改其中的错误.用途VScripts在求生之路2中的最通常的用处是用来指挥人工智能…...

沈阳高端网站制作公司哪家好/网络营销策划ppt范例

前言 如果大家之前学过“线性DP”的话&#xff0c;应该已经知道&#xff0c;动态规划的过程是随着“阶段”的增长&#xff0c;在每个状态维度上不断扩展的。在任意时刻&#xff0c;已经求出最优解的状态与尚未求出最优解的状态在各维度上的分界点组成了 DP 扩展的“轮廓“。对…...

阿里云网站方案建设书模板/品牌营销策略有哪些

源自&#xff1a;http://coolketang.com/tutorials/menu4lesson6.php本节将演示如何使用脚本&#xff0c;复制图层并插入到图层列表中某个位置。首先创建一个空白的脚本文档&#xff0c;并保存在硬盘上某个位置。 首先创建一个空白的脚本文档&#xff0c;并保存在硬盘上某个位置…...

wordpress论坛主题/sem是什么工作

为什么80%的码农都做不了架构师&#xff1f;>>> 在hazelcast的官方文档中&#xff0c;提到了其支持read-through&#xff0c;write-through与write-behind三种模式。查阅资料&#xff0c;最后在oracle的官文中找到了比较靠谱的解释。 read-throug、write-through、…...