为什么/何时使用DDS代替ZeroMQ?

use*_*129 18 ipc zeromq data-distribution-service

我读了以下内容:

  1. DDS与AMQP对比ZeroMQ
  2. http://mnb.ociweb.com/mnb/MiddlewareNewsBrief-201004.html

似乎没有使用DDS代替zmq的功能:

  1. zmq的延迟更好.
  2. 在我看来,ZMQ的API清晰而简单.
  3. 我不能使用ZMQ来在线程/进程/站之间传输数据.

所以:

  1. 什么时候使用DDS更好?
  2. 与ZMQ相比,DDS 有更好的表现吗?
  3. 是否有使用DDS(而不是ZMQ)的明确目的

谢谢

Ger*_*rdo 51

在我作为DDS实现者/供应商的经验中,许多应用程序发现使用DDS而非中间件技术(包括ZeroMQ)的显着优势.事实上,我看到使用DDS比ZeroMQ更多的"关键应用程序"......

首先澄清一下:

(1)DDS及其下面使用的RTPS协议是标准,而不是特定产品.这些标准有很多实现.据我所知,至少有9家不同的公司拥有实施这些标准的独立产品和代码库.谈论DDS与ZeroMQ的"性能"没有意义,你只能谈谈具体实现的性能.我将在稍后讨论性能问题,但仅从这个角度来看,你的陈述"zmq的延迟更好"显然是错误的.当然,相反的说法也是错误的.

(2)我在您提供的第一次参考资料中没有找到太多客观信息.主要观点是,DDS似乎最适合该应用程序,并且人们担心它的使用范围有多广泛,AC的回复澄清了这一点.但这些论点似乎有点主观.根据某人对特定产品代码库的主观检查,对AC的帖子做出了否定回复.即使假设发布负面评论的人有一个有效的观点,评论也只适用于一个特定的DDS实施/产品,而不是一般的DDS.就个人而言,我不会对这一评论给予太多的信任,它的语气似乎过于敌对,不能仅基于陈述的事实.

(3)关于API的清晰度/简单性.您的评论是基于您在第二个参考中提供的基准示例吗?此代码未使用标准DDS API.我不确定为什么OCI(写那篇文章的公司)这样做 - 也许他们改编了其他一些先前的代码.

查看符合DDS规范的API示例的好地方是:

无论如何,正如我后面提到的,DDS和ZeroMQ提供的抽象层是完全不同的,因此API不能直接比较......

在回答你的具体问题.

1.什么时候使用DDS更好?

很难对这个问题提供简短/客观的答案.我相信ZeroMQ是一个很好的产品,很多人都很开心.关于DDS也是如此.

我认为最好的办法是指出一些差异,让人们决定什么对他们很重要.

DDS和ZeroMQ在治理,生态系统,功能甚至抽象层方面都有所不同.

一些重要的区别:

1.1治理,标准和生态系统

DDS和RTPS是对象管理组(OMG)的开放国际标准.ZeroMQ是一个"由其贡献者控制的松散结构"

这意味着有开放的治理和明确的OMG流程来控制规范及其演变,以及知识产权规则.

