Что такое и зачем нужна модель издатель/подписчик — pub/sub
Модель pub/sub — средство передачи сообщений между двумя сторонами, называемыми издателем и подписчиками. Прежде всего pub/sub используется в системах управления событиями, где компоненты реагируют на изменения состояния системы.
Pub/sub — это подходящий способ управления архитектурой динамически масштабируемых систем. Он позволяет масштабировать их, не перегружая программную логику компонентов.
Архитектура pub/sub
Pub/sub представляет собой платформу для обмена сообщениями между издателями, которые создают и отправляют сообщения и подписчиками, которые их получают. При этом издатели не отправляют сообщения подписчикам напрямую в режиме «точка-точка». Вместо этого используется посредник — брокер, который группирует сообщения в сущности, называемые топиками или темами.
Особенности
Pub/sub поддерживает работу неограниченного числа издателей, отправляющих данные в топики, а также неограниченного числа подписчиков, их получающих. Также важно знать, что каждый компонент pub/sub одновременно может быть как издателем, так и подписчиком.
Наглядный пример такой работы — приложения для доставки еды. Оформляя заказ, пользователь приложения выступает в роли издателя. Сервис доставки, принимающий заказы, выступает как подписчик. Затем роли меняются: пользователь становится подписчиком событий, в которых подробно описывается текущий статус его заказа, а сервис доставки — издателем.
В процессе выполнения заказа с помощью pub/sub приложение обеспечивает правильную и оперативную маршрутизацию сообщений.
Важно отметить, что у подписчиков нет необходимости запрашивать новые данные о статусе заказа. Издатель самостоятельно уведомляет их об этом, как только они появляются.
В модели pub/sub издатели и подписчики изолированы друг от друга брокером сообщений. То есть издатели отправляют сообщения, не беспокоясь о том, какие и сколько подписчиков их получат. Точно так же подписчики получают сообщения, не заботясь о том, кто их отправил. Также брокер сообщений отвечает за ведение списка подписчиков для каждого топика и обеспечение доставки сообщений каждому из них.
Плюс изоляции в том, что издателям не нужно знать, где используется сообщение, а подписчику не нужно ничего знать об издателе. Это позволяет органично повысить общую безопасность приложения.
Преимущества pub/sub для архитекторов ПО
Слабая связь между системными компонентами. Pub/sub разделяет логику коммуникаций и бизнес-логику, позволяя изолировать компоненты. Изоляция упрощает поддержку кода приложений и делает их надежнее.
Простота рабочих процессов. Принцип действия pub/sub прост для понимания, поэтому разработчикам ПО проще делать рефакторинг и масштабировать системы pub/sub.
Интеграция с сервисами, созданными на разных языках. Pub/sub не привязан к определенному языку программирования и протоколу передачи данных.
Гибкая масштабируемость. Логика коммуникаций и бизнес-логика — это отдельные объекты, поэтому системы, использующие pub/sub, масштабируются без сбоев. Вдобавок разработчики ПО могут перепроектировать архитектуру топика брокера сообщений, не заботясь о бизнес-логике.
Надежность. Pub/sub гарантирует доставку сообщений, даже если подписчик недоступен. Брокер будет пытаться доставить сообщение до момента получения или истечения срока подписки. Pub/sub поддерживает асинхронную рассылку сообщений, что гарантирует их доставку даже при изменении архитектуры топика брокера сообщений.
Эластичность. Бизнес-логика pub/sub-систем не зависит от количества активных издателей и подписчиков, поэтому резкое увеличение их числа не приведет к сбою.
Маршрутизация. Pub/sub позволяет настроить маршрутизацию сообщений от издателя до группы подписчиков. Вдобавок возможна доставка сообщения до конкретного экземпляра подписчика.
Фильтрация. В Pub/sub доступна фильтрация событий по заданным условиям. Фильтрация применяется в случаях, когда необходимо настроить получение не всех, а лишь избранных сообщений от издателя.
Преимущества pub/sub для разработчиков ПО
Модульность. Системы, созданные на основе pub/sub, позволяют разработчикам разделить систему на модули на основе бизнес-логики приложений. Интеграция с сервисами, созданными на разных языках. Pub/sub не зависит от языка программирования, протокола передачи данных или конкретной технологии. Следовательно брокер сообщений может быть легко интегрирован в приложение с помощью любого языка программирования. Кроме того, pub/sub может использоваться в качестве моста, обеспечивающего взаимодействие между компонентами, построенными на разных языках, управляя связями между ними.
Простота бизнес-логики: брокер сообщений pub/sub берет на себя ответственность за надежную пересылку сообщений от издателя подписчикам, освобождая разработчика от написания дополнительного кода.
Скорость отклика. В pub/sub связь асинхронная, что позволяет и модули программировать асинхронно. Доставка сообщений не блокирует издателя. Он возвращается к своей задаче после отправки сообщения. Точно так же подписчик прерывается только в момент публикации сообщения в топике.
Преимущества pub/sub для тестировщиков
Упрощение тестирования. Pub/sub делает тестирование модульным, поскольку бизнес-логика не связана с брокером сообщений. Модульность позволяет отдельно тестировать и оптимизировать каждый модуль. Такой подход значительно снижает сложность тестирования.
Отладка. Отправка сообщения от издателей к подписчикам облегчает отладку проблем с интеграцией между модулями.
Задачи, решаемые с помощью обмена сообщениями pub/sub
Несвязанная архитектура, асинхронный характер и масштабируемость pub/sub делают его отличным решением для распределенных систем с большим и непостоянным числом издателей и подписчиков.
Pub/sub решает множество задач, например:
- отправка уведомлений о событиях;
- распределенное кэширование;
- распределенный логгинг;
- работа с несколькими источниками данных;
- трансляция обновлений (обмен сообщениями "один-ко-многим");
- создание сервисов, работающих без задержек, например, чатов и многопользовательских сред.
Недостатки pub/sub
Pub/sub — надежный сервис обмена сообщениями, что не означает, что он хорошо подходит к решению любых задач. Вот несколько примеров, где использование модели pub/sub нецелесообразно.
Небольшие системы
Pub/sub требует правильной настройки и обслуживания. Его внедрение в небольших системах станет избыточной тратой ресурсов и приведет к ненужной сложности.
Потоковая передача мультимедиа
Pub/sub не подходит для работы с аудио или видео, поскольку они требуют плавной синхронной передачи между сторонами. Pub/sub не поддерживает синхронные коммуникации и не годится для обмена сообщениями в следующих сценариях:
- видеоконференции;
- VOIP;
- приложения потоковой передачи мультимедиа.
Кейсы использования pub/sub
Pub/sub применяется в отраслях, где необходимо обеспечить распределенные коммуникации в режиме реального времени.
Интернет вещей
Умные устройства нуждаются в надежном и эффективном способе сбора и передачи данных. Pub/sub связывает IoT-устройства с управляющим узлом или сервером. Вдобавок конечные IoT-устройства способны выступать в роли издателей и отправлять в облачные сервисы уведомления, информацию с датчиков и другие данные, важные для пользователей.
Мониторинг и уведомления о событиях
Pub/sub позволяет создавать топики для сбора системной информации и отправлять ее на платформы визуализации данных. Это удобно при работе с высоконагруженными платформами. При этом сообщения могут быть распределены по различным топикам, а все серверы или службы могут публиковать данные в этих общих топиках без необходимости создания отдельных конвейеров уведомлений.
Также в pub/sub доступны дополнительные функции. Например, когда сервер сообщает о сбое, срабатывает функция переключения на резервный сервер.
Резервное копирование и репликация
При работе с базами данных жизненно необходимы их резервные копии. Использование утилиты командной строки cron позволяет настроить регулярное резервное копирование или создание снэпшотов. Если необходимо распределить резервные копии по хранилищам в географически распределенных регионах, то pub/sub может помочь в создании конвейера, передающего сообщения о завершении резервного копирования. Затем функция, на которую создана подписка, будет использовать сообщение в качестве триггера для запуска процесса миграции или копирования.
Управление логами
Pub/sub может выступать в качестве промежуточного звена для агрегации и передачи логов. Он способен собирать и передавать логи из разных мест в службы-подписчики.
Логи фильтруются по типам проблем, записям, уведомлениям, фоновым задачам и многим другим параметрам, обеспечивая надлежащее управление.
Сервисы обмена сообщениями pub/sub
- На рынке много pub/sub-сервисов. Расскажем о нескольких самых популярных.
- RabbitMQ. Быстрый, масштабируемый и надежный брокер сообщений.
- Apache Pulsar. Разработка Apache, Kafka предлагает широкие возможности для обмена сообщениями pub/sub.
- Faye. Простой pub/sub-сервис, предназначенный для работы с веб-приложениями и серверами, разработанными для NodeJS и Ruby.
- Redis. Один из самых востребованных брокеров сообщений, поддерживающий как традиционные очереди сообщений, так и реализацию pub/sub.
- Amazon SNS. Amazon Simple Notification Service — это управляемый сервис pub/sub.
- Google pub/sub. Разработка Google для реализации сервиса обмена сообщениями pub/sub.
- Azure Service Bus. Надежный сервис обмена сообщениями.
Message Broker Bercut (компонент платформы HIP Bercut) — российская альтернатива европейским сервисам для обмена сообщениями.