O método addData do IgniteDataStreamer afirma que "Este método pode ser chamado de várias threads em paralelo para acelerar o streaming, se necessário". Gostaria de saber se também é seguro usar várias instâncias do IgniteDataStreamer para transmitir dados para o mesmo cache simultaneamente?
Meu caso de uso é que estou tentando otimizar o pré-carregamento de um cache grande após a inicialização do meu cluster Ignite. Estou começando com algo assim:
try (IgniteDataStreamer<K, V> streamer = ignite.dataStreamer("MyCache")) {
try (Stream<Map.Entry<K, V>> stream = jdbcTemplate.queryForStream(
"select * from foo where '2020-01-01'<=foo.time and foo.time<'2026-01-01'",
MY_ROW_MAPPER)) {
stream.forEach(entry -> streamer.addData(entry.getKey(), entry.getValue()));
}
}
O que eu gostaria de fazer é dividir isso em N tarefas (IgniteRunnables), cada uma responsável por carregar/transmitir (por exemplo) dados de um mês para o cache. Em seguida, eu distribuiria as tarefas uniformemente pelo meu cluster, enviando-as para a API de computação do Ignite, e esperaria até que todas fossem concluídas.
Minha tentativa inicial parece funcionar bem, exceto pelo fato de que às vezes vejo avisos em meus logs como este após o pré-carregamento do cache terminar:
(Log4J2Logger.java:523) A validação dos estados da partição falhou para o grupo: MyCache, msg: Os contadores de atualização das partições são inconsistentes para a parte...
Pelo que posso perceber, esse registro é acionado por um evento de troca de mapa de partição (PME) que ocorre quando um IgniteAtomicLong não relacionado é inicializado pela primeira vez.