C++高性能编程:ZeroMQ vs Fast-DDS发布-订阅模式下性能对比与分析

文章目录

    • 0. 引言
    • 1. 目标:ZeroMQ与Fast-DDS性能对比
    • 2. ZeroMQ vs Fast-DDS - 延迟基准测试
      • 2.1 一对一发布-订阅延迟
      • 2.2 一对多发布-订阅延迟
    • 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试
    • 4. 方法论
    • 5. 结论
    • 6. 参考

0. 引言

高要求的分布式系统催生了对轻量级且高性能中间件的需求。在现有的选项中,ZeroMQ 和 Fast-DDS 是高性能的异步中间件,采用发布-订阅模式。

主要优点包括:

  • 性能:更好的延迟和吞吐量。数据在可用时立即发送。
  • 高度解耦:无需周期性请求数据,订阅者只需声明对数据更新的兴趣即可。

ZeroMQ 是一种消息中间件,不需要消息代理,并实现了多种通信模式,包括发布-订阅和请求-响应。消息的序列化和反序列化需要用户自己实现。其API类似于套接字库。

Fast-DDS 是实时发布订阅协议(RTPS)的高性能实现,提供了简单的发布-订阅API。该产品通过从接口定义语言(IDL)生成代码的方式提供序列化支持,并包含一个超快速的序列化库:eProsima FastCDR。

1. 目标:ZeroMQ与Fast-DDS性能对比

本次测试的目标是测量并比较在使用发布-订阅模式下,Fast-DDS与ZeroMQ的延迟和吞吐量。Fast-DDS使用eProsima FastCDR进行数据序列化,这是一款非常快速的序列化引擎。

需要考虑的差异

Fast-DDS和ZeroMQ之间有一些差异需要分析。

  • 传输协议:Fast-DDS支持TCP和UDP,而默认使用TCP;ZeroMQ使用TCP。Fast-DDS的UDP模式包含自己的ACK/NACK可靠性协议,支持单播和多播。
  • 协议头:另一个直接影响性能的重要差异是每个协议的头部。RTPS是一个更加多功能的协议,设计用于在无可靠性的协议上实现。它还具备许多其他功能(如键控主题、顺序传递等),因此其头部更大。从测试结果中可以看到,ZeroMQ在处理非常小的消息时稍微优于Fast-DDS,这很可能是由于较小的头部导致的。
  • 节点发现:发现机制也是一个需要考虑的因素。Fast-DDS带有内置的端点发现机制。用户只需指定主题名称和数据类型,如果QoS兼容,中间件会自动匹配发布者和订阅者,这使得设置和配置更加简单。然而,ZeroMQ没有这样的机制,用户需要手动设置发布者和订阅者的IP地址以实现通信。

2. ZeroMQ vs Fast-DDS - 延迟基准测试

2.1 一对一发布-订阅延迟

一对一订阅延迟的对比见下图:

请添加图片描述

在小消息大小的情况下,ZeroMQ的延迟略优。然而,随着消息大小的增加,Fast-DDS的延迟优于ZeroMQ。两者都表现出相似的线性行为,但Fast-DDS的斜率更小。

请添加图片描述

如前所述,ZeroMQ在消息大小在16到128字节之间时表现出更小的延迟。这种现象最可能的解释是ØMQ消息的头部比RTPS消息的头部更小。随着消息大小的增加,头部大小的重要性下降,因为它在传输数据中所占比例变小。

2.2 一对多发布-订阅延迟

相同的测试也在有三个订阅者的场景下进行:

请添加图片描述

在小消息大小的情况下,ZeroMQ和Fast-DDS的延迟非常相似。随着消息大小的增加,使用Fast-DDS和多播广播的优势变得更加明显。对于16K字节大小的消息,延迟差异可高达200微秒。

请添加图片描述

在这种情况下,ZeroMQ的头部较小的优势因需要向每个订阅者发送相同数据而被抵消。可以看到,在小消息大小情况下,两个实现的延迟值非常相似,这增强了Fast-DDS相对于ZeroMQ的竞争力。随着订阅者数量的增加,ZeroMQ的延迟值可能会明显增加,而Fast-DDS的增长则更缓慢。

3. ZeroMQ vs Fast-DDS - 吞吐量基准测试

下图展示了ZeroMQ与Fast-DDS之间的吞吐量对比:

请添加图片描述

此图表明,ZeroMQ在处理较小消息大小时能实现更高的吞吐量。这是因为ZeroMQ使用的是TCP,这是一种优化了吞吐量的流协议,而RTPS主要是为实时性能而设计的,使用了无连接的UDP。

