我有一个使用ITopic的多节点群集Hazelcast应用程序。我试图理解,为了在节点崩溃时正确地“清理”事物,我的应用程序应该检测到节点崩溃并删除该节点的注册ID - 或者Hazelcast是否自动处理它。
“节点崩溃”我的意思是,作为Hazelcast群集一部分的应用程序非正常终止,而不会调用ITopic.removeMessageListener或HazelcastInstance.shutdown。这可能是由于应用程序崩溃或被杀或主机崩溃。
这是长篇故事,如果有帮助的话。我不知道Hazelcast的内部结构,在文档中找不到任何相关内容。但是,我可以想到这种“自动”清理可以工作的几种方式: 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上的旧订户?
提前谢谢。
答案 0 :(得分:0)
Hazelcast会在死亡检测时自动删除死节点的监听器。如果这没有发生(我想你可能有理由问)这是一个错误。
Hazelcast也不会尝试在被识别为死亡之后将事件发送到死节点,这表示这意味着每当节点回来时,节点B禁止发送的事件都不会被重新传送。旧的死节点B和新连接的节点B之间没有相关性。
这回答了这个问题吗? :)