Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Устройство
Где стоит ruststream-sqs-sns: между рантаймом RustStream и AWS SDK, одна задача приёма на
подписку, один набор клиентов SDK на рантайм.
Схема текстом
- Ваш сервис: #[subscriber] обработчики; RustStream::new(..) .with_broker(..)
- Ядро RustStream: Рантайм: диспетчер, конвейеры обработки, завершение
- ruststream-sqs-sns: SqsSubscriber задача приёма; SqsPublisher, SnsPublisher; SqsMessage продление видимости; SqsPublish, политики SnsPublish; SqsBroker конфигурация; SqsQueue дескриптор
- AWS SDK для Rust: Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет
- #[subscriber] обработчики → Рантайм: диспетчер, конвейеры обработки, завершение: монтируются
- Рантайм: диспетчер, конвейеры обработки, завершение → SqsSubscriber задача приёма: опрашивает поток
- SqsSubscriber задача приёма → Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет
- SqsPublisher, SnsPublisher → Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет
- Клиенты aws-sdk-sqs и aws-sdk-sns, свой набор у каждого рантайма, который отправляет → Amazon SQS и Amazon SNS: запросы HTTPS
- С фичей 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. Учётные данные не проверяются.
Как части запускаются и останавливаются, показывает страница Жизненный цикл, а путь одного сообщения - страница Путь.