ZeroMQ IPR不太清楚IMO.从他们的网页(http://zeromq.org/docs:features)他们说"ZeroMQ的libzmq核心由其贡献者拥有"和"ZeroMQ组织是一个松散的联盟,没有明确的权力结构,大多数生活在GitHub上.组织维基页面解释了如何通过引入一些有趣的工作来加入业主团队."

这种"松散结构"对于关心知识产权血统,保修和赔偿等问题的用户来说可能更成问题.

与此相关.如果我理解正确,只有一个核心ZeroMQ实现(github中的那个),并且只有站在它后面的公司(iMatix).从那里开始,似乎只有4个提交者在核心(libzmq)中进行大部分开发工作.如果iMatix被收购或决定改变其商业模式,或主要提交者失去兴趣,那么除了支持代码库本身之外,用户几乎没有追索权.

当然,有许多基于代码共同所有权的成功项目/技术.另一方面,拥有与独立产品,代码库和商业模式竞争的公司生态系统为该技术的未来提供了良好的保证......这一切都取决于社区和生态系统的规模以及用户的风险厌恶程度.

1.2特征和抽象层

DDS和ZeroMQ都支持发布 - 订阅和Request-Reply等模式(这是DDS的新增功能,即所谓的DDS-RPC).但总的来说,DDS的抽象层更高.意味着中间件对应用程序更"自动".特别.

DDS提供自动发现

在DDS中,您只需发布/订阅主题名称.您永远不必提供IP地址,计算机名称或端口.它全部由内置发现处理.它无需额外服务即可自动完成.这意味着可以重新部署和集成应用程序,而无需重新编译或重新配置.

ZeroMQ是较低级别的.您必须指定端口,IP地址等.

DDS pub-sub是以数据为中心的.

应用程序可以发布到主题,但关联的数据可以表示更新为多个数据对象,每个数据对象由键属性标识.例如,当发布飞机位置时,每个更新可以识别"飞机ID",并且中间件可以分别为每架飞机提供历史,执行QoS,更新速率等.当新飞机出现或从系统中消失时,中间件会理解并进行通信.

与上述DDS相关的可以保留应用程序的相关数据的缓存,其可以在其认为合适时查询(通过密钥或内容),例如读取飞机的最后5个位置.应用程序会收到更改通知,但不会立即强制使用它们.这也有助于减少应用程序开发人员需要编写的代码量.

DDS为"应用程序"QoS提供更多支持

DDS支持超过22种消息和数据传递QoS策略,例如可靠性,端点活动,消息持久性和向后加入者的传递,消息过期,故障转移,定期更新监视,基于时间的过滤,排序等.这些都是通过简单的QoS策略设置配置.该应用程序使用相同的读/写API,所有额外的工作都在下面完成.

ZeroMQ通过提供构建块和模式来解决这个问题.它非常灵活,但应用程序必须编程,组装和编排不同的模式以获得更高级别的行为.例如,要获得可靠的pub-sub,需要组合多个模式,如http://zguide.zeromq.org/page:all#toc119中所述.

DDS支持其他功能,如内容过滤,时间过滤,分区,域,......

这些在ZeroMQ中不可用.它们必须在应用层构建.

DDS提供类型系统并支持类型可扩展性和可变性

您必须将ZeroMQ与google协议缓冲区等其他软件包结合使用才能获得类似的功能.

安全

DDS-Security规范提供了细粒度(主题级)安全性,包括身份验证,加密,签名,密钥分发,安全多播等.

2.与ZMQ相比,DDS有更好的表现吗?

请注意,您参考的基准是针对Object Computing Inc的"OpenDDS"实现.据我所知,这不是最快的DDS实现之一.我建议你看一下其他一些产品,如RTI Connext DDS(我们的实施),PrimsTech的OpenSplice DDS或TwinOaks的CoreDX DDS.当然,结果对于所使用的实际测试,网络和计算机是高度可靠的,但使用C++的更快DDS实现的典型延迟性能大约为50微秒,而不是180微秒.请参阅https://www.rti.com/products/dds/benchmarks.html#CPPLATENCY

像DDS或ZeroMQ这样的中间件层运行在诸如UDP或TCP之类的东西之上,所以我希望它们受到底层网络可以做什么的约束,对于简单的情况它们可能没有太大的不同,它们当然会比原始运输.

差异还来自他们提供的服务.因此,您应该比较您可以获得的相同服务级别,例如可靠地发布到扩展到许多消费者,优先化信息,通过UDP发送多个流和大数据(以避免TCP的行头阻塞)等.

基于您参考的OpenDDS研究,以及不同DDS实现的相对性能(http://www.dre.vanderbilt.edu/DDS/),我希望在一个苹果对苹果测试中,性能更好的实现DDS将匹配或超过ZeroMQ.

也就是说人们很少选择能够提供"最佳性能"的中间件.否则,没有人会使用Web服务或HTTP.选择基于许多因素,性能只需要满足应用程序的需求即可.稳健性,可扩展性,支持,风险,可维护性,编程模型对域的适应性,总体拥有成本等通常对决策更为重要.

3.使用DDS(而不是ZMQ)有明确的目的吗?

嗯,是的......在许多应用程序中,它在性能,可伸缩性,功能,应用程序简单性,健壮性,降低风险和总体拥有成本方面提供了最佳权衡.在过去的几年里,成千上万的项目得出了这个结论:)

赫拉尔

  • 杰拉多,干得好。感谢您的分享和在一个领域中做出的论证和普及的杰作,在这个领域中,一些 SLOC 创造了如何处理任何事情的幻觉。**谢谢** (2认同)