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.rhkb.cn/news/403624.html

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

相关文章

C++:命名空间与输入输出

目录 前言 一、命名空间 1.1 namespace的价值 1.2 namespace的定义 1.3 命名空间的使用 二、C输入&输出 前言 C是一种面向对象的计算机程序设计语言,‌它扩展了C语言的功能,‌并引入了面向对象编程的概念,‌如类、‌继承和多态等&a…

【图形学】TA之路-矩阵应用平移-旋转-大小

矩阵应用:在 Unity 中,Transform 和矩阵之间的关系非常密切。Transform 组件主要用于描述和控制一个物体在三维空间中的位置、旋转和缩放,而这些操作背后实际上都是通过矩阵来实现的 1. Transform 组件与矩阵的关系 Transform 组件包含以下…

基于django的影音播放网站 /基于python的影视网站/影视播放系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

论文阅读笔记:The Graph Neural Network Model

论文来源 IEEE Transactions on Neural Networks,Volume: 20 Issue: 1 背景 图神经网络模型本身具有广泛的使用背景,由于我个人研究交通流量预测的需要,此处仅考虑深度学习领域。图结构指的是由节点node和若干个连接的边edge组成的一种数据…

Spring Boot 3.3 【四】Spring Boot 整合JPA

🌟 技术人聊管理 请关注 【技术管理修行】 一、JPA 简介 Spring Data JPA 是 Spring Data 项目的一部分,它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工…

XSS-过滤特殊符号的正则绕过

目录 靶场练习地址:https://xss.pwnfunction.com/ 题目源码: 代码分析: 方法一:匿名函数 方法二:使用eval函数绕过限制 示例: 方法三:利用hash绕过 靶场练习地址:https://xs…

【Linux网络】NAT技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 随着互联网的飞速发展,IP地址资源日益紧张,这促使了NAT(Network Address Translation,网络地址转换)技术的诞生与发展。NAT技术不仅解决了IPv4…

MySQL实现SQL Server中UPDLOCK与READPAST组合功能

碰到一位同事求助解决消息中台一个线上的bug,具体描述如下: 首先有一张主表记录消息待发送的内容,一张子表记录本条消息的发送状态。若发送成功则将此条消息的发送状态修改为已发送并做逻辑删除。代码通过定时任务每2s轮询子表,如…

安装cuda支持的opencv-python Windows版本(包含常见错误处理)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…

节点使用简介:comfyui-photoshop

1、安装comfyui-photoshop 略过 一点要注意的是:在Photoshop上的安装增效工具,要通过Creative Cloud 桌面应用程序进行安装,才能成功在增效工具中显示,直接通过将文件解压到Plug-ins路径行不通(至少对我来说行不通&am…

C++语言基础|函数的嵌套与递归

C语言基础|函数的嵌套与递归 1. 函数的嵌套调用2. 函数的递归调用 1. 函数的嵌套调用 在一个函数中调用其它函数叫函数的嵌套。C中函数的定义是平行的,除了main()以外,都可以互相调用。函数不可以嵌套定义,但可以嵌套调用。比如函数1调用了函…

【百度】25届秋招内推码

内推码 IV1RBB 介绍 📣 百度TPG技术中台事业群组—深度学习技术平台部 25届校招正在进行中,可通过定向内推形式get校招绿色通道 ! 欢迎联系我定向内推 🌟【部门介绍】 飞桨(PaddlePaddle)以百度多年的深度…

前端技巧——复杂表格在html当中的实现

应用场景 有时候我们的表格比较复杂,表头可能到处割裂,我们还需要写代码去完成这个样式,所以学会在原生html处理复杂的表格还是比较重要的。 下面我们来看这一张图: 我们可以看到有些表头项的规格不太一样,有1*1 2*…

阶段练习——minishell

目录 (一)文件复制(my_cp函数) (二)文件内容查看(my_cat函数) (三)切换目录(my_cd函数) (四)列出目录内容…

Elasticsearch、Easy-es 快速入门 SearchAfterPage分页 若依前后端分离 Ruoyi-Vue SpringBoot

一、环境安装 Elasticsearch ik分词器 1.1 下载解压Elasticsearch-7.x版本,越高越好,低版本有Log4j漏洞,Easy-es目前支持7.x 1.2 IK中文分词器 将对应Elasticsearch版本IK放进文件夹,Elasticsearch-7.6.1,ik对应版…

Postgres 超时 (Timeout) 详解

原文地址 https://www.bytebase.com/blog/postgres-timeout/ PostgreSQL 提供各种超时 (Timeout) 设置,通过控制某些进程的持续时间来帮助管理和优化数据库操作。这些超时对于确保系统的稳定性和性能至关重要,尤其是在高流量或复杂查询的环境中。让我们…

STM32CubeMX生成stm32MP135中断优先级配置错误修正方法

0 修改方法 使用STM32CubeMX生成stm32MP135代码的中断优先级配置错误,将导致所有中断优先级设置不对。 如果设置EXTI0中断优先级为10,在STM32CubeMX中配置如下: 生成的中断优先级配置代码为: 正确写法应该将中断优先级左移3位&…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的,可重复使用的,用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

二叉树学习笔记

一、树的概念 树是一种非线性的结构,它是由n个有限结点组成的一个具层次关系的集合。(像一颗倒着的树) 特点: 有一个特殊的结点,称之为根结点,根结点没有前驱结点 除了根节点以外,其余节点别分…

centos 7.9 迁移到 openEuler22.03-LTS-SP3

openEuler移植案例 | 移植操作指南 | openEuler社区官网 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) 需要两台机器, 不通过原因 在待升级节点检查是否有安装x2openEuler-core时, 发现已经安装了,不能作为升级节点。该节点为: 解…