Ao definir uma topologia em fluxos kafka, um armazenamento de estado global pode ser adicionado. Ele precisará de um tópico de origem e também de um ProcessorSupplier
. O processador recebe registros e pode teoricamente transformá-los antes de adicioná-los à loja. Porém, em caso de restauração, os registros são inseridos diretamente do tópico de origem (changelog) no armazenamento de estado global, ignorando eventuais transformações feitas no processador.
+-------------+ +-------------+ +---------------+
| | | | | global |
|source topic -------------> processor +--------------> state |
|(changelog) | | | | store |
+-------------+ +-------------+ +---------------+
| ^
| |
+---------------------------------------------------------+
record directly inserted during restoration
StreamsBuilder # addGlobalStore (StoreBuilder storeBuilder, tópico String, Consumido consumido, ProcessorSupplier stateUpdateSupplier) Adiciona um StateStore global à topologia.
Conforme documentação
NOTA: você não deve usar o Processador para inserir registros transformados no armazenamento de estado global . Este armazenamento usa o tópico de origem como log de alterações e durante a restauração inserirá registros diretamente da fonte . Este ProcessorNode deve ser usado para manter a StateStore atualizada.
Em paralelo, como o principal erro está atualmente aberto no rastreador de erros kafka: O processador personalizado KAFKA-7663 fornecido no addGlobalStore não é usado ao restaurar o estado do tópico, o que explica exatamente o que é indicado na documentação, mas parece ser um erro aceito.
Gostaria de saber se o KAFKA-7663 é realmente um bug ou não. De acordo com a documentação, parece ter sido projetado assim, nesse caso, eu luto para entender o caso de uso.
Alguém pode explicar os principais casos de uso dessa API de baixo nível? A única coisa em que consigo pensar é processar efeitos colaterais, como, por exemplo, fazer algumas operações de log no processador.
Pergunta de bônus: se o tópico de origem atuar como o log de alterações da loja global, quando um registro for excluído do tópico porque a retenção expirou, ele será removido do armazenamento de estado global? Ou a remoção só ocorrerá na loja após uma restauração completa da loja do changelog.