AWS SQS Hands-on

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
ARN Amazon Resource Name AWS 资源名称,用于唯一标识资源
DLQ Dead-Letter Queue 死信队列
FIFO First In, First Out 先进先出
URL Uniform Resource Locator 统一资源定位符,通常指访问地址

1. 独立沙箱与资源清单#

使用 Bash、AWS CLI、Python 3、boto3、jq 和短期沙箱角色。下载 lab.py,创建本次专属源队列、死信队列与 FIFO(先进先出)队列;不要复用业务队列。

set -euo pipefail
export AWS_REGION=ap-east-1
export EXPECTED_ACCOUNT_ID=REPLACE_SANDBOX_ACCOUNT_ID
python3 -m pip install boto3
python3 lab.py create
export QUEUE_URL=$(jq -r .queues.source.url sqs-run.json)
export DLQ_URL=$(jq -r .queues.dlq.url sqs-run.json)
export DLQ_ARN=$(jq -r .queues.dlq.arn sqs-run.json)
export FIFO_URL=$(jq -r .queues.fifo.url sqs-run.json)
export RUN_ID=$(jq -r .run sqs-run.json)

2. 发送并模拟消费者失败#

只发送合成数据。以下故意不确认消息,每次立即结束可见性,以演练达到最大接收次数后的死信转移;真实消费者不得这样做。

aws sqs send-message --queue-url "$QUEUE_URL" --message-body "{\"schema_version\":1,\"request_id\":\"$RUN_ID\",\"order_id\":\"synthetic-order\",\"amount_cents\":1200}"
for attempt in $(seq 1 8); do
  aws sqs receive-message --queue-url "$QUEUE_URL" --wait-time-seconds 10 --max-number-of-messages 1 --message-system-attribute-names ApproximateReceiveCount > receive.json
  handle=$(jq -r '.Messages[0].ReceiptHandle // empty' receive.json)
  if [ -n "$handle" ]; then
    aws sqs change-message-visibility --queue-url "$QUEUE_URL" --receipt-handle "$handle" --visibility-timeout 0
  fi
done
aws sqs receive-message --queue-url "$DLQ_URL" --wait-time-seconds 20 --visibility-timeout 1 > dead-letter.json
jq -e '.Messages | length > 0' dead-letter.json

验收死信正文 request_id 等于 RUN_ID;未出现则停止检查 RedrivePolicy、接收次数、权限和延迟,不进入清理。队列近似计数不能代替业务对账。

3. 修复后限速重驱#

实际业务先修复消费者并验证持久化幂等;本步骤只验收传输层重驱,不声称完成支付处理。

sleep 2
TASK=$(aws sqs start-message-move-task --source-arn "$DLQ_ARN" --max-number-of-messages-per-second 1 --query TaskHandle --output text)
aws sqs list-message-move-tasks --source-arn "$DLQ_ARN"
# 等本次任务显示 COMPLETED;FAILED 时停止,检查 FailureReason。
aws sqs receive-message --queue-url "$QUEUE_URL" --wait-time-seconds 20 > replay.json
jq -e --arg run "$RUN_ID" '.Messages[0].Body | fromjson | .request_id == $run' replay.json

运行业务消费者时,必须在事务提交后 delete-message;先注入“提交后、确认前”崩溃,重放不能新增第二笔业务记录。示例只读重放,不用删除消息伪装业务成功。需要停止重驱时运行 aws sqs cancel-message-move-task --task-handle "$TASK",已经移动的消息不会自动撤回。

4. FIFO 与指标#

aws sqs send-message --queue-url "$FIFO_URL" --message-group-id synthetic-order --message-deduplication-id "$RUN_ID" --message-body '{"status":"accepted"}'
python3 lab.py inspect

同一去重窗口重复发送相同去重 ID,观察去重;窗口之外仍需业务幂等。监控源队列最老消息年龄、可见/处理中消息数和死信数量;先定阈值再故障注入,并验证告警触发及恢复。不要把 FIFO 的有限时间去重当成永久防重。

5. 清理(最后执行)#

停止发送与消费,确认重驱结束、验收证据已保存。删除的是本次独立实验队列及其中合成消息,默认不会自动执行。

python3 lab.py cleanup --confirm-run "$RUN_ID"

三个队列均在清单中;脚本会拒绝账号/区域/归属不符。首次删除可能需要最多 60 秒生效;出现失败时先盘点剩余资源,不能改清单指向共享队列。费用检查包括 CloudWatch 自建告警和日志。

参考:死信重驱。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