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

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

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

Одна подписка читает все свои партиции через один консьюмер, а workers(n, by_key) раскладывает записи по партициям воркеров, выбирая их по партиции записи.

Диспетчеризация одной подписки: три партиции, один консьюмер, один поток и две партиции воркеров с ключом по партицииПартиция 0Партиция 1Партиция 2Консьюмер подпискивсе партиции, что назначила группаПоток KafkaSubscriberпо одной записиworkers(2, by_key)выбор по хешу партицииПартиция воркеров 1партиции 0 и 2,каждая по порядкуПартиция воркеров 2партиция 1, по порядкуПри LaneKey::RecordKey партицию воркеров выбирает ключ записи:одна партиция расходится по воркерам, каждый ключ по порядку
Схема текстом
  1. Партиция 0 → Консьюмер подписки все партиции, что назначила группа
  2. Партиция 1 → Консьюмер подписки все партиции, что назначила группа
  3. Партиция 2 → Консьюмер подписки все партиции, что назначила группа
  4. Консьюмер подписки все партиции, что назначила группа → Поток KafkaSubscriber по одной записи: выбранные записи
  5. Поток KafkaSubscriber по одной записи → workers(2, by_key) выбор по хешу партиции: по одной
  6. workers(2, by_key) выбор по хешу партиции → Партиция воркеров 1 партиции 0 и 2, каждая по порядку
  7. workers(2, by_key) выбор по хешу партиции → Партиция воркеров 2 партиция 1, по порядку
  8. При LaneKey::RecordKey партицию воркеров выбирает ключ записи: одна партиция расходится по воркерам, каждый ключ по порядку

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

workers(n, by_key) запускает n партиций воркеров. Запись попадает в ту партицию воркеров, на которую указывает хеш её ключа, а партиция воркеров выполняет свои записи по порядку. По умолчанию ключ - партиция записи (LaneKey::Partition), поэтому партиция Kafka никогда не делится между двумя партициями воркеров, и порядок Kafka сохраняется. Если партиций воркеров меньше, чем партиций, каждая из них обслуживает несколько партиций.

LaneKey::RecordKey вместо этого выбирает партицию воркеров по ключу записи. Записи одного ключа сохраняют порядок, а разные ключи одной партиции выполняются параллельно. У записи без ключа нет ключа партиционирования, и такие записи по кругу расходятся по партициям воркеров.

Подтверждения из параллельных партиций воркеров приходят не по порядку. При Commit::Tracked зафиксированное смещение всё равно никогда не обгоняет запись, которая не завершилась, как показывает страница Завершение.

Обработчик пакетов берёт одну запись и всё, что librdkafka уже выбрала, до размера, заданного при монтировании, поэтому пакет часто меньше этого размера.