本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
生命周期
SqsBroker::new 只记录配置,connect 加载 AWS 配置,启动时为每个队列打开一个拉取任务,关闭时关闭连接。
以文字阅读本图
- Broker: SqsBroker::new(); ConnectedSqsBroker; Closed = () 无可报告
- 在 AWS 上: 只记录配置, 无 I/O; 加载 AWS 配置, 每次尝试 25 秒, 构建 SDK 客户端; 每个订阅: GetQueueUrl 或 CreateQueue、重新驱动 策略、可见性, 启动拉取任务; 发布时解析一次 它的队列或主题, 然后缓存; 连接 标为已关闭
- SqsBroker::new() → ConnectedSqsBroker: connect(self)
- ConnectedSqsBroker → Closed = () 无可报告: shutdown(self)
- 只记录配置, 无 I/O → 加载 AWS 配置, 每次尝试 25 秒, 构建 SDK 客户端
- 加载 AWS 配置, 每次尝试 25 秒, 构建 SDK 客户端 → 每个订阅: GetQueueUrl 或 CreateQueue、重新驱动 策略、可见性, 启动拉取任务
- 每个订阅: GetQueueUrl 或 CreateQueue、重新驱动 策略、可见性, 启动拉取任务 → 发布时解析一次 它的队列或主题, 然后缓存
- 发布时解析一次 它的队列或主题, 然后缓存 → 连接 标为已关闭
- 比连接活得更久的发布者 返回 SqsError::NotConnected,绝不默默成功
new、endpoint、region、test_credentials 和 from_config 都不做 I/O,所以服务的构建函数保持同步。Broker 的克隆与它共用连接,启动钩子正是通过克隆拿到运行时打开的连接。运行时在应用启动时连接 Broker。
connect 通过 SDK 的默认链加载 AWS 配置,并使用 Broker 指定的端点和区域,把每次尝试的超时设为 25 秒,比 20 秒的长轮询更长。用 from_config 构建的 Broker 保留它的 SdkConfig,超时也一样,只有 Broker 指定的端点和区域会取代配置中的值。然后 connect 构建 SDK 客户端。SDK 延迟获取凭证,直到第一次请求。在服务中,这次请求就是第一个订阅的 GetQueueUrl,所以凭证有误时,启动在订阅这一步失败。
每个订阅的 SqsQueue 首先被检查:名称为空、等待时间超过 20 秒,或者可见性不在一秒到 12 小时之间,都会在调用 AWS 之前返回 SqsError::InvalidQueue。然后订阅解析队列 URL,在 create_if_missing 下则创建队列。注册声明了 max_attempts 和 dead_letter 时,它写入重新驱动策略。描述符没有指定可见性超时时,它读取队列自己的超时。最后它启动拉取任务。
接收错误作为一个条目到达订阅的流。队列不再存在时,拉取任务结束;其他错误则让它等待一秒,再进行下一次接收。
关闭把连接标为已关闭,并返回 ():SDK 客户端没有需要关闭或刷出的东西。关闭之前创建的发布者此后返回 SqsError::NotConnected。