
本文介绍如何通过 aws sns 的主题(topic)机制,高效、可靠地向多个移动设备批量发送推送通知,避免为每个设备单独创建端点并逐条调用 publish,显著提升开发效率与系统可扩展性。
本文介绍如何通过 aws sns 的主题(topic)机制,高效、可靠地向多个移动设备批量发送推送通知,避免为每个设备单独创建端点并逐条调用 publish,显著提升开发效率与系统可扩展性。
在使用 aws-sdk-go 与 Amazon SNS 集成实现移动推送时,一个常见误区是试图“一次性向多个设备 Token 创建端点”或“单次 Publish 调用广播到多个 TargetArn”。但需明确:SNS 的 CreatePlatformEndpoint 接口仅接受单个 Token 字符串,不支持数组;PublishInput.TargetArn 也只允许指定单一端点 ARN 或主题 ARN——因此,原生不支持“一请求多设备 Token”的直连模式。
✅ 正确且推荐的实践路径是采用 SNS Topic + Subscription 模式,其核心流程如下:
- 创建平台应用(Platform Application)(通常只需一次,全局复用)
- 为每个设备 Token 创建独立 Endpoint(可异步并发处理)
- 将各 Endpoint ARN 订阅(Subscribe)至同一 SNS Topic
- 向 Topic 发布消息(Publish),自动广播至所有订阅者
以下是关键代码示例(Go + github.com/aws/aws-sdk-go-v2/service/sns):
// 1. 创建 Topic(若尚不存在)
createTopicResp, err := svc.CreateTopic(ctx, &sns.CreateTopicInput{
Name: aws.String("my-app-push-topic"),
})
if err != nil {
log.Fatal("failed to create topic:", err)
}
topicArn := createTopicResp.TopicArn
// 2. 为每个设备 Token 创建 Endpoint 并订阅(建议批量并发处理)
for _, token := range []string{"token-001", "token-002", "token-003"} {
// 创建 Platform Endpoint
epResp, err := svc.CreatePlatformEndpoint(ctx, &sns.CreatePlatformEndpointInput{
PlatformApplicationArn: aws.String(platformAppArn),
Token: aws.String(token),
})
if err != nil {
log.Printf("failed to create endpoint for %s: %v", token, err)
continue
}
// 订阅该 Endpoint 到 Topic
_, err = svc.Subscribe(ctx, &sns.SubscribeInput{
TopicArn: topicArn,
Protocol: aws.String("application"), // 必须为 "application"
Endpoint: epResp.EndpointArn,
})
if err != nil {
log.Printf("failed to subscribe endpoint %s: %v", *epResp.EndpointArn, err)
continue
}
}
// 3. 向 Topic 发布消息(自动触达所有已订阅的设备)
_, err = svc.Publish(ctx, &sns.PublishInput{
TopicArn: aws.String(*topicArn),
Message: aws.String(`{"default": "{}", "APNS": "{\"aps\":{\"alert\":\"Hello!\"}}", "GCM": "{\"data\":{\"message\":\"Hello!\"}}"}`),
MessageStructure: aws.String("json"),
})
if err != nil {
log.Fatal("failed to publish to topic:", err)
}⚠️ 注意事项:
-
Subscribe.Protocol必须设为"application"(而非"https"或"email"),这是 SNS 向移动端推送的专用协议; - 每个设备 Token 必须对应唯一 Endpoint(SNS 自动去重),重复订阅同一 Endpoint 不会报错;
- Topic 模式天然支持高并发、高可用,且无需维护设备列表状态——SNS 自动管理订阅生命周期;
- 若需定向推送(如按用户标签),可结合 SNS 主题策略(Topic Policy)或使用 SNS Mobile Push 的 Message Attributes 实现条件路由;
- 生产环境务必添加错误重试、幂等性校验(如基于 Token 的幂等键)及订阅状态监控(如监听
SubscriptionConfirmation和UnsubscribeConfirmation事件)。
总结:虽然 SNS 不提供“单 API 多 Token”的快捷接口,但通过 Topic + Subscription 构建的发布/订阅模型,不仅完全满足批量推送需求,还具备解耦、弹性、可观测等工程优势。这是 AWS 官方推荐且经大规模验证的最佳实践。

















