Как в Kafka обеспечить параллельную обработку сообщений топика двумя потребителями, назначив каждому свою партицию?

Ответ

В Kafka параллелизм обработки определяется количеством партиций в топике. Два потребителя в одной consumer group могут работать бесперебойно, если топик имеет как минимум две партиции, и каждый потребитель закрепится за своей партицией.

Способ 1: Автоматическое распределение (рекомендуется) Используйте subscribe(). Kafka автоматически сбалансирует партиции между потребителями в группе.

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-app"); // Одинаковый group.id для всех потребителей группы
props.put("key.deserializer", StringDeserializer.class);
props.put("value.deserializer", StringDeserializer.class);

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

// Оба потребителя подписываются на один топик
consumer1.subscribe(List.of("my-topic"));
consumer2.subscribe(List.of("my-topic"));
// Kafka назначит: Consumer1 -> Partition 0, Consumer2 -> Partition 1

Способ 2: Ручное назначение партиций Используйте assign() для точного контроля. При этом отключается автоматический rebalance.

// Потребитель 1 закрепляется за партицией 0
TopicPartition partition0 = new TopicPartition("my-topic", 0);
consumer1.assign(List.of(partition0));

// Потребитель 2 закрепляется за партицией 1
TopicPartition partition1 = new TopicPartition("my-topic", 1);
consumer2.assign(List.of(partition1));

Ключевые правила:

  • Максимальный параллелизм = количество партиций. Если потребителей больше, чем партиций, "лишние" потребители будут бездействовать.
  • Гарантия порядка сохраняется только в пределах одной партиции.
  • Для топика с одной партицией два потребителя в одной группе не смогут работать параллельно — один из них останется неактивным.

Ответ 18+ 🔞

Ну ты смотри, какой простой, блядь, принцип, а народ-то путается, как мудаки в лужу! В Кафке вся эта магия параллельности завязана на количестве партиций в топике, вот на этом самом, ёпта. Представь себе: два потребителя в одной consumer group смогут работать без драки и дележа, только если топик имеет хотя бы две партиции. Тогда каждый прилепится к своей, и всё — ни тебе конфликтов, ни мороки.

Способ 1: Автоматическое распределение (так и надо делать, если не ебёшь мозг) Юзаешь subscribe(). Кафка сама, хитрая жопа, раскидает партиции между всеми потребителями в группе, как мать родная.

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-app"); // Одинаковый group.id, это ж группа, блядь!
props.put("key.deserializer", StringDeserializer.class);
props.put("value.deserializer", StringDeserializer.class);

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

// Оба подписываются на один и тот же топик, как два идиота на одну газету
consumer1.subscribe(List.of("my-topic"));
consumer2.subscribe(List.of("my-topic"));
// И Кафка мудро назначит: Consumer1 -> Partition 0, Consumer2 -> Partition 1. Красота!

Способ 2: Ручное назначение (для тех, кто считает себя умнее системы) Тыкаешь assign() и сам всё контролируешь. Но тут, блядь, автоматический rebalance отрубается нахуй — ты теперь за всё в ответе.

// Потребитель 1 прикован к партиции 0, как каторжник
TopicPartition partition0 = new TopicPartition("my-topic", 0);
consumer1.assign(List.of(partition0));

// Потребитель 2 — к партиции 1. Развели их по углам.
TopicPartition partition1 = new TopicPartition("my-topic", 1);
consumer2.assign(List.of(partition1));

Главные правила, которые надо вбить себе в башку:

  • Максимум параллелизма = количество партиций. Нарисовал одну партицию — получил одного работягу. Нацепил десять потребителей? Девять будут, блядь, сосать лапу и глазеть в потолок. Лишние — нахуй не нужны.
  • Порядок гарантирован только в рамках одной партиции. В соседней партиции сообщения могут идти в другом порядке, и нихуя ты не сделаешь.
  • Если твой топик — унылое говно с одной-единственной партицией, то два потребителя в одной группе — это пиздец. Один будет пахать, а второй — просто красивая, но бесполезная картинка в интерфейсе мониторинга.