防止 hazelcast 在每个节点上注册 EvictionListener

Prevent hazelcast to register EvictionListener on every node

我们目前遇到一个问题,即我们在 Hazelcast Config Bean 中为特定地图配置地图条目侦听器。我们遇到的问题是监听器在每个节点上实例化,这对我们的实现来说是有意义的并且是正确的,但实际上这不是我们试图实现的。有没有一种方法可以只在地图上为一个集群节点或集群本身添加一个监听器,这样当条目被驱逐时,只有一个监听器注册到地图上?

明确一点:我们的 spring 启动应用程序 运行 有 12 台服务器,它们都在 hazelcast 集群中注册为节点。因此,如果一个条目被驱逐,则有 12 个听众对驱逐做出反应。我们只想为这种情况注册一个监听器。

这是来自 Config Bean 的代码,在我们的服务器集群中的每个应用程序中 运行 都是节点:

@Bean
Config hazelcastConfig(AppConfigurationProperties properties, 
HazelcastEvictionListener hazelcastEvictionListener) {

HazelcastProperties hazelcastProperties = properties.getHazelcast();
    Config config = new Config();

    MapConfig activationMapConfig = new MapConfig();
    activationMapConfig.setName(HazelcastMaps.ACTIVATION_INFORMATION);
    activationMapConfig.addEntryListenerConfig(new 
EntryListenerConfig(hazelcastEvictionListener, false, true));
...}

有没有办法配置 hazelcast,使这个 EntryListener 在所有节点上只注册一次?

我实际上不知道以这种方式使用 hazelcast 是否有意义,但我是 Hazelcast 主题的新手,希望得到帮助或想法。

侦听器注册是基于每个客户端完成的,这意味着您可以在一个客户端上注册,而不能在另一个客户端上注册;但是,听起来您想要一个集群范围的单例。要实现集群范围的单例,您可以使用 Hazelcast 分布式锁,因为 client/bean 是可选的,因此一次只能在特定集群中执行一个方法调用,因此不会出现数据损坏/竞争条件是可以的。

对我来说,解决方案是设置标志 local=true,这样在集群中只有一个成员在其本地地图存储中保存该值。这仅触发了持有此值的特定成员上的 EvictionListener,这只会导致一个事件。