В сложных программных комплексах, состоящих из большого количества компонентов, встает вопрос организации обмена информацией между этими компонентами. Участников обмена информацией как правило разделяют на отправителей (producer) некоторого сообщения и его получателей (consumer). Если отправителей и получателей мало, то можно установить прямую связь между каждым из участников обмена данными. Но когда количество участников увеличивается и требуется более высокая интерактивность, такой способ обмена информацией становится неэффективным.
В этом случае между теми, кто отправляет и получает данные, целесообразно использование посредника, управляющего процессом обмена информацией — брокера сообщений.
Работу брокеров сообщений мы рассмотрим на примере одного из наиболее популярных инструментов — Apache Kafka.
Apache Kafka разработан в компании Linkedin, а затем стал open-source продуктом в составе Apache Foundation. Оптимизированная для записи больших объёмов данных программа своим оригинальным названием обязана фамилии любимого писателя главного разработчика - Франца Кафки. Основное преимущество брокера сообщений Kafka в том, что это платформа потока событий, обладающая исключительной производительностью в системах непрерывного и высокоскоростного обмена информацией, будь то интеграция данных из большого количества источников, их потоковая аналитика, либо же любая иная система, непрерывная работа которой становится критически важной для бизнеса или организации. Подобные приложения приходится часто использовать в работе с облачными платформами, такими как Timeweb Cloud.
Отправители формируют сообщения и передают их брокеру. После этого программа раскладывает полученные сообщения по отдельным топикам (topics) в соответствии с потребностями получателей, а затем получатели забирают необходимые в данный момент данные. При этом отправители и получатели непосредственно друг с другом никак не связаны и общаются только с брокером по API. Благодаря этому легко реализуется обмен информацией между произвольными комбинациями отправителей и получателей. Важно отметить, что получатели сами должны делать запрос у брокера (pull). Этим брокер сообщений Kafka отличается от другого распространенного брокера RabbitMQ, который сам отправляет сообщения получателям (push).
Схема работы Apache Kafka
Для параллелизации чтения и записи топики делятся на партиции. В кластерной конфигурации партиции распределяются по узлам так, чтобы на каждый приходилось примерно одинаковое количество партиций. При этом возможна ситуация, когда все партиции одного топика используют один узел, что может привести к повышенной нагрузке на такой узел. Kafka даёт возможность вручную сконфигурировать распределение партиций по брокерам, чтобы избежать этого.
Топики хранят сообщения в лог-файлах. Каждое сообщение имеет timestamp, порядковый номер (offset) и позицию (position) в байтах от начала файла. Это позволяет читать сообщения, начиная с определенного номера или даты/времени, что выгодно отличает Kafka от другого популярного брокера сообщений ActiveMQ, не обладающего таким функционалом. Каждый лог-файл тоже имеет свой порядковый номер. При достижении лог-файлом заданного в настройках размера запись в этот файл прекращается, и последующие сообщения пишутся в новый лог-файл со следующим по порядку номером. Отдельные лог-файлы называются сегментами. Kafka поддерживает только операции чтения и записи сообщений, но не удаления. Удалять данные можно с помощью настройки времени жизни (TTL, time-to-live) сегментов. Этот способ даёт возможность не хранить дольше заданного времени целые сегменты, отдельные же элементы удалить не получится даже так.
Отказоустойчивость обеспечивается репликацией партиций по всем брокерам в задаваемом в настройках количестве. Выход из строя любого узла при этом не приводит к потере данных. Более того, в этом случае Kafka добавляет копии партиций, хранящихся на неактивном брокере, на работающие, чтобы обеспечить требуемый фактор репликации. При репликации основной брокер назначает одну из партиций ведущей (Leader). Операции чтения и записи осуществляются через ведущую партицию.
Брокер сообщений Apache Kafka оказался очень удачным инструментом для работы на облачных серверах, с единственным недостатком — ориентированностью на обработку больших объемов данных. Однако, по мере развития Kafka это различие стало менее заметным, а сама система — более гибкой и универсальной.
В своем официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.