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

news2024/11/15 17:58:50

文章目录

    • 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.coloradmin.cn/o/2053729.html

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

相关文章

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩序被严重打乱。跟普通流感…

前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

1.问题描述 当我们进入页面时的菜单导航栏是默认选中的状态如图 点击博客园效果如图 问题1: 但是当我们点击页面上方返回按钮时,导航栏选中状态没有改变 分析问题1: 这个问题是因为页面改变后页面里面存储的菜单导航栏的is-active属性没有改…

WIFI 密码

要破解 WIFI 密码,首先要抓到 WIFI 的握手包,要想得到 WIFI 的握手包,就需要在监听时刚好有设备连接了该 WIFI,但这就需要运气加成,因此可以我们可以主动将该 WIFI 的设备踢下去,一般设备就会自动连接该 WI…

机器学习:逻辑回归算法实现鸢尾花预测和银行数据处理

1、鸢尾花预测 1、特征选择 2、对特征处理 trainpd.read_excel("鸢尾花训练数据.xlsx") testpd.read_excel("鸢尾花测试数据.xlsx") x_traintrain[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]] y_tr…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式,常见的有: 设置浮动overflow设置为:auto、scroll、hiddenpositon设置为:absolute、fixed 介绍: ○ 所谓BFC,指的是:一个独立的布局环境&am…

C2M商业模式分析与运营平台建设解决方案(一)

C2M(Customer to Manufacturer)商业模式通过直接将消费者需求与生产商对接,极大提升了生产效率和市场响应速度,本文将探讨如何通过构建高效的运营平台,利用大数据分析、人工智能算法及灵活的供应链管理,优化…

四川汇昌联信做拼多多电商怎么样?

近年来,拼多多凭借其独特的社交电商模式迅速崛起,成为国内领先的电商平台之一。四川汇昌联信作为一家专注于电商领域的企业,涉足拼多多平台无疑是顺应市场趋势的明智之举。那么,四川汇昌联信在拼多多平台上的表现如何呢? 一、产品…

推荐国产跨平台、轻量级的文本编辑器 Notepad-- v2.18

Notepad-- 是使用C编写的轻量级文本编辑器, 简称ndd, 可以支持Window/Mac/Linux操作系统平台。 我们的目标:完成文本编辑类软件的国产可替代,重点在国产Uos/Linux系统、Mac 系统上发展。 对比其它竞品Notepad类软件而言,我们的优势是可以跨…

【unix高级编程系列】信号

引言 以前对信号的理解,仅仅停留在main函数入口注册几个异常信号(SIGPIPE、SIGSEGV、SIGFPE)处理函数。当捕获到异常时,将进程的堆栈进行打印,方便排查、定位问题。这一类问题我认为是利用linux系统的异常信号机制&am…

系统架构师选择题知识点笔记

系统架构师复习笔记 选择题知识点 分布数据库特性 分片透明性:指用户或应用程序不需要知道逻辑上访问的表具体是怎么分块存储的;复制透明性:指采用复制技术的分布方法,用户不需要知道数据是复制到哪些节点上;逻辑透…

AI绘画网站爆款推荐,人人都是艺术家!

嗨,小伙伴们,最近AI 绘画简直是火出了新高度!网上那么多 AI 绘图站,你或许已经眼花缭乱。但悄悄告诉你,有些站点只能照搬照片,却不让你天马行空地改造,想找一个既聪明又有创意的 AI 画家&#x…

Nginx详解配置实例及企业高性能web服务器

目录 企业高性能web服务器 一.Web 服务基础介绍 1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache 经典的 Web 服务端 1.2.1.1 Apache prefork 模型 1.2.1.2 Apache worker 模型 1.2.1.3 Apache event模型 1.2.2 Nginx-高性能的 Web 服务端 1.2.3服务端 I/O 流…

循环图神经网络教程2——循环图神经网络

介绍 循环图神经网络(Recurrent Graph Neural Network,RGNN)。在标准神经网络中,连续的学习权重层用于从输入张量中逐步提取更高级别的特征。在用于计算机视觉的神经网络中,低级特征(如短直线和曲线)的存在是由较早的…

Java类的卸载

类、类的加载器、类的实例之间的引用关系 类的生命周期 类的加载器如下:

进程部分相关概念

进程 进程是一个程序执行的过程,会去分配内存资源,cpu的调度 进程不仅仅是一个正在运行的程序,它包含了程序执行所需的所有资源和状态信息 资源分配:操作系统会为每个进程分配必要的资源,如内存空间、文件句柄等。这些…

nginx重定向与防盗链

重定向 由于网站的扩容,负荷较大,需要将一部分内容迁移到其他服务器上。但是这个时候又不能更改用户常访问的域名,因此对其进行重定向。 1. 域名重定向 www.sxl1.com/aaa的站点需要重定向到aaa.sxl1.com rewrite ^/aaa$ aaa.sxl1.com/…

letcode 分类练习 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

letcode 分类练习 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树 513.找树左下角的值112. 路径总和106.从中序与后序遍历序列构造二叉树 513.找树左下角的值 遍历二叉树,并记录当前的深度,如果深度大于最大深度,那么…

关于 Vivado HLS 的三大误读

【转载】关于 Vivado HLS 的三大误读 目前,在高层次综合(HLS, High Level Synthesis)领域,Vivado HLS可谓独树一帜。它有效地拉近了软件工程师与FPGA之间的距离,加速了算法开发的进程,缩短了产品上市时间。…

leetcode_52. N 皇后 II

52. N 皇后 II 题目描述:n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n 4 输出:2…

C++:病毒系列回归记2/3 (Doge智能系统已上线)

上一期:C:病毒系列回归记1/3 (Doge智能系统已上线) 这一步真的非常爽哦 void Crazy(int n) {if(n 0)system("start ラム.vbs");if(n 1)system("start 今年のトラック.vbs");if(n 2)system("start ロシアのスートン焼却発電.vbs")…