Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Партиции воркеров
Подписка выдаёт сообщения по одному, а workers(n, by_key) раскладывает их по партициям воркеров
по ключу из заголовка nats-partition-key.
Схема текстом
- Подписка субъект Core или консьюмер стрима → Поток NatsSubscriber по одному сообщению: доставлены
- Поток NatsSubscriber по одному сообщению → workers(2, by_key) партиция = хеш nats-partition-key: по одному
- workers(2, by_key) партиция = хеш nats-partition-key → Партиция воркеров 1 ключ a, по порядку
- workers(2, by_key) партиция = хеш nats-partition-key → Партиция воркеров 2 ключ b, по порядку
- У сообщения без заголовка нет ключа: такие сообщения по кругу расходятся по партициям
- Между процессами: очередь или durable-консьюмер отдаёт каждое сообщение одному участнику
Без workers один цикл вызывает обработчик для каждого сообщения по очереди. Порядок подписки
сохраняется, и ничего не выполняется параллельно.
workers(n, by_key) запускает n партиций воркеров. Сообщение попадает в ту партицию воркеров, на
которую указывает хеш его ключа, а партиция воркеров выполняет свои сообщения по порядку.
Собственных партиций у NATS нет, поэтому ключ - это заголовок
nats-partition-key, который задаёт издатель. Сообщения
одного ключа сохраняют порядок, а разные ключи выполняются параллельно.
Между процессами работу делит сервер. Очередь
отдаёт каждое сообщение Core одному участнику, в порядке, который выбирает сервер. Подписки,
привязанные к одному durable-консьюмеру, берут сообщения
JetStream по очереди. max_ack_pending
ограничивает, сколько сообщений консьюмера одновременно ждут ответа, по всем его участникам.
Обработчик пакетов берёт сообщения до размера, заданного в
точке монтирования. В JetStream один пакет - это одна выборка, которую досрочно закрывает
pull_expires. В Core пакет собирается на клиенте и закрывается по достижении размера или через 10
миллисекунд после первого сообщения.