Подписки: несколько групп потребителей по теме Pulsar

Первоначально опубликовано в блоге Kesque 9 ноября 2019 г.

Меня несколько раз спрашивали, поддерживает ли Apache Pulsar несколько групп потребителей (или групп потребителей) по одной теме. Другими словами, если несколько приложений могут использовать сообщения из одной темы. Ответ определенно да. На самом деле, Pulsar очень хорош в этом.

В этом посте я покажу вам, как это работает. Я буду использовать нашу управляемую службу Apache Pulsar для демонстрации (которую вы можете попробовать бесплатно), но вы можете делать то же самое, если используете свой собственный кластер Apache Pulsar или автономный экземпляр.

Подписки

Первое, что нужно понять, это то, что Pulsar управляет потребителями по темам с помощью подписок. Подписка отслеживает сообщения в теме, которые должны быть доставлены одному или нескольким потребителям. Когда потребитель подключается к теме в Pulsar, он указывает подписку, которую он использует. Подписка отслеживает позицию в теме, из которой читает потребитель. Когда потребитель читает и подтверждает сообщение, его прочитанная позиция в теме автоматически обновляется.

Несколько подписок на тему

Тема Pulsar может поддерживать несколько подписок одновременно. Это означает, что несколько потребителей (или групп потребителей) могут одновременно читать сообщения из темы. Таким образом, у вас может быть несколько приложений, использующих тему, каждое из которых получает свою собственную копию сообщения и каждое из которых имеет разную позицию чтения.

Например, если издатель публикует сообщение в теме с 3 подписками, по одной для каждого потребляющего приложения, то это сообщение будет отправлено каждой подписке. На каждое сообщение, опубликованное в этой теме, расходуется 3 копии этого сообщения. Вот как Pulsar обеспечивает разветвление сообщений для нескольких приложений.

Несколько потребителей в подписке

Чтобы разветвить сообщения в несколько приложений, вам просто нужно добавить подписки в тему Pulsar. В рамках каждой подписки может быть один или несколько потребителей. Pulsar поддерживает 4 различных типа подписки, которые различаются в зависимости от того, как сообщения отправляются потребителям этой подписки.

Эксклюзивная подписка

При эксклюзивной подписке один или только один потребитель может использовать подписку в любой момент времени. Если другой потребитель попытается использовать подписку, она будет отклонена. Это полезно, если есть строгая необходимость в том, чтобы сообщения в теме потреблялись конкретным приложением по порядку.

Отказоустойчивая подписка

При отказоустойчивой подписке несколько потребителей могут использовать подписку, но только один из них может быть активным или потребляющим одновременно. Этот тип подписки имеет смысл, если ваше приложение работает в конфигурации «активный-резервный». Если активный выходит из строя, резервный может продолжить работу с того места, где остановился активный. Оба приложения подключаются к подписке, но только одно из них потребляет сообщения из темы.

Общая подписка

Общая подписка позволяет нескольким потребителям одновременно использовать тему. Сообщения отправляются циклически каждому подключенному потребителю. Эта подписка позволяет реализовать классический паттерн конкурирующие потребители рабочей очереди. Если ваше приложение можно масштабировать по горизонтали, вы можете использовать общую подписку для распределения работы между несколькими экземплярами приложения.

Пример: использование нескольких приложений из темы

Хватит теоретических рассуждений, давайте посмотрим на это в действии. Мы собираемся публиковать сообщения в теме, которые используются двумя разными приложениями. Одному приложению необходимо обработать сообщение в строгом порядке, поэтому оно будет использовать эксклюзивную подписку. Если приложение выйдет из строя, оно будет полагаться на Pulsar для сохранения сообщений и доставки сообщений ему после восстановления.

Второе приложение потребляет из той же темы, но масштабируется по горизонтали. Порядок сообщений не важен, но время обработки каждого сообщения велико, поэтому необходимо несколько копий приложения, чтобы не отставать от скорости публикации. Это приложение будет использовать общую подписку.

Во-первых, мы создаем тему Pulsar под названием подписка-демо, которая выглядит так в пользовательском интерфейсе Kesque:

