Перейти к основному содержимому
Нормативная версия документации - английская

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

Подписки

Подписка Pulsar - именованный курсор, который хранит брокер. Каждая подписка получает весь топик, а её тип решает, как консьюмеры делят её между собой.

Две подписки на один топик, у каждой свой курсор, и то, как консьюмеры одной подписки делят её при каждом из четырёх типовТопик ordersКонсьюмеры одной подписки по её типуExclusiveSharedFailoverKeyShared0123456Подписка auditкурсор на записи 1Подписка billingкурсор на записи 5C1 получает всёC2 ждёт C1C1 получает запись 5C2 получает запись 6C1 активен, по порядкуC2 ждёт в резервеключ A уходит к C1ключ B уходит к C2Брокер хранит каждый курсор: подписка переживает консьюмерови получает всё, что опубликовано в их отсутствие
Схема текстом
  1. Топик orders: 0; 1; 2; 3; 4; 5; 6
  2. Консьюмеры одной подписки по её типу: C1 получает всё; C2 ждёт C1; C1 получает запись 5; C2 получает запись 6; C1 активен, по порядку; C2 ждёт в резерве; ключ A уходит к C1; ключ B уходит к C2
  3. Exclusive: C1 получает всё; C2 ждёт C1
  4. Shared: C1 получает запись 5; C2 получает запись 6
  5. Failover: C1 активен, по порядку; C2 ждёт в резерве
  6. KeyShared: ключ A уходит к C1; ключ B уходит к C2
  7. Подписка audit курсор на записи 1 → 1: читает дальше
  8. Подписка billing курсор на записи 5 → 5: читает дальше
  9. Подписка billing курсор на записи 5 → Консьюмеры одной подписки по её типу
  10. Брокер хранит каждый курсор: подписка переживает консьюмеров и получает всё, что опубликовано в их отсутствие

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

SubscriptionType задаёт, как консьюмеры одной подписки делят её между собой:

ТипКонсьюмерыПорядок
Exclusiveодин; второй ждётсохраняется
Shared (по умолчанию)все, каждое сообщение одному из нихне сохраняется
Failoverодин активный, остальные в резервесохраняется
KeySharedвсе, каждый ключ одному из нихсохраняется для каждого ключа

Второму консьюмеру подписки Exclusive сервер отвечает «consumer busy». Клиент считает этот ответ поводом повторить попытку и по умолчанию повторяет её без ограничения, раз в пять секунд. Поэтому второй консьюмер ждёт, пока уйдёт первый, и его сервис не запускается. OperationRetries ограничивает число попыток, и тогда подписка возвращает ошибку PulsarError::Subscribe.

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

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

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