【问题标题】:Design pattern for getting initial value in pubsub in autobahn在高速公路的 pubsub 中获取初始值的设计模式
【发布时间】:2014-12-24 19:52:56
【问题描述】:

通常,发布-订阅模式是关于获取内容更新的。但是订阅者如何获得订阅更新之前的初始内容呢?

我正在为我的应用程序使用autobahn 框架内的发布-订阅示例。发布者后端在关节移动时发布机器人关节的位置。客户端前端有时会在稍后订阅该主题。由于数据的性质,客户端上“主题”的初始值与发布者进行的后续更新一样重要。因此,在建立成功连接后,我想获取主题的“当前”值。

我可以利用框架内的某种设计模式来获取“当前”值(订阅之前的值)吗?我可以想到某种单独的 RPC 服务来获取它,但它似乎将通过一个单独的传递通道。理想情况下,我希望发布者注意到我刚刚订阅并将初始值推送给单个客户端,或者类似的东西,但这可能要求太多,或者不是吗?

【问题讨论】:

    标签: design-patterns websocket publish-subscribe autobahn


    【解决方案1】:

    理想情况下,我希望发布者注意到我刚刚订阅并将初始值推送给单个客户端

    这是一个非常好的用例和所需的行为。事实上,它在 WAMP 高级配置文件的功能列表中:https://github.com/tavendo/WAMP/issues/69

    这似乎已经定义得很清楚了,在路由器中实现并不是特别困难..但它需要路由核心中的代码。

    【讨论】:

      【解决方案2】:

      一个更简单的替代方案:为您的主题创建一个始终订阅的数据库前端订阅者组件,存储主题值的时间序列。您的前端客户端查询您的数据库并提取您需要的任何预订阅主题值。您现在有了初始值和当前的实时订阅值。

      我认为在路由器中提供此功能是多余的。只需让您的数据库成为订阅者并将预订阅获取逻辑挂钩到您的订阅者组件即可。当然,它将数据库作为交换点放入,但仅在历史(非实时)上,并且正如功能列表所描述的那样,如果数据库订阅者没有记录预订阅值,那么路由器必须记录。还可以防止路由器看起来/感觉像持久存储,这不是它的工作。

      编辑: Kraken 本质上是这样做的:它从数据库中提取主题更改的最后一点,并在每次新订阅时同步历史和实时。

      http://asana.github.io/kraken/。 应用程序使用 Kraken 通过主题传输和接收消息。这些消息通常包含足够的信息来识别在消息发布之前由客户端更改的数据集。当其他客户端收到这些消息时,它们会找出哪些数据已更改并从数据存储区重新加载,以便最终更新。

      【讨论】:

        【解决方案3】:

        现在至少 crossbar 可以在订阅时检索最新发布的值。

        您需要启用内存中的事件历史记录并请求保留事件。

        您可以在此处找到 autobahn-python 的示例:https://github.com/crossbario/autobahn-python/commit/c8eddd653fe77fc00cbbcfc395f3a1d0be88cd1b

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多