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.
Não deve haver nenhum motivo para que você não possa executar instâncias separadas em hosts separados, todas transmitindo apenas uma parte do conjunto de dados geral para o mesmo cache. O fator limitante nesta arquitetura proposta provavelmente será a interface de rede do banco de dados do qual você está recuperando os dados. Espero que ajude.