Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Подписки
Подписка Pulsar - именованный курсор, который хранит брокер. Каждая подписка получает весь топик, а её тип решает, как консьюмеры делят её между собой.
Схема текстом
- Топик orders: 0; 1; 2; 3; 4; 5; 6
- Консьюмеры одной подписки по её типу: C1 получает всё; C2 ждёт C1; C1 получает запись 5; C2 получает запись 6; C1 активен, по порядку; C2 ждёт в резерве; ключ A уходит к C1; ключ B уходит к C2
- Exclusive: C1 получает всё; C2 ждёт C1
- Shared: C1 получает запись 5; C2 получает запись 6
- Failover: C1 активен, по порядку; C2 ждёт в резерве
- KeyShared: ключ A уходит к C1; ключ B уходит к C2
- Подписка audit курсор на записи 1 → 1: читает дальше
- Подписка billing курсор на записи 5 → 5: читает дальше
- Подписка billing курсор на записи 5 → Консьюмеры одной подписки по её типу
- Брокер хранит каждый курсор: подписка переживает консьюмеров и получает всё, что опубликовано в их отсутствие
Две подписки на один топик никак не влияют друг на друга. У каждой свой курсор, и каждая получает все сообщения. Консьюмеры, которые подключаются под одним именем подписки, делят один этот курсор. Подписка долговечна: она остаётся на брокере, когда уходит её последний консьюмер, и непрочитанные сообщения копятся, пока консьюмер не вернётся.
SubscriptionType задаёт, как консьюмеры одной
подписки делят её между собой:
| Тип | Консьюмеры | Порядок |
|---|---|---|
Exclusive | один; второй ждёт | сохраняется |
Shared (по умолчанию) | все, каждое сообщение одному из них | не сохраняется |
Failover | один активный, остальные в резерве | сохраняется |
KeyShared | все, каждый ключ одному из них | сохраняется для каждого ключа |
Второму консьюмеру подписки Exclusive сервер отвечает «consumer busy». Клиент считает этот ответ
поводом повторить попытку и по умолчанию повторяет её без ограничения, раз в пять секунд. Поэтому
второй консьюмер ждёт, пока уйдёт первый, и его сервис не запускается.
OperationRetries ограничивает число попыток, и тогда
подписка возвращает ошибку
PulsarError::Subscribe.
Сервер создаёт подписку, когда консьюмер впервые её называет, и ставит её на самое новое
сообщение: клиент pulsar запрашивает эту позицию, если не указано иное, и этот крейт её не
меняет. Сервис, которому нужно начать с другого места, переставляет подписку
перемоткой, позицию которой задаёт
PulsarPosition. Перемотка сдвигает сам
хранимый курсор, поэтому действует при каждом старте, а не только при первом.
Подписка на список топиков или на шаблон - это внутри клиента по консьюмеру на топик, которые читаются как один поток. Шаблон сопоставляется с полными именами топиков. Клиент заново получает список топиков каждые 30 секунд, поэтому топик, созданный после подписки, присоединяется к ней при следующем обновлении списка.
Эта модель взята у самого Apache Pulsar (подписки, типы подписки). Как консьюмер подтверждает сообщения, показывает страница Подтверждение.