Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Партиции воркеров
Одна подписка читает все свои топики и партиции через один консьюмер, а workers(n, by_key)
раскладывает сообщения по партициям воркеров, выбирая их по ключу партиционирования.
Схема текстом
- -partition-0 → Консьюмер подписки все её топики и партиции
- -partition-1 → Консьюмер подписки все её топики и партиции
- -partition-2 → Консьюмер подписки все её топики и партиции
- Консьюмер подписки все её топики и партиции → Поток PulsarSubscriber по одному сообщению: присланные сообщения
- Поток PulsarSubscriber по одному сообщению → workers(2, by_key) выбор по хешу заголовка partition-key: по одному
- workers(2, by_key) выбор по хешу заголовка partition-key → Партиция воркеров 1 ключи A и C, каждый по порядку
- workers(2, by_key) выбор по хешу заголовка partition-key → Партиция воркеров 2 ключ B, по порядку
- У сообщения без ключа нет ключа партиции воркеров: такие сообщения идут в партиции воркеров по кругу
- Между процессами подписка KeyShared держит каждый ключ на одном консьюмере
Поток подписки выдаёт по одному сообщению, из какого бы топика или партиции оно ни пришло. Без
workers один цикл вызывает обработчик для каждого сообщения по очереди, и ничего не выполняется
параллельно.
workers(n, by_key) запускает n партиций воркеров. Сообщение попадает в ту партицию воркеров,
на которую указывает хеш его ключа, а партиция воркеров выполняет свои сообщения по порядку.
Ключ - это ключ партиционирования сообщения, который доставка хранит в заголовке
partition-key, поэтому сообщения одного ключа сохраняют порядок. У сообщения без ключа нет
ключа партиции воркеров, и такие сообщения по кругу расходятся по партициям воркеров.
Партиции воркеров упорядочивают работу внутри одного процесса. Между процессами подписка
KeyShared держит каждый ключ на одном консьюмере, поэтому несколько
экземпляров сервиса делят топик и всё равно сохраняют порядок каждого ключа.
Перемотка через PulsarSeeker сдвигает всю подписку:
каждый топик и каждую партицию, которые читает её консьюмер.
Обработчик пакетов получает пакеты, которые собирает рантайм в сервисе, потому что клиент выдаёт
сообщения по одному. В пакете не больше сообщений, чем задано в точке монтирования. Пакет
закрывается, когда он полон, или через 10 миллисекунд после первого сообщения - это
batch_wait дескриптора.