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

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

Партиции воркеров

Подписка выдаёт сообщения по одному, а workers(n, by_key) раскладывает их по партициям воркеров по ключу из заголовка nats-partition-key.

Диспетчеризация одной подписки: один поток сообщений и две партиции воркеров с ключом из заголовка partition-keyПодпискасубъект Core или консьюмер стримаПоток NatsSubscriberпо одному сообщениюworkers(2, by_key)партиция = хеш nats-partition-keyПартиция воркеров 1ключ a, по порядкуПартиция воркеров 2ключ b, по порядкуУ сообщения без заголовка нет ключа:такие сообщения по кругу расходятся по партициямМежду процессами: очередь или durable-консьюмеротдаёт каждое сообщение одному участнику
Схема текстом
  1. Подписка субъект Core или консьюмер стрима → Поток NatsSubscriber по одному сообщению: доставлены
  2. Поток NatsSubscriber по одному сообщению → workers(2, by_key) партиция = хеш nats-partition-key: по одному
  3. workers(2, by_key) партиция = хеш nats-partition-key → Партиция воркеров 1 ключ a, по порядку
  4. workers(2, by_key) партиция = хеш nats-partition-key → Партиция воркеров 2 ключ b, по порядку
  5. У сообщения без заголовка нет ключа: такие сообщения по кругу расходятся по партициям
  6. Между процессами: очередь или durable-консьюмер отдаёт каждое сообщение одному участнику

Без workers один цикл вызывает обработчик для каждого сообщения по очереди. Порядок подписки сохраняется, и ничего не выполняется параллельно.

workers(n, by_key) запускает n партиций воркеров. Сообщение попадает в ту партицию воркеров, на которую указывает хеш его ключа, а партиция воркеров выполняет свои сообщения по порядку. Собственных партиций у NATS нет, поэтому ключ - это заголовок nats-partition-key, который задаёт издатель. Сообщения одного ключа сохраняют порядок, а разные ключи выполняются параллельно.

Между процессами работу делит сервер. Очередь отдаёт каждое сообщение Core одному участнику, в порядке, который выбирает сервер. Подписки, привязанные к одному durable-консьюмеру, берут сообщения JetStream по очереди. max_ack_pending ограничивает, сколько сообщений консьюмера одновременно ждут ответа, по всем его участникам.

Обработчик пакетов берёт сообщения до размера, заданного в точке монтирования. В JetStream один пакет - это одна выборка, которую досрочно закрывает pull_expires. В Core пакет собирается на клиенте и закрывается по достижении размера или через 10 миллисекунд после первого сообщения.