【发布时间】:2015-03-26 03:16:54
【问题描述】:
我有一个使用 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 上的旧订阅者?
提前谢谢你。
【问题讨论】:
标签: hazelcast