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);
}
}