1. Основы архитектуры Apache Kafka: топики, партиции, брокеры и журнал событий
Основы архитектуры Apache Kafka: топики, партиции, брокеры и журнал событий
Добро пожаловать на курс «Apache Kafka для Python-разработчиков». Если вы привыкли работать с RabbitMQ или Redis Pub/Sub, то Kafka потребует от вас небольшого сдвига парадигмы. Это не просто очередь сообщений, это распределенная платформа потоковой передачи событий.
В этой первой статье мы разберем анатомию Kafka. Мы не будем писать код на Python прямо сейчас — прежде чем импортировать confluent-kafka или aiokafka, нам нужно понять, как эта система хранит и распределяет данные. Без этого понимания вы рискуете создать приложения, которые теряют сообщения или не масштабируются.
Журнал событий (The Log): Сердце Kafka
Чтобы понять Kafka, нужно понять концепцию журнала (Log). В базах данных журнал транзакций (WAL — Write Ahead Log) используется для восстановления состояния. Kafka берет эту идею и делает её центральной архитектурной единицей.
Журнал — это упорядоченная последовательность записей, в которую данные добавляются только в конец (append-only). Записи в журнале неизменяемы. Вы не можете отредактировать сообщение, которое уже записано, вы можете только добавить новое.
Почему это важно для Python-разработчика? Потому что операции записи в конец файла и последовательного чтения — это одни из самых быстрых операций на диске. Это позволяет Kafka обрабатывать миллионы сообщений в секунду даже на обычном оборудовании.
С точки зрения алгоритмической сложности, доступ к данным при записи имеет сложность .
Где — это константная временная сложность, означающая, что время выполнения операции добавления сообщения не зависит от текущего размера журнала (количества уже записанных данных).
Топики (Topics)
В Kafka данные организованы в топики. Топик — это логическая категория или имя канала, в который публикуются сообщения. Если проводить аналогию с реляционными базами данных, топик похож на таблицу, а сообщения — на строки.
Примеры названий топиков в реальной системе:
user-registrationspayment-processedlogs-errorТопики в Kafka всегда поддерживают множество подписчиков. Это означает, что одно и то же сообщение, записанное в топик, может быть прочитано несколькими разными сервисами (Consumer Groups) независимо друг от друга.
Партиции (Partitions) и Смещения (Offsets)
Топик — это логическое понятие. Физически топик разбивается на партиции (Partitions). Партиция — это и есть тот самый журнал (Log), о котором мы говорили выше.
!Логическое разделение топика на партиции и структура смещений (offsets).
Зачем нужны партиции?
Смещение (Offset)
Каждое сообщение внутри партиции получает уникальный порядковый идентификатор, который называется смещением (offset).
Важные правила про offset:
> В Kafka порядок гарантируется только внутри партиции. Если вам нужен строгий порядок всех сообщений (например, операции по банковскому счету), вы должны убедиться, что они попадают в одну и ту же партицию.
Брокеры (Brokers) и Кластер
Физически Kafka — это распределенная система, состоящая из серверов, которые называются брокерами.
Каждый брокер в кластере идентифицируется уникальным числовым ID. Когда вы подключаетесь к кластеру из Python-кода, вам обычно достаточно указать адрес хотя бы одного брокера (bootstrap server), и клиентская библиотека автоматически узнает о существовании остальных.
Распределение партиций
Предположим, у нас есть топик с 3 партициями и кластер из 3 брокеров. В идеальном сценарии Kafka распределит их равномерно:
Это позволяет распределить нагрузку на запись и чтение между всеми серверами.
Репликация (Replication)
Что произойдет, если Брокер 1 выйдет из строя? Мы потеряем Партицию 0? Чтобы этого не случилось, в Kafka существует механизм репликации.
При создании топика мы указываем фактор репликации (Replication Factor). Обычно он равен 3 для продакшн-систем.
Это значит, что каждая партиция имеет одну Leader-реплику и несколько Follower-реплик.
!Распределение лидер-реплик и фолловер-реплик по брокерам для обеспечения отказоустойчивости.
Срок хранения данных (Retention)
В отличие от RabbitMQ, где сообщение удаляется сразу после того, как его прочитали, Kafka хранит сообщения в течение определенного времени (или до достижения определенного размера).
По умолчанию данные хранятся 7 дней (это настраивается параметром log.retention.hours). Это позволяет:
Резюме
Для Python-разработчика Kafka выглядит как бесконечный поток данных, разбитый на файлы.
В следующей статье мы разберем роли Producer (Продюсера) и Consumer (Консьюмера), и узнаем, как именно Python-приложение взаимодействует с этой архитектурой.