基于这个答案,关于如何使用负载平衡https://stackoverflow.com/a/33068119/3706998扩展Orion Context Broker,订阅和通知的行为应该是什么?
巫婆服务器应该来自哪里?什么是工作流程?
它会导致一些令人不安或克隆的订阅吗?
答案 0 :(得分:3)
让我们考虑不同的情况,具体取决于订阅缓存的使用情况。让我们考虑两个Orion节点(A和B)而不失一般性,两者共享相同的MongoDB实例。
使用订阅缓存(即未设置-noCache
)
将订阅创建请求分派给某些节点(假设它是节点A)。节点A将订阅保留在本地(即节点A)订阅缓存中的共享DB 和中。请注意,节点B在下次订阅缓存刷新之前不会知道新订阅,这意味着。这是一个等于-subCacheIval
参数的秒的间隔。
现在让我们考虑更新(在与触发通知的订阅条件匹配的实体/属性上)到达。取决于负载均衡器调度更新的节点及其到达的时刻(关于订阅创建请求时间),可能会发生以下情况之一:
更新在下一次订阅刷新之前到达节点B,(即多达-subCacheIval
秒)。鉴于节点B对订阅一无所知,因此不会发送通知。
更新到达节点B,在下一次订阅刷新后(即-subCacheIval
秒)。节点B知道新订阅是刷新的后果,因此发送通知。
更新到达节点A,无论是在下次订阅刷新之前还是之后。节点A是创建订阅的节点,因此它的缓存从一开始就是最新的。因此,通知将被发送。
Colorary:在创建订阅后等待-subCacheIval
将确保订阅已传播到所有CB节点,因此将始终发送通知。但请注意,设置过小的-subCacheIval
值可能会产生负面影响。权衡在the Orion performance documentation section中分析。
最后,关于限制,请注意the Orion implementation notes中的以下注释:
此外,Orion以本地方式实施限制。在多CB配置中,请考虑最后通知度量是每个Orion节点的本地度量。虽然每个节点周期性地与DB同步以获得可能更新的值(更多关于此here),但特定节点可能会发生旧值,因此限制不是100%准确。
因此,如果您需要精确限制,最好在通知程序接收端点实现它,而不是使用Orion提供的那个。
未使用订阅缓存(即已设置-noCache
)
在这种情况下,订阅评估总是在查询数据库时完成。因此,无论哪个节点(A或B)创建了订阅,因为它存储在DB中。因此,无论A或B是否处理更新,因为它将在数据库中检查匹配的订阅,并且在这种情况下始终发送通知。
但请注意,此模式(不使用订阅缓存)可能会产生严重的性能缺陷(特别是在使用基于模式的订阅的情况下),因此不建议这样做。
我不完全确定,但在这种情况下可能不会发生针对其他情况所描述的限制问题。