通常,发布-订阅模式是关于获取内容更新的。但是,订阅者如何获得订阅更新之前的初始内容呢?
我正在为我的应用程序在高速公路框架内使用发布-订阅示例。当关节移动时,发布者后端会发布机器人关节的位置。客户端前端有时会稍后订阅该主题。由于数据的性质,客户端上"主题"的初始值与发布者进行的后续更新同样重要。因此,在成功建立连接后,我想立即获取该主题的"当前"值。
框架中是否有某种类型的设计模式,我可以利用这些模式来获取"当前"值(订阅前的值)?我可以想到某种单独的 RPC 服务来获取它,但它似乎将通过一个单独的交付渠道。理想情况下,我希望发布者注意到我刚刚订阅并将初始值推送给单个客户端,或者类似的东西,但这可能要求太多了,或者不是吗?
理想情况下,我希望发布者注意到我刚刚订阅并将初始值推送给单个客户端
这是一个非常好的用例和期望的行为......事实上,它在WAMP高级配置文件的功能列表中:https://github.com/tavendo/WAMP/issues/69
这似乎已经足够明确地定义了,并且在路由器中实现并不是特别困难......但它需要路由核心中的代码。
更简单的替代方法:为您的主题创建一个始终订阅的数据库前端订阅者组件,存储主题值的时间序列。 您的前端客户端查询您的数据库并提取您需要的任何订阅前主题值。 现在,您拥有初始值和当前实时订阅值。
我认为在路由器中提供此功能是矫枉过正的。 只需让您的数据库成为订阅者,并将预订阅获取逻辑挂钩到您的订阅者组件即可。 当然,它将数据库作为交换点,但仅在历史(非实时)上,并且正如功能列表所描述的那样,如果数据库订户没有记录订阅前值,那么路由器必须记录。 还可以防止路由器看起来/感觉像持久性存储,这不是它的工作。
编辑:Kraken本质上是这样做的:它从数据库中提取最后一点主题更改,并在每次新订阅时同步历史和实时。
http://asana.github.io/kraken/。 应用程序使用 Kraken 通过主题发送和接收消息。这些消息通常只包含足够的信息来标识客户端在发布消息之前更改的数据集。当其他客户端收到这些消息时,它们将找出哪些数据发生了更改,并从数据存储中重新加载这些数据,以便最终使它们保持最新状态。
至少交叉栏现在可以在订阅时检索最新发布的值。
您需要启用内存中事件历史记录并请求保留事件。
在这里你可以找到一个关于autobahn-python的例子:https://github.com/crossbario/autobahn-python/commit/c8eddd653fe77fc00cbbcfc395f3a1d0be88cd1b