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

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

Устройство

Где стоит ruststream-kinesis: между рантаймом RustStream и AWS SDK, по читателю на сегмент, рядом хранилище аренд, один клиент SDK на рантайм.

Сверху вниз: сервис, рантайм RustStream, этот крейт, клиенты AWS SDK, Kinesis и DynamoDBВаш сервисЯдро RustStreamruststream-kinesisAWS SDK для Rust#[subscriber]обработчики-подписчикиRustStream::new(..).with_broker(..)Рантайм: диспетчер, партиции воркеров, завершениеKinesisSubscriberчитатель на сегментKinesisMessageack = контрольная точкаKinesisPublisherодин PutRecordKinesisStreamдескрипторKinesisBrokerконфигурацияKinesisPublishполитикаLeaseStoreаренды, контрольные точкиaws-sdk-kinesisклиент на рантаймaws-sdk-dynamodbс dynamodb-leaseKinesisData StreamsDynamoDBтаблица арендС фичей testing место клиента и Kinesisзанимает журнал внутри процесса
Схема текстом
  1. Ваш сервис: #[subscriber] обработчики-подписчики; RustStream::new(..) .with_broker(..)
  2. Ядро RustStream: Рантайм: диспетчер, партиции воркеров, завершение
  3. ruststream-kinesis: KinesisSubscriber читатель на сегмент; KinesisMessage ack = контрольная точка; KinesisPublisher один PutRecord; KinesisStream дескриптор; KinesisBroker конфигурация; KinesisPublish политика; LeaseStore аренды, контрольные точки
  4. AWS SDK для Rust: aws-sdk-kinesis клиент на рантайм; aws-sdk-dynamodb с dynamodb-lease
  5. #[subscriber] обработчики-подписчики → Рантайм: диспетчер, партиции воркеров, завершение: монтируются
  6. Рантайм: диспетчер, партиции воркеров, завершение → KinesisSubscriber читатель на сегмент: опрашивает поток
  7. KinesisSubscriber читатель на сегмент → aws-sdk-kinesis клиент на рантайм
  8. KinesisPublisher один PutRecord → aws-sdk-kinesis клиент на рантайм
  9. LeaseStore аренды, контрольные точки → aws-sdk-dynamodb с dynamodb-lease
  10. aws-sdk-kinesis клиент на рантайм → Kinesis Data Streams: HTTPS
  11. aws-sdk-dynamodb с dynamodb-lease → DynamoDB таблица аренд: HTTPS
  12. С фичей testing место клиента и Kinesis занимает журнал внутри процесса

Крейт реализует трейты брокера из ядра поверх AWS SDK для Rust. Рантайм над ним один для всех брокеров. Всё, что относится к Kinesis, лежит в этом крейте: дескриптор KinesisStream, читатели сегментов, аренды, действие исхода на контрольную точку и способ, которым запись хранит заголовки. Крейт подписывается, принимает пакеты, перематывает подписку, передаёт ключ сегмента в диспетчеризацию по ключу и описывает свой сервер в генерируемом документе. Транзакций и запросов с ответом у него нет.

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

Подключённый брокер и все издатели делят одно соединение: клиент SDK, хранилище аренд, идентификатор владельца аренды и признак закрытия. SDK открывает HTTP-соединение в рантайме того запроса, которому оно нужно. Поэтому каждый рантайм отправляет запросы через собственный клиент. Рантайм брокера использует клиент, созданный при подключении. Поток выполнения обработчика со своим рантаймом создаёт клиент при первом запросе, из той же конфигурации и того же кэша учётных данных. Поэтому занятый поток выполнения никогда не задерживает соединения брокера.

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

Транспорт внутри процесса​

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

Журнал пишет запись так же, как издатель пишет её в Kinesis, с тем же ключом сегмента и тем же конвертом, и читает её обратно тем же декодированием. Он отвергает то, что отвергает Kinesis, с той же ошибкой, что и настоящий вызов: недопустимое имя потока, недопустимый ключ сегмента, слишком большую запись и любой дескриптор, использованный после завершения работы. Он моделирует позиции и перемотку, заголовки доставки, копии для повтора и поток мёртвых писем, а на возврат в очередь отвечает AckError::Unsupported.

Часть поведения есть только у настоящего сервиса. Внутри процесса у потока один сегмент, поэтому все записи упорядочены друг относительно друга. Аренд, контрольных точек, срока хранения и изменения числа сегментов нет, и запись, оставшаяся необработанной, не возвращается. Любой поток, который называет сервис, существует, а подписка открывается с конца потока.

Как части запускаются и останавливаются, показывает страница Жизненный цикл, а путь одной записи - страница Путь.