跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

路径

一条 SQS 消息在 RustStream 服务中的路径:接收、投递、处理器、应答和删除,逐条或按批进行。

一条消息从接收到删除的路径,左边逐条处理并带应答,右边按批处理逐条按批ReceiveMessage10 条,等待 20 秒通道容纳一批SqsMessage逐条交出处理器解码并运行应答:SendMessage或 SNS PublishackDeleteMessageReceiveMessage大小 n,最多 10通道容纳一批Vec<SqsMessage>绝不为空批处理器每批调用一次每个元素各自 DeleteMessage
以文字阅读本图
  1. 逐条: ReceiveMessage 10 条,等待 20 秒; 通道 容纳一批; SqsMessage 逐条交出; 处理器 解码并运行; 应答:SendMessage 或 SNS Publish; ack DeleteMessage
  2. 按批: ReceiveMessage 大小 n,最多 10; 通道 容纳一批; Vec<SqsMessage> 绝不为空; 批处理器 每批调用一次; 每个元素 各自 DeleteMessage
  3. ReceiveMessage 10 条,等待 20 秒 → 通道 容纳一批: 一批
  4. 通道 容纳一批 → SqsMessage 逐条交出
  5. SqsMessage 逐条交出 → 处理器 解码并运行
  6. 处理器 解码并运行 → 应答:SendMessage 或 SNS Publish
  7. 应答:SendMessage 或 SNS Publish → ack DeleteMessage
  8. ReceiveMessage 大小 n,最多 10 → 通道 容纳一批
  9. 通道 容纳一批 → Vec<SqsMessage> 绝不为空
  10. Vec<SqsMessage> 绝不为空 → 批处理器 每批调用一次
  11. 批处理器 每批调用一次 → 每个元素 各自 DeleteMessage

拉取任务每次接收请求十条消息,带上所有消息属性和系统属性,最长等待 20 秒。只有描述符指定了可见性超时,它才在请求中指定。以空结果结束的长轮询不产出任何东西,因此批绝不为空。通道容纳一批,因此拉取任务最多比处理器领先一次接收。

每条消息变成一个 SqsMessage。正文从 SDK 的应答中复制出来,消息属性连同消息组和接收计数一起变成消息头。投递还会启动它的可见性延长器。每条消息因此有几次内存分配,基准测试公布了一条消息的开销。

逐条处理消息的订阅把批拆开,按顺序交出其中的消息。批订阅按自己的大小请求,上限为十,它的处理器一次调用接收整批。批中的每条消息仍然各用一次调用删除。

应答编码进分发循环复用的缓冲区。SqsPublisher 把这个缓冲区作为一次 SendMessage 的正文,SnsPublisher 则把它作为一次 Publish 的正文。队列 URL 或主题 ARN 只解析一次,然后缓存。

投递在应答之后结算。每次结算都经过结算它的那个运行时的 SDK 客户端,每种结果做什么,见结算。