Sobes.tech
Junior — Middle

Готов ли си да настроиш двама потребители за една тема така, че да работят без прекъсване, като посочиш конкретни партиции за всеки от тях?

sobes.tech AI

Отговор от AI

Для настройки двух потребителей (consumers) в Java, которые читают из одного топика Kafka и при этом работают без перебоев, можно явно назначить каждой из них конкретные партиции топика. Это называется ручным назначением партиций (manual partition assignment).

Пример с использованием KafkaConsumer:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer1 = new KafkaConsumer<>(props);
KafkaConsumer<String, String> consumer2 = new KafkaConsumer<>(props);

// Назначаем конкретные партиции для каждого потребителя
TopicPartition partition0 = new TopicPartition("my-topic", 0);
TopicPartition partition1 = new TopicPartition("my-topic", 1);

consumer1.assign(Collections.singletonList(partition0));
consumer2.assign(Collections.singletonList(partition1));

// Теперь consumer1 читает только из партиции 0, а consumer2 — из партиции 1

Такой подход гарантирует, что каждый потребитель обрабатывает свою партицию, и между ними не будет конфликтов или дублирования сообщений. Важно, чтобы количество потребителей не превышало количество партиций, иначе некоторые потребители останутся без данных.