当前位置: 首页 > 网络应用技术

OMG!RocketMQ的高性能网络通信机制是如此实现吗?

时间:2023-03-07 14:20:06 网络应用技术

  目录

  本文更长。建议在观看之前收集它。

  上一篇文章“对名称服务器启动过程和存储结构的分析”主要解释了RocketMQ中名称服务器的元数据存储结构。实际上,名称服务器也有一个重要的事情是semotingserver通信模块。对于消息队列,通信模块是核心的核心。组件和通信模块的性能在很大程度上决定了消息传输的能力和整体性能。

  本文将在 - 深入学习RocketMQ网络通信框架中进行 - 以便您可以完全掌握RocketMQ网络通信的基本原理,并且您可以了解开源框架中如何实现高性能网络通信模块。

  下图是RocketMQ消息队列的整体体系结构

  关于RocketMQ体系结构图中的角色和功能,您可以查看“每个人都理解的RocketMQ的基本原理”

  在这里,我们将重点介绍每个角色如何交流:

  名称服务器扫描每10秒钟的所有经纪人连接。如果名称服务器发现经纪人的最后一个心跳距离当前超过120s,请断开名称服务器和经纪人之间的连接,并从名称服务器中删除与数据相关的数据。名称服务器启动过程和存储结构”)

  经纪人启动后,它将与所有名称服务器建立长时间的连接,并每30年代每30年代向名称服务器报告主题路由信息。

  使用名称服务器群集的产品中的一个节点建立了很长的连接,并且每30秒每30秒从名称服务器获得所有主题队列的最新情况。

  生产者与提供主题服务的经纪人建立了悠久的联系。默认30年代向所有相关经纪人发送心跳。经纪人扫描所有幸存的连接每10次幸存的连接。

  消费者中的一个节点和名称服务器群集中的一个节点建立了很长的连接,并且每30秒每30秒从名称服务器获得所有主题队列的最新情况。大多数30年代。

  消费者每30年代向所有相关经纪人发送心跳。经纪人扫描每10秒钟都幸存的连接。如果在某个连接120s中没有心跳数据,则该连接已关闭;以及所有消费者组通知的消费者,集团库班内的集团重新分配了队列,然后继续消费。

  可以看出,整个RocketMQ的角色之间存在网络通信,因此如何设计良好的网络通信模块在MQ中至关重要。它将确定RocketMQ群集的总体消息传输能力和最终性能。

  RocketMQ在RocketMQ-Remotion模块下设计网络通信的结构。使用网络通信的所有模块(名称服务器,经纪人,客户端,客户端)都取决于模块,并且为了获得有效的数据请求并在客户端和服务器之间接收,RocketMQ消息队列Queue自定义了通信协议,并根据Netty扩展了通信模块。

  让我们看一下远程通信模块的结构图:

  由semotingserver和remotionclient定义的方法相似,主要包括同步,异步,单向通信和注册处理器处理器。其余是服务器和客户端的特定接口方法。例如,client client获取名称服务器地址列表getNameserverAdressListList()方法。

  基于Netty框架,RocketMQ被抽象并封装到通信的服务器和客户端,使结构更加简洁,易于扩展。

  RocketMQ是根据Netty扩展的,因此让我们了解RocketMQ如何实现RocketMQ的多线模型。

  学习RocketMQ多线程模型,您需要学习以下基本概念:

  遵循结果消息的通信机制

  同步:同步意味着呼叫者需要主动等待结果的结果。

  异步:异步的含义意味着无需主动等待结果的返回,但是通过其他方式,例如:状态通知,回调功能等。

  主要问题是呼叫者的状态返回结果

  障碍物:该过程调用界面后,如果数据未由数据准备,则该过程将被挂起,直到数据返回直到数据返回。当前的过程没有CPU的时间去做。

  非烧烤:该过程调用接口。如果数据未由数据准备,则该过程也可以处理后续操作而不会挂起。CPU时间胶片将不会切换到其他过程。EssenCecheck是否通过连续处理数据。由于旋转效率太低(每次需要系统调用),因此有I/O Multi -Way Reuse模型提到了之后。

  下图是阻塞模式和读取的非屏幕模式与网络编程中的写入方法之间的区别:

  同步和异步在于您是否需要确认是否存在结果。障碍和非目标在于您是否一直在等待结果在此期间等待其他事情。

  同步阻塞

  同步阻塞是编程中的常见模型。例如,您可以为您购买一杯奶茶。目前,您需要做牛奶茶。您需要在商店里等待。您在此期间什么都不能做任何事情。我会在完成后给您。(不能玩手机,觉得自己已经死了)

  同步非块

  在编程模式下,同步非块可以抽象为旋转模式。目前,您不需要等待。您可以播放手机或先出去,然后回来问店员奶茶。

  异步阻塞

  在编程模式下使用异步阻塞,有点像您编写了线程池。提交后,future.get()立即为future.get()。这就像您购买牛奶茶一样,店员做,然后告诉您您会呼唤该名称,然后您睁大了眼睛,保持眼睛并保持眼睛看数字板。

  异步非块

  异步的非块,您无需睁大眼睛凝视数字板,播放手机,当您达到电话号码时,您会通知您。

  CPU处理数据的速度远大于数据准备数据的速度。从理论上讲,任何编程语言都会遇到与IO速度不符的CPU处理速度和IO速度的问题。如何在网络编程中优化网络IO,以及如何使用CPU处理网络数据处理非常重要。

  首先,我们需要知道一个基本概念。Linux的内核将所有外部设备作为要操作的文件(所有内容都是文件)。对于文件的读取和写入操作Descriptor)。也将有一个响应描述符,用于套接字读取,称为套接字文件设计(套接字文件描述符)。描述符是一个数字,指向核心中的结构(文件路径,数据区域和其他属性)。

  根据UNIX网络编程中IO模型的分类,UNIX提供了5个IO模型。

  五个I/O模型主要经历以下两个阶段:

  下面提到的IO模型的第一阶段和第二阶段对应于上面的两个阶段。

  读取和写操作都可以理解为对恢复的回忆。

  阻止IO模型(阻止IO)是最常用的IO模型。当io模型尚未准备就绪时,所有文件操作都会被阻止。将单词-to单词作为示例:在过程空间中调用recvfrom,其系统调用直到到达数据包并将其复制到应用程序过程缓冲区或当在此期间,我一直在等待,并且该过程从调用recvfrom到其返回的开头被阻止。

  优点:程序很简单,过程/线程在等待数据期间悬挂,并且CPU资源基本上没有占用。

  缺点:每个连接都需要独立的过程/线程。就高合并而言,将创建大量连接,从而导致大量的内存和线程开张开销,因此它不适合高征用场景。

  非阻滞IO(非阻滞IO),当RecVfrom从应用程序层到内核时,如果第一阶段还没有准备就绪并且没有缓冲区区域,则将直接返回eWoldBlock误差。通常,请检查此状态以查看内核是否具有数据。也就是说,反复致电recvfrom并等待成功指令(旋转)。

  优点:不阻止内核数据的过程,即不会等待第一阶段准备的过程,无需阻止等待,并且具有更好的真实时间性质。

  缺点:不断查询内核。每个访问都是系统调用。每个系统调用将涉及用户模式和内核状态的切换。它一直占据CPU,并且系统资源利用率降低了。

  我们需要减少频繁的系统调用,并且需要移交操作系统的操作系统。我们只需要执行系统调用即可。

  多路重用:“多路”代表多个网络连接,“重复使用”是指同一线程。

  IO多路复用(IO多路复用),Linux提供选择/轮询。该过程被要求选择一个或多个要选择的FDS或投票系统,将其阻塞在选择操作上,并在选择操作上阻止它。检测多个FDS是否准备就绪。SELECT/POLL会顺序扫描FD。选择和轮询的FD数量有所不同。SELECT的FD数为1024,并且民意调查的数量不限于数量。SELECT/POLL系统调用有以下问题:

  Epoll提高了以上三点:

  首先,我们允许套接字接口执行信号驱动I/O,并安装信号处理功能。该过程继续运行而无需阻止。当数据准备就绪时,该过程将接收一个可以调用信号处理功能中的I/O操作功能处理数据的Sigio信号。

  优点:等待数据时不会阻止线程,这可以提高资源的利用率。

  缺点:当大量IO操作时,由于信号队列溢出而可能不会通知信号I/O。

  尽管信号驱动程序I/O对于处理UDP插座很有用,但此信号通知意味着到达数据报纸或返回异步错误。

  但是,对于TCP而言,信号驱动的I/O的I/O方法几乎没有用,因为此通知有很多条件,并且每个要判断的条件都会消耗大量资源。与以前的方法相比,优势丢失了。

  异步IO(异步IO)通知内核启动文件,并在内核的整个操作完成后通知我们(包括将数据从内核复制到用户自己的缓冲区)。

  该模型和信号模型之间的主要区别在于,当我们可以启动IO操作时,内核通知了信号驱动程序IO:异步IO模型由内核通知。IO操作完成后。

  优点:异步I/O可以充分利用DMA特性与I/O操作和计算重叠。

  缺点:为了实现真正的异步I/O,操作系统需要做很多工作。目前,通过IOCP在Windows下实现了真正的异步I/O。

  在Linux系统下,引入了Linux 2.6。目前,AIO并不完美,因此,当Linux以Linux实现高持续网络编程时,IO REUSE模型模式是主要模式。

  在这五个I/O模型中,前四个属于同步I/O,因为真实的I/O操作将阻止过程/线程,因此只有异步I/O模型与由异步I/O匹配。posix。

  阻止I/O:简单,高和发型的连接,导致性能瓶颈。

  非块I/O:无需阻止等待数据并快速响应,但是旋转查询是在线程中执行的,这将占据CPU时间和废物系统资源。

  I/O Multi -Road Reuse:可以将多个网络连接重复使用以使用相同的线程,并且在内核中执行多路重用查询,并且效率高于线程。并且EPOLL的性能比SELECT/SELECT/SELECT/更好投票,并直接返回I/O事件的描述符。

  通过上述解释,我们了解五个I/O模型。Netty是一个由基于NIO的高性能和异步事件驱动的网络通信框架。

  基于NIO,可以实现I/O多路重复使用模型,并且可以通过一个线程监视多个连接事件。Netty已经实现了基于此的反应堆多线模型。

  反应堆模式:指事件驱动器处理模式,该模式传递给了一个或多个输入传递给服务器的服务请求。

  通过I/O Multi -Road Reuse通过I/O多路重复使用的统一监视事件分配给线程以进行处理后处理。

  该图是单个反应器单线请求的处理过程:

  该模型是单个线程,不涉及上下文切换和资源竞争等问题。但是,没有办法播放多核CPU性能,如果处理程序非常慢,则处理程序将导致其他请求成为其他请求等待很长一段时间。如果线程意外掉落或输入死周期,它将导致整个通信模块不可用,从而导致节点故障。

  Handler不处理业务,只负责响应,并将业务移交给工作线程池进行处理。这可以充分利用多核CPU的功能,但反应堆进行所有事件监视和响应,单身- 线程操作和系统瓶颈容易出现在高并发场景中。

  因此,连接时间需要与阅读和写作事件分开,并且有多个反应堆的场景。

  反应堆的主线程主反应器设置了连接,然后将创建的连接分配给了事件监视的反应堆子线程子接头子。这与上面的单个反应器多线程相同。

  基于此模型,我们可以通过增加反应堆实例的数量来充分利用CPU资源,并了解每个处理以提高整体并发效率。

  Netty基于主要的多线程模型,以支持高并发网络请求的处理。

  RocketMQ对Netty的本机多线反应堆模型进行了一系列扩展和优化,如下图所示:

  实际上,它是四个线程池,它们的处理方式不同。线程池对应于数字:1 + N + M1 + M2。

  该协议按照协议协议规则进行编码和解码。RocketMQ自定义了RocketMQ消息协议,并为了在网络中传输消息并读取消息,该消息已编码。

  RemotionCommand此类将消息传输过程中的所有数据内容封装,包括以下一些数据内容:

  代码int请求操作代码,响应应根据不同的请求代码执行不同的业务处理代码。0表示成功,non -0表示各种错误语言语言语言languagecode realuty stocal语言响应对语言版本int请求派对程序的响应。代码,响应消息中相应响应的相应响应直接返回到flag int区分,无论是普通RPC还是OneWayRPC的符号是普通RPC或OneWayRPC的徽标。 请求自定义扩展信息对自定义扩展信息的响应自定义RocketMQ传输协议格式如下:

  可以看出,传输内容可以分为以下4个部分:

  (1)消息长度:总长度,四个字节存储,占用INT类型;

  (2)序列化类型和消息头长度:还占用类型类型,第一个字节代表序列化类型,后三个字节代表消息头的长度;

  (3)消息头数据:序列化后的消息头数据;

  (4)消息数据:消息主题的dentthly -Made数据内容;

  remotionCommand中的编码和解码源代码:

  RockEtMQ消息通信的三种主要方法:同步(同步),异步(异步),一个-way(oneway)

  我们以同步通信模式为示例,以分析客户端发送过程和服务器接收消息和处理逻辑的过程。

  当客户端(生产者生产商)发送消息时,它将直接调用defaultmqproderimpl类中的发送(消息)以发送消息发送消息。默认值是同步通信模式。此方法的底层将调用NetTyreMotingClient#Invokesync方法,获取服务器和经纪人之间的频道,然后将NetTyRemotingAbstract调用#Invokesyncimpl方法访问频道,并将消息发送到服务端机,以将消息发送到服务端机上。

  NetTyremotingAbstract#InvokesynCimpl消息发送的源代码如下(附加相关说明):

  服务器接收消息的核心方法是NetTyrMotingAbstract#ProcessRequestCommand,源代码如下(省略一些异常处理代码):

  在本文中,从多线程模型,消息协议设计,编解码器和消息通信方法的各个方面,我们将深入了解RocketMQ的整个通信模块的设计和交互过程,并使用源代码。模型,我们将带所有人了解阻止非目标和同步异步,五个网络I/O,反应堆开发模型的基本概念。

  关于RocketMQ网络通信,随后的小李将从发送过程中发送来自SENDING PROCESS的生产者,代理存储消息和消费者消费消息的消息到消息的发送过程。

  我是小李,欢迎大家留言讨论。如果您在阅读文章后感觉良好,请记住点击关注?

  原始:https://juejin.cn/post/7103437918366089230