【问题标题】:Hazelcast ITopic and listener crashHazelcast ITopic 和监听器崩溃
【发布时间】: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


    【解决方案1】:

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

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

    这能回答问题吗? :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多