AWS SQS Python SDK
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| CRUD | Create, Read, Update, Delete | 创建、读取、更新、删除 |
| JSON | JavaScript Object Notation | 一种结构化数据格式 |
| SQS | Simple Queue Service | AWS 消息队列服务 |
1. Dependency#
python3 -m pip install boto32. What CRUD Means In SQS#
queue CRUD:
create:
create_queue
read:
get_queue_url / get_queue_attributes
update:
set_queue_attributes
delete:
delete_queue
message CRUD:
create:
send_message
read:
receive_message
update:
SQS does not support in-place message body update
usually re-send a new message or change visibility timeout
delete:
delete_message3. 安全运行方式#
下载 lab.py。它提供 create / inspect / cleanup 三个独立入口;随机运行标识、沙箱标签及本地清单绑定资源,默认不删除任何消息或队列。
export AWS_REGION=ap-east-1
export EXPECTED_ACCOUNT_ID=REPLACE_SANDBOX_ACCOUNT_ID
python3 lab.py create
python3 lab.py inspect创建步骤要求沙箱角色仅可管理 docs-* 队列,允许所需 SQS 操作及标签 API;使用 SSO/短期角色,不保存 access key。清单不是秘密,但不能修改它指向其他资源。部分创建失败时保留清单,先检查实际资源;不要直接重建同名队列。
4. 消息处理的提交边界#
# sqs 为 boto3 SQS client;process_and_commit 为真实业务的持久化事务。
# 同一 request_id + 相同内容重复到达,应复用结果;不同内容必须拒绝。
def handle(sqs, queue_url, message, process_and_commit):
import json
payload = json.loads(message["Body"])
if payload.get("schema_version") != 1 or not payload.get("request_id"):
raise ValueError("Invalid message contract; do not ACK")
process_and_commit(payload) # 返回前必须完成数据库提交,不可用 sleep 代替。
sqs.delete_message(QueueUrl=queue_url, ReceiptHandle=message["ReceiptHandle"])ACK(Acknowledgement,消息确认)只在提交后执行;提交后进程崩溃会再次投递,因此幂等记录必须与业务修改同事务。外部支付使用支付方幂等键与对账,不宣称一次投递。处理时间超过可见性窗口时须续租;续租失败停止新的副作用,允许消息重投。
可运行的数据库事务、worker 崩溃重试与对账见 订单参考工程。该工程使用 PostgreSQL 事务队列;上面是 SQS 适配接口,不能把两种队列的配置混用。
5. 独立清理#
完成 Hands-on 的死信重驱和验收,停止生产者/消费者后才运行:
python3 lab.py cleanup --confirm-run "$(jq -r .run sqs-run.json)"脚本先检查全部队列的账号、区域、名称及归属标签,再删除本次源队列、死信和 FIFO 队列。不会 purge 共享队列。生产队列不使用此实验清理工具。