Message brokers, часть 2: Kafka Если RabbitMQ — это 100% оче | Java: fill the gaps
Message brokers, часть 2: Kafka
Если RabbitMQ — это 100% очередь, то Kafka больше похожа на список, потому что данные после чтения не удаляются. В принципе это основное отличие двух брокеров, остальное — просто следствие.
Один список называется partition. Несколько partition можно объединить в группу, которая называется topic.
Консьюмеры читают данные из партишена или топика. Для каждого консюмера хранится индекс последнего прочитанного сообщения (offset). Когда получатель прочитает сообщение, Kafka сдвинет его offset. И в следующий раз этот получатель прочитает другие сообщения.
Если в partition 10 сообщений, то
Один консьюмер прочитает сразу всё
Другой прочитает 5 и потом ещё 5
Третий будет вычитывать по одному сообщению
И никто никому не мешает
В рамках одного partition все консюмеры читают сообщения в одном порядке. Иногда это очень важная фича. Для топика из нескольких partition такой гарантии нет.
Поскольку данные не удаляются при чтении, получаются немного другие схемы работы:
Если сообщение должны прочитать несколько однотипных получателей, достаточно записать их в один partition
Если получатели разнотипные, то продюсер должен добавить данные в несколько партишенов.
Пример: чтобы сообщение “A to C vip” прочитали C1 и C4, продюсер отправляет запись в топик orders и vip_orders.
Если нужно распределить сообщения по получателям, то консьюмеры объединяются в consumer group с общим оффсетом
Резюме
В Kafka сообщения не пропадают при чтении, их можно читать несколько раз и пачками
Гарантия порядка сообщений в рамках одного partition
Kafka занимает горааааздо больше места на диске
Kafka использует pull модель — получатели сами решают, когда забрать сообщения. В RabbitMQ инициатива исходит от очереди, чтобы равномерно распределять сообщения
Разные схемы общения с продюсерами и консьюмерами. На картинке ниже я представила аналог схемы из предыдущего поста
Разные сценарии масштабирования и отказоустойчивости
Субъективное мнение — в рэббите проще распределять сообщения по получателям. Kafka подходит для накопления данных и более сложных сценариев
Объективное — Kafka используется на бОльшем количестве проектов, пусть даже в качестве простой очереди
Общие черты двух брокеров:
Отлично поддерживаются спрингом
Можно настроить хранение сообщений на диске
Нужно супер тщательно продумать схему работы и масштабирование
PS Эти посты — самые основы месседж брокеров, прямо вот верхушечка. Для дальнейшего изучения подойдёт эта серия статей, книги "RabbitMQ in Action" и "Kafka in Action".