4

我一直在尝试阅读 DDS 标准,尤其是 OpenSplice,我对架构感到疑惑。

DDS 是否需要运行代理或任何特定的守护进程来管理不同方之间的消息交换和协调?如果我只是为一个主题启动一个发布数据的进程,并启动另一个订阅同一主题的进程,这就足够了吗?是否有任何理由可能需要另一个进程运行?

或者,它是否使用 UDP 多播在发布者和订阅者之间进行某种自动发现?

一般来说,我试图将其与传统的队列架构(如 MQ 系列或 EMS)进行对比。

如果有人可以帮助阐明这一点,我将不胜感激。

谢谢,

法希姆

4

3 回答 3

5

DDS 没有中央代理,它使用基于多播的发现协议。OpenSplice 有一个模型,每个节点都有一个服务,但这是一个实现细节,如果你检查例如 RTI DDS,他们没有那个。

于 2011-12-30T21:41:22.227 回答
3

DDS 规范的设计使得实现不需要任何中央守护程序。但当然,这是实施的选择。

RTI DDS、MilSOFT DDS 和 CoreDX DDS 等实现具有分散式架构,它们是点对点的,不需要任何守护程序。(发现是通过 LAN 网络中的多播完成的)。这种设计有很多优点,比如容错、低延迟和良好的可扩展性。而且它使中间件的使用变得非常容易,因为不需要管理守护进程。您只需运行发布者和订阅者,其余的由 DDS 自动处理。

OpenSplice DDS 过去需要在每个节点上运行守护程序服务,但他们在 v6 中添加了一项新功能,因此您不再需要守护程序。(他们仍然支持 daemon 选项)。

OpenDDS 也是点对点的,但据我所知,它需要一个中央守护进程来运行以进行发现。

于 2012-02-15T21:25:04.417 回答
3

认为区分“集中式代理”架构(该代理可能成为/成为单点故障)和每台机器上基于 DDS-QoS 管理流量的服务/守护程序(例如重要性)确实很好(DDS:传输优先级)和紧迫性(DDS:延迟预算)。

有趣的是,大多数人认为在将 CPU 作为关键/共享资源(基于时间片、优先级等)管理的机器上拥有一个(实时)进程调度程序是绝对必要的,但是当它谈到 DDS,这完全是关于分发信息(而不是处理应用程序代码),人们发现“网络调度程序”会出现在“方便”(最少)来管理网络(-接口)作为共享资源并调度流量(基于 QoS 策略驱动的“打包”和多个流量形状的优先级通道的利用)。

这正是 OpenSplice 在利用其(可选)联合架构模式时所做的,在这种模式下,在单台机器上运行的多个应用程序可以使用共享内存段共享数据,并且每个物理网络都有一个网络服务(守护进程) -根据其实际 QoS 策略的紧迫性和重要性来调度入站和出站流量的接口。这样的服务可以“访问”所有节点信息这一事实也有助于将来自不同应用程序的不同主题的不同样本组合成(可能很大的)UDP 帧,甚至可能利用一些可用的延迟预算来进行这种“打包”和从而允许在效率(吞吐量)和确定性(延迟/抖动)之间进行适当的平衡。priority-lanes ' 带有 'private' Rx/Tx 线程和 DIFSERV 设置。

因此,每个节点都有一个网络调度守护进程肯定有一些优势(也因为它将网络与可能“过度生产”(即炸毁系统)或“反应不足”导致系统范围内重新传输的故障应用程序分离.. 在争论“网络调度守护进程”可以被视为“单点故障”这一事实时经常被遗忘的一个方面,而“其他观点”可能是没有任何仲裁,任何直接与线路对话的“独立”应用程序可以被视为潜在的系统线程,当它出于任何原因开始出现如上所述的行为不端时。

无论如何......它总是一个有争议的讨论,这就是为什么 OpenSplice DDS(从 v6 开始)支持两种部署模式:联合和非联合(也称为“独立”或“单一进程”)。

希望这有点帮助。

于 2013-07-23T11:41:29.427 回答