然而,随着消息大小的增加,Fast-DDS开始表现出更高的吞吐量,并最终超过ZeroMQ。这是因为Fast-DDS的序列化和传输算法在大消息的情况下比ZeroMQ更为有效。对于高负载场景,Fast-DDS成为更优的选择。

4. 方法论

延迟

延迟通常定义为消息穿越系统所需的时间。在基于数据包的网络中,延迟通常被测量为单程延迟(从源节点发送数据包到目的节点接收数据包的时间)或往返延迟(从源节点到目的节点的时间加上从目的节点返回到源节点的时间)。后者更常用,因为它可以从一个点测量。

在RTPS通信交换中,延迟可以定义为发布者序列化并发送数据消息所需的时间,加上匹配的订阅者接收并反序列化消息所需的时间。应用之前提到的往返概念,往返延迟可以定义为消息由发布者发送,订阅者接收并发送回发布者的时间。例如,在下图中,往返时间将是T2-T1,延迟为(T2-T1)/2。

延迟示例

在多个订阅者场景中,测量延迟采用类似的过程。在这种情况下,发布者将数据发送给两个订阅者,但只有一个对消息做出响应。类似地,延迟也计算为(T2-T1)/2。

多订阅者延迟示例

吞吐量

在通信网络中,吞吐量通常定义为通过通信通道成功传输消息的速率。吞吐量通常以字节每秒来表示。有多种方法可以测量通信网络的吞吐量。最常见的方法是发送一个大文件(或多个较小文件),然后测量将其传输到网络的另一个点所需的时间,之后将数据量除以传输所需的时间。

在RTPS通信的情况下,可以通过在一定时间内发送一组消息来测量吞吐量,并获取传输数据的总大小。然而,为了获得最大吞吐量值,必须尝试不同的消息需求(D - 连续发送的消息数量),以找到最佳值,即最大化发布者的可用发送通道而不会导致订阅者接收队列溢出(造成数据包丢失)。下面的图表展示了进行此测试的过程:

吞吐量测试过程

当然,吞吐量可以在发布者端(发送了多少数据)和订阅者端(接收了多少数据)进行测量。如果没有数据包丢失,两个值将非常相似,值之间的微小差异将由时间测量的差异引起。然而,如果数据包丢失,则吞吐量值将根据不同的端点而有所不同。为了建立一个可靠的测量规则,我们将假设每个消息大小的最大吞吐量为在发布者端测量的值,前提是订阅者端没有数据包丢失。

5. 结论

两者均展示了非常优越的性能,但在特定情况下有所不同:

  • 小消息:ZeroMQ通常在处理小消息(如控制指令、状态更新等)时表现更好,特别是在需要高吞吐量的情况下。
  • 大消息与多订阅者场景:Fast-DDS在处理大消息时具有优势,特别是在多订阅者场景中,其多播支持表现出色。它还具有更加灵活且自动化的节点发现和匹配机制,降低了用户配置的复杂性。

最终选择哪种中间件,取决于你的系统的具体需求:是小消息和高吞吐量,还是大消息和更好的多播支持。

6. 参考

本文内容数据引用自zmq-vs-eprosima-fast-rtps,原文已不能访问。本文是通过eprosima-zmq-vs-eprosima-fast-rtps访问到的。

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

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

相关文章

C#MVC返回DataTable到前端展示。

很久没写博客了,闭关太久,失踪人口回归,给诸位道友整点绝活。 交代下背景:要做一个行转列的汇总统计,而且,由于是行转列,列的数量不固定,所以,没法使用正常的SqlSugar框…

el-tree树状控件,定位到选中的节点的位置

