Hazelcast ITopic 和侦听器崩溃

Hazelcast ITopic and listener crash

我有一个使用 ITopic 的多节点集群 Hazelcast 应用程序。我试图了解,为了在节点崩溃时使事情 "cleaned up" 正确,我的应用程序是否应该检测到节点崩溃并删除该节点的注册 ID - 或者 Hazelcast 是否会自动处理。

"node crash" 我的意思是作为 Hazelcast 集群一部分的应用程序不正常地终止,没有调用 ITopic.removeMessageListener 或 HazelcastInstance.shutdown。这可能是由于应用程序崩溃或被杀死或主机崩溃。

长话短说,希望对您有所帮助。我不知道 Hazelcast 的内部结构,也无法在文档中找到任何相关内容。但是,我可以想到这种 "automatic" 清理工作的几种方法: 1. 在每个节点上,Hazelcast 保留所有订阅者的列表,包括本地和远程。当它检测到另一个节点不可用时,Hazelcast 会自动从 ITopic 订阅者列表中删除该节点的侦听器。 2. 在每个节点上,Hazelcast 只保留本地订阅者列表。当发布者调用 ITopic.publish 时,Hazelcast 将消息发送到所有节点。收到消息后,每个节点上的 Hazelcast 都会调用所有本地订阅者上的 onMessage。

这是一个示例场景。假设我有一个包含 2 个节点 A 和 B 的 Hazelcast 集群。节点 A 和节点 B 都通过 ITopic.addMessageListener.

向同一个 ITopic 注册监听器

假设节点 B 没有调用 ITopic.removeMessageListener 或 HazelcastInstance.shutdown

就崩溃了

最终,节点 A 上的 Hazelcast 检测到节点 B 不可用。

现在假设节点 A 上的发布者调用 ITopic.publish。 A 上的 Hazelcast 是否仍会尝试将消息发送给 B 上的订阅者?假设在一段时间后节点 B 重新启动,并且 A 上的发布者调用 ITopic.publish。 A 上的 Hazelcast 是否仍会尝试将消息发送给 B 上的旧订阅者?

提前致谢。

Hazelcast 将在检测到死亡时自动删除死亡节点的侦听器。如果这没有发生(我猜你可能有理由问)这是一个错误。

Hazelcast 也不会在节点被识别为死亡后尝试将事件发送到死亡节点,这意味着节点 B 节制时发送的事件不会在节点返回时重新传递。旧的死节点 B 和新连接的节点之间没有关联。

这是否回答了问题? :)