Архитектура приложения: Kafka consumer — адаптер или контроллер?
Kafka Consumer является компонентом, который читает данные из Kafka (или любой другой системы сообщений, подобной Kafka). В контексте архитектуры приложения, его можно рассматривать как адаптер, но не контроллер. Причем его роль отличается от роли контроллеров в веб-приложениях.
Давайте разберем, чем именно является Kafka Consumer и как он соотносится с концепцией адаптера.
Kafka Consumer как адаптер
Kafka Consumer — это компонент, который взаимодействует с внешней системой (в данном случае Kafka) и обрабатывает сообщения, поступающие из этой системы. В архитектурном контексте, как и другие адаптеры, Kafka Consumer может быть частью инфраструктурного слоя, который подключается к внешнему источнику данных (в данном случае Kafka) и передает данные во внутреннюю бизнес-логику.
Вот как это работает:
- Прием сообщений: Consumer получает сообщения из Kafka, которые могут представлять события, команды или другие виды данных.
- Обработка сообщений: Затем эти сообщения передаются в бизнес-логику (например, в сервисы, репозитории или другие компоненты), которые выполняют необходимую обработку.
- Нет прямого ответа во внешний мир: Обычно Kafka Consumer не отправляет данные обратно в Kafka или в какой-либо другой внешний источник данных (хотя и такие операции возможны, например, если Consumer решает записывать какие-то данные обратно в Kafka).
Пример: Kafka Consumer как адаптер
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
type KafkaConsumer struct { consumer sarama.Consumer topic string } func NewKafkaConsumer(consumer sarama.Consumer, topic string) *KafkaConsumer { return &KafkaConsumer{ consumer: consumer, topic: topic, } } func (kc *KafkaConsumer) ConsumeMessages(handler sarama.ConsumerGroupHandler) error { partitionConsumer, err := kc.consumer.ConsumePartition(kc.topic, 0, sarama.OffsetNewest) if err != nil { return err } defer partitionConsumer.Close() for message := range partitionConsumer.Messages() { // Преобразуем сообщение или выполняем бизнес-логику handler.HandleMessage(message) } return nil } |
- В этом примере KafkaConsumer выполняет роль адаптера, который подключается к Kafka (внешний источник данных), получает сообщения и передает их обработчику (который может быть сервисом или другой частью внутренней логики приложения).
- Это адаптер потому, что KafkaConsumer передает данные во внутренний слой приложения (например, в сервисы или репозитории), но не требует прямого ответа обратно во внешний мир.
Kafka Consumer и его роль в системе
- Адаптер для внешних данных: Kafka Consumer — это механизм получения данных, как и другие адаптеры, которые работают с внешними источниками, такими как базы данных, API или очереди сообщений. Он не отвечает напрямую на запросы извне (как контроллеры), а скорее передает данные во внутреннюю систему для дальнейшей обработки.
- Инфраструктурный слой: Как и другие адаптеры, Kafka Consumer является частью инфраструктуры, который изолирует бизнес-логику от специфики внешней системы (Kafka). В бизнес-логике приложения не важно, как именно сообщения поступают в систему — через Kafka, очереди или другие каналы. Все детали скрыты за адаптером.
- Используется в асинхронных и событийных системах: Kafka Consumer часто используется в системах, основанных на событиях (Event-Driven Architecture), где события обрабатываются асинхронно, а Consumer просто слушает и обрабатывает эти события, не ожидая ответа.
Отличие от контроллеров
- Контроллеры часто работают с запросами, которые исходят от внешних клиентов (например, HTTP-запросы от браузеров, REST API-запросы и т. д.). Они принимают данные от внешнего мира, обрабатывают их через внутренние сервисы или бизнес-логику и отправляют ответ обратно в внешний мир.
- Kafka Consumer, в отличие от контроллеров, не ожидает и не передает ответов в сторону внешнего мира. Он читает события из Kafka и передает их для обработки во внутренние части приложения. Он работает асинхронно и не требует немедленного ответа.
Заключение
Kafka Consumer в контексте архитектуры приложения является адаптером, а не контроллером. Его роль заключается в том, чтобы получить данные из Kafka (внешняя система) и передать их в бизнес-логику приложения. В отличие от контроллеров, которые обрабатывают запросы и отправляют ответы во внешний мир, Kafka Consumer работает асинхронно и не возвращает данных обратно во внешний мир.
Recommended Posts
Golang Sarama: настройка Partitioner
20.03.2024