效果图 在el-tree 控件加 :render-content"renderContent" 在掉接口的方法中 实际有用的是setTimeout 方法和this.$refs.xxxxxx.setCheckedKeys([industrycodeList]) if(res.data.swindustrylist.length>0){res.data.swindustrylist.forEach(item > {industry…

STM32之SPI读写W25Q128芯片

SPI简介 STM32的SPI是一个串行外设接口。它允许STM32微控制器与其他设备(如传感器、存储器等)进行高速、全双工、同步的串行通信。通常包含SCLK(串行时钟)、MOSI(主设备输出/从设备输入Master Output Slave Input&…

Linux系统编程 --- 多线程

线程:是进程内的一个执行分支,线程的执行粒度,要比进程要细。 一、线程的概念 1、Linux中线程该如何理解 地址空间就是进程的资源窗口。 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是&#xff1…

聊聊场景及场景测试

在我们进行测试过程中,有一种黑盒测试叫场景测试,我们完全是从用户的角度去理解系统,从而可以挖掘用户的隐含需求。 场景是指用户会使用这个系统来完成预定目标的所有情况的集合。 场景本身也代表了用户的需求,所以我们可以认为…

SpringBoot+Vue在线商城(电子商城)系统-附源码与配套论文

摘 要 随着互联网技术的发展和普及,电子商务在全球范围内得到了迅猛的发展,已经成为了一种重要的商业模式和生活方式。电子商城是电子商务的重要组成部分,是一个基于互联网的商业模式和交易平台,通过网络进行产品和服务的销售。…

计算机图形学 | 动画模拟

动画模拟 布料模拟 质点弹簧系统: 红色部分很弱地阻挡对折 Steep connection FEM:有限元方法 粒子系统 粒子系统本质上就是在定义个体和群体的关系。 动画帧率 VR游戏要不晕需要达到90fps Forward Kinematics Inverse Kinematics 只告诉末端p点,中间…

Delphi5实现色板程序——滑块型组件实例

效果图 参考 Delphi程序设计基础:教程、实验、习题 代码 unit Unit1;interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Dialogs, Forms,Form, Formprpt, ExtCtrls, StdCtrls;typeTForm1 class(MForm)Label1: TLabel;Label2: …

公式编辑器 -vue-formula-editor

前言 公式编辑旨在帮助用户使用可视化的前提,能便捷的使用平台,例如低代码平台使用广泛 vue-formula-editor vue-formula-editor是一款开源的Vue公式计算组件,可以帮助开发者快速集成公式编辑 在线体验 demo & 源码 安装 npm i vue-form…

[Python学习日记-9] Python中的运算符

简介 计算机可以进行的运算有很多种,但可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,而本篇我们暂只介绍算数运算、比较运算、逻辑运算、赋值运算 算数运算 一、运算符描述…

FunHPC算力平台评测

作为内测老用户,已经用DeepLn平台(现改名为FunHPC平台)好久了,一路见证了平台从最初100多人的小群到现在满群的状态,FunHpc平台确实在一步步的走向成熟,一步步的变大。趁着现在活动的时间,发篇文…

XSS反射型和DOM型+DOM破坏

目录 第一关 源码分析 payload 第二关 源码分析 payload 第三关 源码分析 payload 第四关 源码分析 payload 第五关 源码分析 payload 第六关 源码分析 第七关 源码分析 方法一:构造函数 方法二:parseInt 方法三:locat…

项目问题 | CentOS 7停止维护导致yum失效的解决办法

目录 centos停止维护意味着yum相关源伴随失效。 报错: 解决方案:将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部,博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…

HTML5服装电商网上商城模板源码

文章目录 1.设计来源1.1 主界面1.2 购物车界面1.3 电子产品界面1.4 商品详情界面1.5 联系我们界面1.6 各种标签演示界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 【博主推荐】:前些天发…

【系统分析师】-综合知识-系统架构

1、设计模式 1)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…

Python爬虫使用实例

IDE:大部分是在PyCharm上面写的 解释器装的多 → 环境错乱 → error:没有配置,no model 爬虫可以做什么? 下载数据【文本/二进制数据(视频、音频、图片)】、自动化脚本【自动抢票、答题、采数据、评论、点…

vue3 响应式 API:ref() 和 reactive()

在 Vue 3 中,响应式系统是其核心特性之一,它使得数据的变化能够自动触发视图的更新。 官方文档: 响应式 API:核心 要更好地了解响应式 API,推荐阅读官方指南中的章节: 响应式基础 (with the API preference…

SX_初识GitLab_1

1、对GitLab的理解: 目前对GitLab的理解是其本质是一个远程代码托管平台,上面托管多个项目,每个项目都有一个master主分支和若干其他分支,远程代码能下载到本机,本机代码也能上传到远程平台 1.分支的作用&#xff1a…

Oracle大师Roger Cornejo的推荐:使用ASH诊断Oracle解析故障

这篇文章被Oracle大师Roger Cornejo在X平台上推荐(见下图),英文原文在: Diagnosing Parsing Issue with ASH 解析,尤其是硬解析,是非生产性操作,会消耗大量系统资源,导致库缓存争用…

Meta 如何实现 99.99999999% 的缓存一致性

曾经的故事 Meta(Facebook) 曾经运行一个简单的技术栈——PHP 和 MySQL。 但随着更多用户的加入,他们面临着可扩展性问题。因此他们建立了一个分布式缓存。 虽然这暂时解决了可扩展性问题,但保持缓存数据的新鲜度变得困难。以下…