Hazelcast вызывает loadAll() ДВАЖДЫ для того же ключа

Насколько я знаю, при использовании MapLoader Hazelcast вызывает loadAllKeys() один раз на узле, который владеет разделом, которому принадлежит имя карты.

loadAll(Collection<Long> keys) затем вызывается только на разделах, которым принадлежит данный ключ, полученный из loadAllKeys(), После этого значения распределяются по мере необходимости по кластеру.

Я выполняю базовый тест с одним узлом, одной картой и одной записью в моем постоянном хранилище.

Что я нахожу это loadAllKeys() правильно называется один раз, однако, loadAll(Collection<Long> keys) называется дважды. Почему это так?

Моя реализация loadAll(Collection<Long> keys) как следует:

@Override
public synchronized Map<Long, MyCacheEntry> loadAll(Collection<Long> keys) {

    return myCacheRepository.loadMyCacheDataForKeys(keys)
        .stream()
        .collect(Collectors.toMap(MyCacheEntity::getId,
                                  entity -> gson.fromJson(entity.getValue(), MyCacheEntry.class)
                ));

}

Это означает, что я делаю два поиска в моем постоянном хранилище вместо одного. Видя, как будто у меня есть одна запись в моей базе данных, я ожидал бы loadAll(Collection<Long> keys) быть вызванным только один раз.

Что здесь происходит?

Моя грубая тестовая конфигурация Hazelcast/Spring выглядит следующим образом:

@Configuration
public class HazelcastConfiguration {

  private final MyMapStore myMapStore;

  @Inject
  HazelcastConfiguration(@Lazy MyMapStore myMapStore) {
    this.myMapStore = myMapStore;
  }

  @PreDestroy
  public void shutdown() {
    Hazelcast.shutdownAll();
  }

  @Bean
  public HazelcastInstance hazelcastInstance() {

    Config config = new Config();
    config.getGroupConfig().setName("MyGroup");

    NetworkConfig networkConfig = config.getNetworkConfig();
    networkConfig.setPortAutoIncrement(false);

    JoinConfig joinConfig = networkConfig.getJoin();
    joinConfig.getMulticastConfig().setEnabled(false);
    joinConfig.getTcpIpConfig().setEnabled(true).setMembers(Collections.singletonList("127.0.0.1"));

    MapConfig mapConfig = new MapConfig("MyMap");
    mapConfig.setBackupCount(1);
    mapConfig.setAsyncBackupCount(1);
    mapConfig.setInMemoryFormat(InMemoryFormat.OBJECT);
    mapConfig.setTimeToLiveSeconds(0);

    EntryListenerConfig entryListenerConfig = new EntryListenerConfig();
    entryListenerConfig.setImplementation(new MyCacheEntryListener());
    mapConfig.addEntryListenerConfig(entryListenerConfig);

    MapStoreConfig mapStoreConfig = new MapStoreConfig();
    mapStoreConfig.setInitialLoadMode(MapStoreConfig.InitialLoadMode.EAGER);

    mapStoreConfig.setWriteDelaySeconds(1);
    mapStoreConfig.setImplementation(myMapStore);

    mapConfig.setMapStoreConfig(mapStoreConfig);

    config.addMapConfig(mapConfig);

    return Hazelcast.newHazelcastInstance(config);
  }
}

0 ответов

Другие вопросы по тегам