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

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

Путь

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

Путь сообщения от получения до удаления: слева по одному, с ответом, справа пакетамиПо одномуПакетамиReceiveMessage10, ожидание 20 сКаналвмещает один пакетSqsMessageвыдаются по одномуОбработчикдекодирует и выполняетОтвет: SendMessageили Publish в SNSackDeleteMessageReceiveMessageразмер n, до 10Каналвмещает один пакетVec<SqsMessage>никогда не пустОбработчик пакетоводин вызов на пакетКаждому элементусвой DeleteMessage
Схема текстом
  1. По одному: ReceiveMessage 10, ожидание 20 с; Канал вмещает один пакет; SqsMessage выдаются по одному; Обработчик декодирует и выполняет; Ответ: SendMessage или Publish в SNS; ack DeleteMessage
  2. Пакетами: ReceiveMessage размер n, до 10; Канал вмещает один пакет; Vec<SqsMessage> никогда не пуст; Обработчик пакетов один вызов на пакет; Каждому элементу свой DeleteMessage
  3. ReceiveMessage 10, ожидание 20 с → Канал вмещает один пакет: пакет
  4. Канал вмещает один пакет → SqsMessage выдаются по одному
  5. SqsMessage выдаются по одному → Обработчик декодирует и выполняет
  6. Обработчик декодирует и выполняет → Ответ: SendMessage или Publish в SNS
  7. Ответ: SendMessage или Publish в SNS → ack DeleteMessage
  8. ReceiveMessage размер n, до 10 → Канал вмещает один пакет
  9. Канал вмещает один пакет → Vec<SqsMessage> никогда не пуст
  10. Vec<SqsMessage> никогда не пуст → Обработчик пакетов один вызов на пакет
  11. Обработчик пакетов один вызов на пакет → Каждому элементу свой DeleteMessage

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

Каждое сообщение становится SqsMessage. Тело копируется из ответа SDK, а атрибуты сообщения становятся заголовками, вместе с группой сообщений и счётчиком получений. Доставка также запускает продление своей видимости. На сообщение приходится несколько выделений памяти, а во что обходится одно сообщение, публикует страница Бенчмарки.

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

Ответ кодируется в буфер, который цикл диспетчеризации использует повторно. SqsPublisher берёт этот буфер телом одного вызова SendMessage, а SnsPublisher - телом одного вызова Publish. Адрес очереди или ARN темы разрешается один раз и кешируется.

Доставка завершается после ответа. Каждое завершение проходит через клиенты SDK того рантайма, который его выполняет, а что делает каждый исход, показывает страница Завершение.