1. Архитектура Kafka и базовые концепции: топики, партиции, брокеры
Архитектура Kafka и базовые концепции: топики, партиции, брокеры
Apache Kafka — это распределенная платформа потоковой передачи данных. В отличие от классических брокеров сообщений, таких как RabbitMQ или ActiveMQ, Kafka проектировалась для обработки колоссальных объемов информации в реальном времени с сохранением истории событий.
> Kafka работает не как традиционная очередь сообщений, где данные удаляются после прочтения, а как распределенный журнал событий (commit log), в который данные только добавляются.
Для Middle Go-разработчика понимание внутреннего устройства этой системы критически важно. Неправильный выбор ключа партицирования или непонимание механизма хранения приводит к потере порядка сообщений, дублированию данных и падению производительности микросервисов.
Брокеры и кластер
Основой физической архитектуры выступает брокер (broker). Это отдельный сервер или узел, на котором запущен процесс Kafka. Брокеры принимают сообщения от производителей (producers), сохраняют их на диск и отдают потребителям (consumers).
Группа брокеров, работающих совместно, образует кластер (cluster). Кластеризация обеспечивает отказоустойчивость и горизонтальное масштабирование. Если один сервер выходит из строя, другие берут его нагрузку на себя.
Представим систему обработки заказов. Если один брокер способен обработать 50 000 сообщений в секунду, то кластер из 5 брокеров потенциально может справиться с потоком в 250 000 сообщений в секунду, равномерно распределяя нагрузку между узлами.
Топики: логическое разделение данных
Топик (topic) — это именованный канал или категория, куда публикуются сообщения. Это логическая сущность, которая объединяет данные одного типа. Например, топик user-events может содержать события регистрации и авторизации пользователей, а payment-transactions — информацию о платежах.
| Характеристика | Топик Kafka | Классическая очередь (RabbitMQ) | | :--- | :--- | :--- | | Хранение | Сообщения остаются на диске после прочтения | Сообщение удаляется после подтверждения (ACK) | | Потребители | Множество независимых потребителей читают одни и те же данные | Сообщение обычно доставляется только одному потребителю | | Масштабирование | Горизонтальное (через партиции) | Вертикальное или через создание новых очередей |
В Go-приложениях имя топика обычно передается как константа или переменная окружения при инициализации клиента.
Партиции: физическое распределение и параллелизм
Если топик — это логическая концепция, то партиция (partition) — это физическая реализация хранения данных. Каждый топик разбивается на одну или несколько партиций. Именно партиции позволяют Kafka масштабироваться: разные партиции одного топика могут располагаться на разных брокерах.
Внутри партиции сообщения хранятся в строгом порядке их поступления. Каждому новому сообщению присваивается уникальный последовательный номер — смещение (offset).
Важное правило проектирования систем на базе Kafka выражается следующим неравенством:
Где — количество партиций в топике, а — количество консьюмеров (потребителей) в одной консьюмер-группе. Если консьюмеров будет больше, чем партиций, «лишние» консьюмеры будут простаивать, так как одна партиция не может читаться одновременно двумя консьюмерами из одной группы.
Если в топике orders создано 12 партиций, вы можете запустить максимум 12 экземпляров Go-микросервиса для параллельной обработки. Запуск 13-го экземпляра не даст прироста производительности — он будет находиться в режиме ожидания.
Ключи сообщений и гарантия порядка
При отправке сообщения продюсер может указать ключ (key). Kafka использует хеш от этого ключа, чтобы определить, в какую партицию попадет сообщение.
nil), сообщения распределяются по партициям равномерно (алгоритм Round-Robin).Порядок сообщений в Kafka гарантируется только в рамках одной партиции. Если события изменения баланса пользователя с ID 42 должны обрабатываться строго последовательно, их необходимо отправлять с ключом user_id=42. Тогда они попадут в одну партицию и будут прочитаны консьюмером в правильном порядке.
Сегменты: как данные хранятся на диске
Партиция — это логическое разбиение внутри брокера, но на уровне файловой системы операционной системы партиция не является одним гигантским файлом. Она разбивается на сегменты (segments).
Сегмент — это физический файл на диске брокера, в который последовательно дописываются сообщения. Когда текущий (активный) сегмент достигает определенного размера (по умолчанию 1 ГБ) или проходит заданное время, Kafka закрывает его для записи и открывает новый.
Если в партицию поступает 5 ГБ данных, на диске будет создано 5 файлов-сегментов по 1 ГБ каждый. Это архитектурное решение критически важно для эффективной очистки диска.
Хранение данных: Retention Policy
В отличие от традиционных брокеров, Kafka не удаляет сообщение сразу после того, как консьюмер его прочитал. За очистку старых данных отвечает политика удержания (retention policy).
Она настраивается на уровне топика или всего кластера и базируется на двух основных триггерах: По времени (Time-based*): данные хранятся заданное количество часов или дней (по умолчанию 7 дней). По размеру (Size-based*): данные хранятся до тех пор, пока размер партиции не превысит установленный лимит (например, 50 ГБ).
Политика удержания работает именно на уровне сегментов: Kafka удаляет старые закрытые сегменты целиком, а не вычищает отдельные сообщения из файлов. Это делает процесс очистки диска невероятно быстрым и дешевым с точки зрения ресурсов CPU.
Помимо удаления по времени и размеру, существует сжатие лога (log compaction). При этой политике Kafka сохраняет только последнее (самое свежее) сообщение для каждого уникального ключа.
Если в топик с политикой compact отправить сообщения {"key": "user_1", "status": "active"} и затем {"key": "user_1", "status": "banned"}, Kafka со временем удалит первое сообщение, оставив только актуальное состояние пользователя. Это идеально подходит для синхронизации кэшей или таблиц баз данных между микросервисами.
Репликация: защита от сбоев
Для обеспечения надежности данные в партициях дублируются. Этот механизм называется репликацией (replication). Каждая партиция имеет одну главную реплику — Leader, и несколько резервных — Follower.
Все операции записи и чтения всегда происходят через лидера. Фолловеры лишь пассивно копируют данные. Если брокер, на котором находился лидер партиции, падает, кластер автоматически выбирает нового лидера среди синхронизированных фолловеров.
Количество копий данных задается параметром Replication Factor. При факторе репликации равном 3, данные хранятся на трех разных брокерах. Если один сервер выйдет из строя, система продолжит работу без потери информации.