在线客服

AWS SNS 如何实现消息的扇出模式,将消息发送给多个订阅者?

⏱️2026-02-08 09:00 👁️15

AWS SNS 实现消息扇出模式(Fan-out)的方式

AWS Simple Notification Service(SNS) 是一项高可用、高吞吐量的消息发布/订阅(Pub/Sub)服务。通过扇出模式(Fan-out),你可以将同一条消息同时发送给多个不同类型的订阅者,如 SQS 队列、Lambda 函数、HTTP(S) 端点或 Email 等,这能极大提高系统的解耦与扩展性。😊

实现步骤

  1. 创建 SNS Topic:
    • 登录 AWS 管理控制台
    • 选择 SNS 服务,点击 Create topic 创建一个新主题,比如命名为 MyFanoutTopic
  2. 创建并配置多个订阅者:
    • 为该 SNS Topic 添加多个订阅者(比如 SQS 队列、Lambda 函数、HTTP(s) 端点等)。
    • 每添加一个订阅,选择对应协议(SQS、Lambda、Email、HTTP/HTTPS),然后填写订阅终端地址(如队列 ARN、Lambda ARN、邮箱或 Endpoint URL)。
    • 部分协议(如 HTTP/HTTPS 或 Email)需要确认订阅,按照提示操作即可。
  3. 发布消息到 SNS Topic:
    • 在 SNS 控制台选中你的 Topic,点击 Publish message
    • 输入消息内容后发布。SNS 会自动将这条消息推送给该 Topic 下所有已确认的订阅者,实现扇出。

架构示意图

SNS Fan-out 架构图

代码示例(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:SendMessagelambda:InvokeFunction 操作。
  • 持久性保障:SQS 队列作为订阅者能保证消息不丢失,适合于异步和高可靠场景。
  • 灵活性:你可以随时动态增加/删除订阅者,无需修改发布者代码。

典型应用场景 🎯

  • 订单系统:下单后同时推送给物流、库存、发票等微服务。
  • 告警系统:报警信息同时通知邮件、短信、监控面板。
  • 日志收集:消息广播到多个存储、分析服务。

通过 AWS SNS 的扇出模式,你可以轻松实现一对多的消息分发,大幅提升系统的可扩展性和灵活性。如果有更多问题,欢迎继续交流!🌟