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

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

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

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

Диспетчеризация одной подписки: три сегмента, по читателю на каждый, один канал и две партиции воркеров по ключу сегментаСегмент 0Читательаренда взятаСегмент 1Читательаренда взятаСегмент 2Читательаренда взятаОдин канал на 64 доставкиполный канал задерживает всех читателейworkers(2, by_key)партиция воркеров = хеш ключа сегментаПартиция воркеров 1ключи alice и carol,каждый по порядкуПартиция воркеров 2ключ bob, по порядкуБез workers один цикл вызывает обработчикдля одной записи за раз, в порядке поступленияЭкземпляры с общей таблицей аренд делят сегменты:каждый сегмент в один момент читает один экземпляр
Схема текстом
  1. Сегмент 0 → Читатель аренда взята
  2. Читатель аренда взята → Один канал на 64 доставки полный канал задерживает всех читателей
  3. Сегмент 1 → Читатель аренда взята
  4. Читатель аренда взята → Один канал на 64 доставки полный канал задерживает всех читателей
  5. Сегмент 2 → Читатель аренда взята
  6. Читатель аренда взята → Один канал на 64 доставки полный канал задерживает всех читателей
  7. Один канал на 64 доставки полный канал задерживает всех читателей → workers(2, by_key) партиция воркеров = хеш ключа сегмента: по одной
  8. workers(2, by_key) партиция воркеров = хеш ключа сегмента → Партиция воркеров 1 ключи alice и carol, каждый по порядку
  9. workers(2, by_key) партиция воркеров = хеш ключа сегмента → Партиция воркеров 2 ключ bob, по порядку
  10. Без workers один цикл вызывает обработчик для одной записи за раз, в порядке поступления
  11. Экземпляры с общей таблицей аренд делят сегменты: каждый сегмент в один момент читает один экземпляр

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

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

Все читатели подписки отправляют доставки в один канал на 64 места. Когда обработчики отстают, канал заполняется, все читатели ждут, и ни один сегмент не читается дальше, чем сервис успевает обработать. Подтверждения из параллельных партиций воркеров приходят не по порядку, а контрольная точка всё равно никогда не обгоняет незавершённую запись, как показывает страница Завершение.

Экземпляры сервиса с общей таблицей аренд делят сегменты: каждый сегмент в один момент читает один экземпляр, а новый экземпляр берёт сегменты по мере того, как их аренды освобождаются. Со стандартным MemoryLeaseStore каждый экземпляр хранит собственные аренды, поэтому каждый читает все сегменты.

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