在 Orion 负载平衡场景中,订阅和通知的行为是什么?
What would be the behavior of subscriptions and notifications in an Orion Load-Balancing scenario?
基于这个关于如何通过负载平衡扩展 Orion Context Broker 的答案订阅和通知的行为应该是什么?
服务器应该从哪里来?工作流程是什么?
它会导致一些干扰或克隆订阅吗?
让我们考虑不同的情况,具体取决于订阅缓存的使用情况。让我们在不失一般性的情况下考虑两个 Orion 节点(A 和 B),它们共享相同的 MongoDB 实例。
使用订阅缓存(即未设置-noCache
)
订阅创建请求被分派到一些节点(假设它是节点 A)。节点 A 会将订阅持久保存在本地(即节点 A)订阅缓存中的共享数据库 和 中。请注意,在下一次订阅缓存刷新之前,节点 B 不会知道新订阅,这意味着。那等于等于 -subCacheIval
参数的秒间隔。
现在让我们考虑更新(在 entity/attribute 上匹配订阅条件以触发通知)到达。根据负载均衡器将更新分派到哪个节点以及它到达的时刻(关于订阅创建请求时间),可能会发生以下情况之一:
更新到达节点 B,在 下一次订阅刷新之前(即多达 -subCacheIval
秒)。鉴于节点 B 对订阅一无所知,因此不会发送通知。
更新到达节点 B,在 下一次订阅刷新后(即多达 -subCacheIval
秒)。节点 B 知道新订阅是刷新的结果,因此发送通知。
更新到达节点A,无论是在下一次订阅刷新之前还是之后。节点 A 是创建订阅的节点,因此它的缓存从一开始就是最新的。这样,通知就发送了。
Colorary:订阅创建后等待-subCacheIval
将确保订阅已传播到所有CB节点,因此将始终发送通知。但是,请注意设置太小的 -subCacheIval
值可能会产生负面影响。 the Orion performance documentation section.
中分析了权衡
最后,关于节流,注意the Orion implementation notes中的以下备注:
In addition, Orion implements throttling in a local way. In multi-CB configurations, take into account that the last-notification measure is local to each Orion node. Although each node periodically synchronizes with the DB in order to get potentially newer values (more on this here) it may happen that a particular node has an old value, so throttling is not 100% accurate.
因此,如果您需要精确节流,最好在通知接收端点实现,而不是使用 Orion 提供的。
不使用订阅缓存(即设置了 -noCache
)
在这种情况下,订阅评估总是在查询数据库时完成。因此,无论哪个节点(A 或 B)创建了订阅,因为它存储在 DB 中。因此,无论是 A 还是 B 处理更新,因为它会在数据库中检查匹配的订阅,并且在这种情况下始终会发送通知。
但是请注意,这种模式(不使用订阅缓存)可能会带来严重的性能缺陷(尤其是在使用基于模式的订阅的情况下),因此不推荐使用。
我不太确定,但在这种情况下可能不会发生针对其他情况描述的节流问题。
基于这个关于如何通过负载平衡扩展 Orion Context Broker 的答案
服务器应该从哪里来?工作流程是什么?
它会导致一些干扰或克隆订阅吗?
让我们考虑不同的情况,具体取决于订阅缓存的使用情况。让我们在不失一般性的情况下考虑两个 Orion 节点(A 和 B),它们共享相同的 MongoDB 实例。
使用订阅缓存(即未设置-noCache
)
订阅创建请求被分派到一些节点(假设它是节点 A)。节点 A 会将订阅持久保存在本地(即节点 A)订阅缓存中的共享数据库 和 中。请注意,在下一次订阅缓存刷新之前,节点 B 不会知道新订阅,这意味着。那等于等于 -subCacheIval
参数的秒间隔。
现在让我们考虑更新(在 entity/attribute 上匹配订阅条件以触发通知)到达。根据负载均衡器将更新分派到哪个节点以及它到达的时刻(关于订阅创建请求时间),可能会发生以下情况之一:
更新到达节点 B,在 下一次订阅刷新之前(即多达
-subCacheIval
秒)。鉴于节点 B 对订阅一无所知,因此不会发送通知。更新到达节点 B,在 下一次订阅刷新后(即多达
-subCacheIval
秒)。节点 B 知道新订阅是刷新的结果,因此发送通知。更新到达节点A,无论是在下一次订阅刷新之前还是之后。节点 A 是创建订阅的节点,因此它的缓存从一开始就是最新的。这样,通知就发送了。
Colorary:订阅创建后等待-subCacheIval
将确保订阅已传播到所有CB节点,因此将始终发送通知。但是,请注意设置太小的 -subCacheIval
值可能会产生负面影响。 the Orion performance documentation section.
最后,关于节流,注意the Orion implementation notes中的以下备注:
In addition, Orion implements throttling in a local way. In multi-CB configurations, take into account that the last-notification measure is local to each Orion node. Although each node periodically synchronizes with the DB in order to get potentially newer values (more on this here) it may happen that a particular node has an old value, so throttling is not 100% accurate.
因此,如果您需要精确节流,最好在通知接收端点实现,而不是使用 Orion 提供的。
不使用订阅缓存(即设置了 -noCache
)
在这种情况下,订阅评估总是在查询数据库时完成。因此,无论哪个节点(A 或 B)创建了订阅,因为它存储在 DB 中。因此,无论是 A 还是 B 处理更新,因为它会在数据库中检查匹配的订阅,并且在这种情况下始终会发送通知。
但是请注意,这种模式(不使用订阅缓存)可能会带来严重的性能缺陷(尤其是在使用基于模式的订阅的情况下),因此不推荐使用。
我不太确定,但在这种情况下可能不会发生针对其他情况描述的节流问题。