Компоненты архитектуры для обработки больших данных
Лямбда-архитектура
Каппа-архитектура
Архитектура обработки сообщений
https://www.enterpriseintegrationpatterns.com/patterns/messaging/index.html
Система обмена сообщениями
Плюсы MQ
Особенности такого решения:
Минусы MQ
Минусы message bus
Особенности MQ
В микросервисной архитектуре довольно большая часть взаимодействий все-равно будет синхронной – например, когда нам нужно получить какие-то данные от какого-то сервиса.
Поэтому в чистом виде message bus в современном мире встречается редко.
Организация взаимодействия через MQ
Что в теле?
Брокеры сообщений
RabbitMQ
Схема работы
Схема работы
Схема работы
Схема работы
Роутинг сообщений
В rabbitmq используется понятие exchange – фактически это правила маршрутизации.
Роутинг сообщений
Типов exchange-ей в rabbitmq – много, они предоставляют разные варианты маршрутизации:
и т.д.
Гарантии доставки
Push-модель для отправки сообщений
Rabbitmq использует push модель. Особенности такой модели:
•
•
•
Легко может заддосить консьюмера (чтобы избежать есть QoS настройки) Широкие возможности для роутинга сообщений
Порядок сообщений не гарантирован
Kafka
Kafka
Kafka – это система, реализующая распределенный реплицируемый лог сообщений
Топик
Топик – это некоторый аналог таблички в БД.
Слишком большое количество (больше 1000) топиков (и партиций) в одном брокере приводит к снижению производительности. Поэтому сильно дробить на топики не стоит.
Топик
Топик – это набор неструктурированных сообщений (без схемы).
Для кафки – сообщение – это просто набор байт. Поверх которых можно использовать разные протоколы – JSON, Avro, Protobuf и т.д.
Чтобы появилась схема, используют внешние инструменты типа SchemaRegistry и StreamProcessing (KTable, KStream)
Топик
Kafka не имеет понятия очереди.
Offset
Каждый получатель (consumer) хранит у себя offset – указатель на сообщение, которое он прочитал последним.
Партиции
Топик разделен на несколько партиций.
Ключ
У сообщения в kafka может быть ключ - key. Если есть ключ, то тогда партиционирование происходит таким образом, чтобы сообщения с одним ключом попадали в одну партицию
Consumer groups
Группа получателей или группа консьюмеров – это один логический консьюмер, который представляет из себя многопоточное или распределенное приложение. И к каждой партиции привязан только один консьюмер.
Для каждой consumer group, которая читает топик выделяется
Consumer и partition
У каждой партиции должен быть только один конкурирующий консьюмер. Один консьюмер может читать из нескольких партиций.
Offset и Commit offset
offset – метка сообщения, которое консьюмер прочитал. Для того, чтобы понимать, какие сообщения сonsumer (получатель) обработал, используются
commit offset – последняя обработанная запись
Commit offset
Commited offsets хранятся в топике consumer_offsets, который находится у координатора группы (и реплицируется на остальные брокеры). При этом для разных consumer group и одного топика координатор может быть разным.
Перебалансировка
Иногда хочется добавить или удалить нового consumer-а в группу, или один из консьюмеров падает. В этом случае, consumer group переходит в состояние перебалансировки, во время которого ни один из консьюмеров не читает сообщения из топиков.
Репликация
В Kafka поддерживается репликация. Каждая партиция в топике может иметь несколько реплик.
В рамках каждого брокера (инстанса Кафки) может быть до тысячи реплик, относящихся к разных топикам.
Репликация
Авторы Kafka советуют
Фактор репликации 2 не советуют использовать из-за того, что в этом случае могут быть проблемы с тем, что кластер Kafka может развалится в некоторых ситуациях на старых версиях
Гарантии в Kafka
Надежная отправка
При отправка сообщения producer может его отправить с параметром acks.
Надежная отправка
Пусть будет topic с фактором репликации 3. В случае, если producer отправляет сообщения с параметром acks=1, то это может привести к потери сообщения.
Например, если лидер получил это сообщение, ответил producer-у, что все ок, но в этот момент упал, не успев отправить сообщение репликам. Тогда из оставшихся реплик будет выбран лидер, в котором этого сообщения не будет.
Надежная отправка
В случае ошибки отправки , клиент (producer) со своей стороны должен повторить запрос через некоторое время. И это может приводить к дублированию сообщений.
Для того, чтобы такого дублирования не было, Kafka умеет в идемпотентные сообщения, и рекламирует это как exactly once delivery гарантии.
Надежное получение
Есть разница между commited сообщениями и __commited_offset
Надежное получение
В случае если стоит опция auto_commit=true, то тогда консьюмеры коммитят последний полученный из poll offset раз в 5 секунд (интервал настраивается). Это означает, что если консьюмер упадет между двумя вызовами коммита, он успеет обработать какие-то сообщения, и при перебалансировке они снова будут обработаны.
Чтобы такого не случилось, можно синхронно коммитить после того, как сообщения были обработаны.
Pull - модель
Особенности push модели в реализации Kafka:
Kafka vs RabbitMq