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

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

Устройство

Где стоит ruststream-sqs-sns: между рантаймом RustStream и AWS SDK, одна задача приёма на подписку, один набор клиентов SDK на рантайм.

Сверху вниз: сервис, рантайм RustStream, этот крейт, клиенты AWS SDK, SQS и SNSВаш сервисЯдро RustStreamruststream-sqs-snsAWS SDK для Rust#[subscriber]обработчикиRustStream::new(..).with_broker(..)Рантайм: диспетчер, конвейеры обработки, завершениеSqsSubscriberзадача приёмаSqsPublisher,SnsPublisherSqsMessageпродление видимостиSqsPublish,политики SnsPublishSqsBrokerконфигурацияSqsQueueдескрипторКлиенты aws-sdk-sqs и aws-sdk-sns,свой набор у каждого рантайма, который отправляетAmazon SQS и Amazon SNSС фичей testing место клиентов и AWSзанимает аккаунт внутри процесса
Схема текстом
  1. Ваш сервис: #[subscriber] обработчики; RustStream::new(..) .with_broker(..)
  2. Ядро RustStream: Рантайм: диспетчер, конвейеры обработки, завершение
  3. ruststream-sqs-sns: SqsSubscriber задача приёма; SqsPublisher, SnsPublisher; SqsMessage продление видимости; SqsPublish, политики SnsPublish; SqsBroker конфигурация; SqsQueue дескриптор
  4. AWS SDK для Rust: Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет
  5. #[subscriber] обработчики → Рантайм: диспетчер, конвейеры обработки, завершение: монтируются
  6. Рантайм: диспетчер, конвейеры обработки, завершение → SqsSubscriber задача приёма: опрашивает поток
  7. SqsSubscriber задача приёма → Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет
  8. SqsPublisher, SnsPublisher → Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет
  9. Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет → Amazon SQS и Amazon SNS: запросы HTTPS
  10. С фичей testing место клиентов и AWS занимает аккаунт внутри процесса

Крейт реализует трейты брокера из ядра поверх AWS SDK для Rust. Рантайм над ним один для всех брокеров. Всё, что относится к SQS, лежит в этом крейте: дескриптор SqsQueue, то, что исход обработки делает с сообщением, и то, как ответ попадает в очередь или в тему. Крейт подписывается, принимает пакеты и ключи партиционирования и описывает свой сервер в генерируемом документе. Для публикации в SNS нужна фича sns.

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

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

SqsPublish отправляет в очередь вызовом SendMessage, а SnsPublish публикует в тему вызовом Publish. Издатели принимают буфер, в который закодирован ответ, и тело, которое SQS принимает как текст, становится телом запроса без копирования. Любая другая полезная нагрузка передаётся в кодировке base64 с атрибутом-меткой и декодируется при получении.

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

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

Аккаунт отвечает на вызовы, которые делает этот крейт, и отвергает то, что отвергает SQS, с той же ошибкой, которую вернул бы настоящий вызов. Он моделирует то, от чего зависит логика сервиса: конкурирующих получателей, получение до десяти сообщений, видимость и её продление, счётчик получений, перенос в DLQ, группы FIFO и пятиминутное окно дедупликации, а также доставку сообщений темы SNS всем подписчикам разом.

Некоторые вещи есть только у настоящего сервиса. Внутри процесса существует каждая очередь и каждая тема, которую называет сервис, а сообщение, отправленное в очередь, которую не читает ни одна подписка, отбрасывается. Дескриптор, который не называет видимость, получает 30 секунд - значение по умолчанию для новой очереди. Стандартная очередь внутри процесса сохраняет порядок, а в SQS нет, поэтому тест проверяет порядок только на очереди FIFO. Учётные данные не проверяются.

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