首页 > 解决方案 > Hazelcast 成员不共享嵌入式拓扑中的条目

问题描述

我有一个小型 Spring Boot 应用程序,我正在使用 Hazelcast(嵌入式缓存拓扑)进行缓存。这是 Hazelcast 的 @Configuration 类:

@Configuration
@EnableCaching
public class HazelcastConfig {
public static final String BANKS = "banks";

@Bean
Config config() {
    Config config = new Config();

    MapConfig mapConfig = new MapConfig();
    mapConfig.setTimeToLiveSeconds(3000);
    config.getMapConfigs().put(BANKS, mapConfig);

    return config;
}

}

然后我将 @Cachable 注释添加到我的方法之一:

@Cacheable(HazelcastConfig.BANKS)
public UserAccount findByAccountNumber(String accountNumber){
    logger.info("INSIDE REPO");
    UserAccount userAccount = new UserAccount();
    userAccount.setAccountNumber(accountNumber);
    userAccount.setId(new Long(1));
    userAccount.setAddress("via Rossi");
    userAccount.setName("Pippo");

    return userAccount;
}

一切似乎都运行良好:我第一次调用该方法时,程序进入了方法本身的主体;从程序第二次从缓存中获取值(程序没有进入方法体内部)。
当我运行 2 个应用程序实例时,问题就开始了;当我运行第二个实例时,我可以看到 Hazelcast 知道有 2 个成员(来自日志):

Members {size:2, ver:2} [
Member [172.15.245.39]:5701 - cec4e04a-a8ef-4bd1-9072-5c313ba14666
Member [172.15.245.39]:5702 - bfe7d9a0-dcfd-4a9e-8a10-3e3882e814d2 this
]

但是这 2 个成员似乎有 2 个单独的缓存;这是我的测试:

  1. 启动应用程序实例 1(tomcat 端口 8080)
  2. 启动应用程序实例 2(tomcat 端口 8090)
  3. 从实例 1 调用方法-> 程序不使用缓存(OK,因为缓存为空)
  4. 从实例 1 调用方法-> 程序使用缓存(好的,因为现在缓存有条目)
  5. 从实例 2 调用方法-> 程序不使用缓存(KO,因为我认为两个实例的缓存应该具有相同的条目)。

    有什么建议吗?

标签: javaspring-bootcachinghazelcast

解决方案


推荐阅读