【问题标题】:Prevent subscribers from reading certain samples temporarily阻止订阅者暂时阅读某些样本
【发布时间】:2013-11-13 14:23:34
【问题描述】:

我们的情况是有 2 个模块,一个有发布者,另一个有订阅者。发布者将使用关键属性发布一些示例。发布者是否可以阻止订阅者阅读某些样本?当具有发布者的模块当前正在更新样本时会出现这种情况,它不希望任何其他人在完成之前阅读该样本。类似互斥锁的东西。 我们计划使用 Opensplice DDS,但请提供您的输入,即使它们不是特定于 Opensplice。 谢谢。

【问题讨论】:

  • 您的问题对我来说并不完全清楚。您说当发布者所在的模块当前正在更新示例时会出现这种情况。使用 DDS 更新单个样本始终是原子操作。假设您正在寻找类似于 多个 样本事务的机制,那么了解事务中的样本是否由同一个 DataWriter 编写很重要——您只提到了 Publisher,是吗?意思是说DataWriter?
  • 抱歉不清楚。是的,Publisher 我的意思是 DataWriter 和事务中的样本是由同一个 DataWriter 编写的。我会尽量说得更清楚。当我说更新样本时,我的意思是模块正在进行一些处理,并且在这段时间内(即当它正在处理要更新样本的数据时)我想阻止订阅者读取样本.当我知道将要发布更新时,我基本上想确保没有订阅者阅读示例。我希望这能让它更清楚,但如果我不是,请告诉我。
  • 好的,所以听起来您想在进行计算时为某个样本“锁定”DataReader。然后,当计算完成后,您要编写样本并解锁 DataReader。有点像数据库中的记录级锁。对吗?
  • 对不起,我的回复延迟了,但这是绝对正确的..

标签: data-distribution-service opensplice


【解决方案1】:

RTI Connext DDS 提供了一个选项来协调写入(在文档中称为“连贯写入”,请参阅 Section 6.3.10PRESENTATION QoS

myPublisher->begin_coherent_changes();
// (writers in that publisher do their writes) /* data captured at publisher */
myPublisher->end_coherent_changes(); /* all writes now leave */

问候,
撕掉

【讨论】:

    【解决方案2】:

    如果我正确理解了您的问题,那么没有本地 DDS 机制来实现您正在寻找的内容。你写道:

    当具有发布者的模块当前正在更新样本时会出现这种情况,它不希望任何其他人在完成之前阅读该样本。类似互斥体的东西。

    在 DDS 中没有“全局互斥锁”之类的东西。

    但是,我怀疑您可以通过向数据模型添加一些信息并调整应用程序逻辑来实现您的目标。例如,您可以在数据中添加枚举字段;假设您添加了一个名为status 的字段,它可以采用CALCULATINGREADY 中的一个值。

    在发布者方面,您的应用程序可以发布一个将status 值设置为CALCULATING 的样本,而不是“获取互斥锁”。计算完成后,可以写入新样本,将status的值设置为READY

    在订阅者方面,您可以使用 QueryConditionstatus=READY 作为其表达式。只能通过QueryCondition、使用read_w_condition()take_w_condition() 来读取或执行操作。每当状态不等于READY 时,订阅方将看不到任何样本。这种方法利用了新样本覆盖旧样本的机制,假设您的历史深度设置为默认值 1。

    如果这会导致您正在寻找的行为,那么这种方法还有两个缺点。首先,使用status 字段和QueryCondition 会污染应用程序逻辑。不过,这很容易被抽象层隐藏。甚至可以将其隐藏在某些类似锁定/解锁的界面后面。第二个缺点是当将status 字段设置为CALCULATING 时,额外的样本会通过网络传输。但是,如果您想实现类似分布式互斥锁的功能,无论如何都无法避免额外的通信。只有当您的样本非常大和/或频率很高时,这才是一个问题。在这种情况下,您可能不得不求助于一个专用的小主题来模拟锁定机制。

    【讨论】:

    • 感谢您的回答。正在查看 opensplice 的 begin_coherent_changes() 但似乎是可选的,他们还没有实现它。将向他们发送有关它的查询。与此同时,您的解决方案似乎是合乎逻辑的方式。
    • 不客气。看着你的问题,我不认为 begin_coherent_changes() 会提供你需要的功能。该功能旨在开始“交易”(在此处使用database term)。只要交易没有完成,订阅者仍然可以读取旧值,这不是您要求的。
    • 嗯。那么你的是唯一的出路:)再次感谢
    【解决方案3】:

    PRESENTATION Qos 不是特定的 RTI Connext DDS。它是 OMG DDS 规范的一部分。也就是说,在多个 DataWriters/Topics(而不是使用单个 DataWriter)上编写一致更改的能力是可选配置文件(对象模型配置文件)之一的一部分,因此并非所有 DDS 实现都必须支持它。

    杰拉尔多

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2014-02-08
      相关资源
      最近更新 更多