Ответ
Напрямую отправлять сообщения конкретному инстансу Consumer
нельзя. Сообщения в Kafka всегда отправляются в топики.
По умолчанию, если несколько Consumer
'ов состоят в одной Consumer Group
, Kafka автоматически распределяет партиции топика между ними для балансировки нагрузки. Однако, добиться доставки сообщения конкретному получателю можно несколькими способами:
-
Уникальная
Consumer Group
для каждогоConsumer
'а- Это самый простой способ для реализации паттерна "broadcast". Если каждый
Consumer
находится в своей собственной группе, то каждый из них получит все сообщения из топика.
- Это самый простой способ для реализации паттерна "broadcast". Если каждый
-
Явное назначение партиций (
consumer.Assign
)- Вместо подписки на топик (
Subscribe
),Consumer
может явно запросить чтение из конкретной партиции. Если вы знаете, что нужныйConsumer
должен обрабатывать партициюN
, вы можете назначить её ему напрямую. - Пример на Go (confluent-kafka-go):
consumer.Assign([]kafka.TopicPartition{ {Topic: &topic, Partition: 0}, })
- Минусы: Этот подход отключает автоматическую балансировку и обработку сбоев. Если этот
Consumer
упадёт, партицию никто не подхватит.
- Вместо подписки на топик (
-
Кастомный
Partitioner
на сторонеProducer
'аProducer
может определять, в какую партицию отправить сообщение, на основе ключа сообщения. Вы можете реализовать свою логику партиционирования, которая будет стабильно направлять сообщения с определённым ключом в одну и ту же партицию. Зная, какойConsumer
слушает эту партицию, вы можете управлять доставкой.