AWS SNS 实现消息扇出模式(Fan-out)的方式
AWS Simple Notification Service(SNS) 是一项高可用、高吞吐量的消息发布/订阅(Pub/Sub)服务。通过扇出模式(Fan-out),你可以将同一条消息同时发送给多个不同类型的订阅者,如 SQS 队列、Lambda 函数、HTTP(S) 端点或 Email 等,这能极大提高系统的解耦与扩展性。😊
实现步骤
-
创建 SNS Topic:
- 登录 AWS 管理控制台。
- 选择 SNS 服务,点击 Create topic 创建一个新主题,比如命名为 MyFanoutTopic。
-
创建并配置多个订阅者:
- 为该 SNS Topic 添加多个订阅者(比如 SQS 队列、Lambda 函数、HTTP(s) 端点等)。
- 每添加一个订阅,选择对应协议(SQS、Lambda、Email、HTTP/HTTPS),然后填写订阅终端地址(如队列 ARN、Lambda ARN、邮箱或 Endpoint URL)。
- 部分协议(如 HTTP/HTTPS 或 Email)需要确认订阅,按照提示操作即可。
-
发布消息到 SNS Topic:
- 在 SNS 控制台选中你的 Topic,点击 Publish message。
- 输入消息内容后发布。SNS 会自动将这条消息推送给该 Topic 下所有已确认的订阅者,实现扇出。
架构示意图
代码示例(Python boto3)
import boto3
sns = boto3.client('sns')
# 发布消息到主题
response = sns.publish(
TopicArn='arn:aws:sns:us-east-1:123456789012:MyFanoutTopic',
Message='Hello everyone!'
)
print(response)
注意事项 📝
- 权限设置:确保 SNS Topic 有权向目标 SQS/Lambda 发送消息,相关策略需配置允许 SNS 执行
SQS:SendMessage 或 lambda:InvokeFunction 操作。
- 持久性保障:SQS 队列作为订阅者能保证消息不丢失,适合于异步和高可靠场景。
- 灵活性:你可以随时动态增加/删除订阅者,无需修改发布者代码。
典型应用场景 🎯
- 订单系统:下单后同时推送给物流、库存、发票等微服务。
- 告警系统:报警信息同时通知邮件、短信、监控面板。
- 日志收集:消息广播到多个存储、分析服务。
通过 AWS SNS 的扇出模式,你可以轻松实现一对多的消息分发,大幅提升系统的可扩展性和灵活性。如果有更多问题,欢迎继续交流!🌟