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

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

Путь

Путь записи Kinesis через сервис RustStream: чтение, доставка, обработчик, ответ и контрольная точка, по одной записи или пакетами.

Путь записи от чтения до контрольной точки: слева по одной, с ответом, справа пакетамиПо однойПакетамиGetRecordsдо 1000 записейКанал64 доставки, все сегментыKinesisMessageзаголовки, местоОбработчикдекодирует и выполняетОтвет: PutRecordс выбранным ключомackконтрольная точка, если подрядGetRecordsлимит n, до 10 000Канал64 доставкиПакетn записей или 50 мсОбработчик пакетоводин вызов на пакетКаждый элементзавершается сам
Схема текстом
  1. По одной: GetRecords до 1000 записей; Канал 64 доставки, все сегменты; KinesisMessage заголовки, место; Обработчик декодирует и выполняет; Ответ: PutRecord с выбранным ключом; ack контрольная точка, если подряд
  2. Пакетами: GetRecords лимит n, до 10 000; Канал 64 доставки; Пакет n записей или 50 мс; Обработчик пакетов один вызов на пакет; Каждый элемент завершается сам
  3. GetRecords до 1000 записей → Канал 64 доставки, все сегменты: записи
  4. Канал 64 доставки, все сегменты → KinesisMessage заголовки, место
  5. KinesisMessage заголовки, место → Обработчик декодирует и выполняет
  6. Обработчик декодирует и выполняет → Ответ: PutRecord с выбранным ключом
  7. Ответ: PutRecord с выбранным ключом → ack контрольная точка, если подряд
  8. GetRecords лимит n, до 10 000 → Канал 64 доставки
  9. Канал 64 доставки → Пакет n записей или 50 мс
  10. Пакет n записей или 50 мс → Обработчик пакетов один вызов на пакет
  11. Обработчик пакетов один вызов на пакет → Каждый элемент завершается сам

Читатель сегмента запрашивает до 1000 записей за один GetRecords. Каждая запись становится сообщением KinesisMessage: полезная нагрузка копируется из ответа SDK, а конверт, если он есть, снимается с неё. Ключ сегмента, порядковый номер и идентификатор сегмента становятся заголовками. Доставка также занимает своё место в отметке подтверждения сегмента, которая определяет её контрольную точку. Это несколько выделений памяти на запись, а сколько стоит запись, публикует страница Бенчмарки.

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

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

Ответ кодируется в буфер, который цикл диспетчеризации использует повторно. Ключ сегмента берётся из вызова публикации, затем из заголовка partition-key, затем из политики. Запись, которой никто не задал ключ, получает ключ, распределяющий записи по сегментам. Пользовательские заголовки попадают в конверт, а ответ без них - это закодированный буфер без изменений. KinesisPublisher пишет его одним вызовом PutRecord через клиент SDK того рантайма, который публикует.

Доставка завершается после ответа. ack записывает контрольную точку, только когда сдвигает отметку подтверждения сегмента, как показывает страница Завершение.