Как видите, подписок на тему пока нет. Мы подключим клиент Python к теме, используя эксклюзивную подписку, которая автоматически создаст подписку. Вот код, который мы собираемся использовать:

Обратите внимание, что в строке 12 мы указываем для параметра Consumer_type значение Exclusive при подписке, но это значение по умолчанию, поэтому его можно опустить, если вы используете эксклюзивную подписку.

Когда этот клиент подключается, это выглядит так:

Теперь тема имеет одну подписку с одним подключенным потребителем. Тип подписки Эксклюзивная.

Теперь мы собираемся создать общую подписку, используя следующий клиентский код Python. Это то же самое, что и предыдущий код, за исключением того, что мы изменили Consumer_type на Shared в строке 12 (и имя подписки в строке 11):

Поскольку это приложение является горизонтально масштабируемым, мы собираемся запустить две копии кода Python на разных терминалах. Это имитирует две независимые копии приложения:

Теперь у топика есть вторая подписка типа Shared с 2-мя подключенными потребителями.

На данный момент у нас есть в общей сложности 3 потребителя по этой теме. Один использует эксклюзивную подписку, так что потребитель будет получать копию каждого сообщения, опубликованного в теме. Два других потребителя используют общую подписку, поэтому они будут получать копию каждого сообщения, опубликованного в теме. Pulsar будет доставлять сообщения потребителям общей подписки в циклическом режиме.

Теперь давайте опубликуем 6 сообщений в тему, используя этот код Python:

Вот что мы видим на потребителе, подключенном к эксклюзивной подписке:

Как и ожидалось, этот потребитель получает все 6 опубликованных сообщений.

Теперь давайте посмотрим на первого потребителя в общей подписке:

Этот потребитель получает все четные сообщения. Это имеет смысл, поскольку сообщения будут равномерно распределяться между двумя подключенными потребителями. Как и ожидалось, другой потребитель в общей подписке получает все сообщения с нечетными номерами:

Напомним, мы опубликовали 6 сообщений в теме. Эти 6 сообщений были получены двумя разными приложениями с использованием разных подписок. Одно приложение использует эксклюзивную подписку, поэтому оно получило все 6 сообщений. Другое приложение использует общую подписку с двумя потребителями. Он также получил 6 сообщений, но они были равномерно распределены между двумя потребителями, при этом каждый потребитель получил по 3 сообщения.

Теперь давайте отключим всех потребителей и снова опубликуем 6 сообщений. Pulsar будет постоянно хранить эти сообщения до тех пор, пока потребители не вернутся в сеть. Вот как это выглядит:

Как видите, Pulsar сохранил эти 6 сообщений в журнале невыполненных сообщений для каждой из подписок. Мы можем просмотреть сообщения в невыполненной эксклюзивной подписке с помощью функции Peek:

Если бы мы заглянули в бэклог общей подписки, то увидели бы тот же набор сообщений.

Теперь давайте подключим эксклюзивного потребителя. Этот потребитель получает свою копию 6 сообщений, но Pulsar держит остальные 6 копий сообщений в невыполненной работе до тех пор, пока один или несколько общих потребителей не подключатся к подписке:

Вывод

Как видите, Pulsar предоставляет простой способ подключения нескольких групп потребителей к теме с помощью подписки. С подписками вы можете разветвлять сообщения, опубликованные в теме, на несколько потребляющих приложений. Поскольку Pulsar поддерживает разные типы подписок, разные приложения могут подключаться к одной теме и использовать сообщения по-разному. Все это обрабатывается автоматически брокером Pulsar и клиентской библиотекой. В вашем приложении нет необходимости в специальном коде.

Подписки Pulsar являются мощными и дают вам большую гибкость для использования тем. Они также поддерживают расширенные функции, такие как перемотка назад и пропуск. Ищите будущую публикацию об этих расширенных функциях подписки Pulsar.

Хотите сами попробовать подписки Pulsar? Просто подпишитесь на бесплатный план нашего управляемого сервиса Pulsar и попробуйте его. Это займет всего минуту, чтобы начать.