1
resposta

KafKa persistente em banco

seria possivel e como poderia, persistir as filas do Kafka num banco de dados? pensando num cenário em que preciso criar novos pods do Kafka, mas nao posso perder as mensagens ainda nao processadas

1 resposta

Olá, Leandro! Entendo sua preocupação sobre a persistência das mensagens do Kafka em um banco de dados.

O Kafka por si só já é projetado para ser um sistema de mensagens durável, o que significa que as mensagens enviadas para um tópico Kafka serão armazenadas por um período de tempo configurável, mesmo após serem consumidas. Isso permite que você possa consumir as mesmas mensagens novamente se necessário.

No entanto, se você deseja armazenar mensagens do Kafka em um banco de dados para fins de longo prazo ou para processamento adicional, isso também é possível. Uma abordagem comum é usar um consumidor Kafka que lê mensagens do tópico e as grava em um banco de dados.

Por exemplo, você pode ter um consumidor Kafka em Java que faz algo assim:

public class DatabaseKafkaConsumer {
    private final KafkaConsumer<String, String> consumer;
    private final Database database; // Sua classe de conexão com o banco de dados

    public DatabaseKafkaConsumer(String topic, Database database) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "database-consumer");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        this.consumer = new KafkaConsumer<>(props);
        this.database = database;
        this.consumer.subscribe(Arrays.asList(topic));
    }

    public void consume() {
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                database.save(record.value()); // Salva a mensagem no banco de dados
            }
        }
    }
}

Nesse exemplo, Database seria uma classe que você criaria para gerenciar as conexões e operações do banco de dados.

Lembre-se, no entanto, que essa abordagem adiciona uma camada extra de complexidade e pode introduzir latência adicional, pois você está adicionando uma etapa extra de gravação no banco de dados para cada mensagem.

Espero ter ajudado e bons estudos!