介绍
- SNS是什么?
SNS:Simple Notification Service,是Amazon自2010年以来推出的一款消息通知服务。
以下介绍摘自官网:
Amazon Simple Notification Service (Amazon SNS) 是一项托管服务,提供从发布者向订阅者(也称为*创建者*和*使用者*)的消息传输。发布者通过将消息发送至*主题*与订阅者进行异步交流,主题是一个逻辑访问点和通信渠道。客户端可以使用支持的终端节点类型订阅 SNS 主题并接收已发布的消息,例如 Amazon Data Firehose、Amazon SQS AWS Lambda、HTTP、电子邮件、移动推送通知和移动短信 (SMS)。
(refs: https://docs.aws.amazon.com/zh_cn/sns/latest/dg/welcome.html)
通过简介和结构图,我们可以看到,SNS有两种模式 ,A2A,A2P。
A2A :Application to Application。SNS在这里的定位为中间件服务,为后续应用服务(SQS,HTTP服务) 提供数据传递,扩散。
A2P :Application to Person , 这里Person指 个人手机 ,email,mobile push(手机消息推送弹框)。
- SNS的模型: SNS服务是一个Fanout 扇出模型,根据上面的结构图也可以看出,如果有多个不同终端的订阅,当消息流入以后, 消息会复制以及扩散到不同终端,像一面展开的扇子。
(refs: https://docs.aws.amazon.com/zh_cn/sns/latest/dg/sns-common-scenarios.html)
Fanout-扇形
应用场景
消息的多端送达, 这里我们用A2A-HTTP(S)服务 和 A2P-邮件举例。
使用示例1 - A2A-HTTP(S)
在这个场景下 ,我们需要 示例1.1创建topic,1.2 启动Http Server,1.3 Http server进行topic订阅,1.4 Http server接收订阅消息。下面我们来展示一个完整流程:
- 示例1.1 创建topic
- 示例1.2 启动Http Server
需要我们自己发布一个Http Sever,用来订阅接收消息。
HTTP Server的实现:根据aws文档,Http Server需要:
1)校验sns发来消息的合法性,不是强制的,建议这么做,避免消息伪造;
消息包括3种,分别是订阅确认通知,通知消息,取消订阅通知;
2)解析消息;
3)对于不同消息进行处理;当订阅某个topic时,会收到一个确认请求,里面有个回调确认地址,需要回调这个地址确认下,才能收到后续的订阅消息;
注意📢:aws官方本身对这块儿没有给代码示例,自己写起来比较麻烦,我结合文档和github上一些代码写了示例,仅供大家参考:https://github.com/Wunan777/aws_sns_demo
启动并暴露服务:根据上述实现Http Server后,启动,并需要暴露到aws可以访问的地址上。
建议服务跑在带有公网IP的云服务器上。如果跑在自己本地机器上,没有公网ip, 可以用NAT Server
做外网暴露 , 推荐工具:ngrok (https://ngrok.com/)
- 示例1.3 创建订阅
这里我们选择创建HTTP(S) endpoint 订阅,
创建订阅 填写订阅信息填写信息确认订阅后,会给终端节点,也就是我们的Http Server发订阅确认请求,Http Server处理确认后,即可完成订阅。订阅成功如下,后续可以接收订阅信息。
订阅成功- 示例1.4 接收消息
先产生并发送条消息,在aws console上,刚刚的topic页面里,点击发布消息
按钮 ,会进入下面这个页面,依次填写信息后,发送。
此时我们在1.3中启动的服务会接收到消息,如下。
http server收到消息并打印
(refs: https://docs.aws.amazon.com/zh_cn/sns/latest/dg/sns-http-https-endpoint-as-subscriber.html)
使用示例2 - A2P - 邮箱订阅
使用邮箱进行订阅流程类似,我们可以继续使用刚刚的topic,然后示例2.1 创建邮箱订阅,示例2.2 接收订阅
- 示例2.1 创建邮箱订阅
这里创建完,邮箱会收到一个确认邮件,里面有个确认链接,点开链接后,即确认,完成订阅。
点击链接,进行订阅确认- 接收推送
发送消息还是可以使用之前的 aws console里面的发送消息功能,发送完后,接收消息如下。
邮箱里收到推送的消息结语
至此,我们完成了A2A下 Http Server的订阅
以及 A2P下 邮箱的订阅
。
多说几句,对于SNS A2A给我的个人感觉是aws里面的中间件服务,不单独使用,A2P 虽然不是中间件服务,可以独立进行邮件或者消息通知,但是它提供的服务配套一般(缺乏配套的消息发送预览,送达率监控,指标统计等),如果我们要做大规模ToC的用户手机通知推送 mobile push,其实有很多专门做这类的服务(国内比如友盟,国外比如one signal,即使同在aws上也有个更成熟的 aws - pinpoint服务 ),所以A2P 可能更适合做些公司内部业务的顺带推送,比如有个数据指标要推送多个下游处理平台(SNS-A2A),顺带推到相关团队邮件组(SNS-A2P),这样搭配着使用,会更自然,方便。
SNS这边就介绍这么多,最后希望各位能找到适合自己的场景,敏捷开发,项目顺利!
注意事项
1,数据传输:SNS传输有大小限制,数据量限制 256 KB,超过需要引入S3 refs: https://docs.aws.amazon.com/zh_cn/sns/latest/dg/large-message-payloads.html
2,服务保障:SNS本身无qos服务质量保障,有消息失败重传机制,但不保证送达
重传机制:https://docs.aws.amazon.com/zh_cn/sns/latest/dg/sns-message-delivery-retries.html
Q && A
Q:日志和监控,如何监控发布的信息内容
A:无法直接监控到, 如需查看发布的内容,需要用一个客户端订阅发布topic,从而接收发布内容。
CloudTrail
1,使用 CloudTrail 收集的信息,您可以确定向 Amazon SNS 发出了什么请求、发出请求的 IP 地址、何人发出的请求、请求的发出时间以及其他详细信息。
2,可以记录api调用,用户权限等相关信息,但是没有 message (HIDDEN_DUE_TO_SECURITY_REASONS),如果需要可以启动一个client进行topic监听。
https://docs.aws.amazon.com/zh_cn/sns/latest/dg/sns-logging-using-cloudtrail.html
Q:如何删除 SNS Pending Confirmation状态的订阅。
A: 无法删除,需要3天后自动过期移除。
https://repost.aws/zh-Hans/knowledge-center/sns-cannot-delete-topic-subscription
在我们的Http服务里,sns消息验证的模块需要安装M2Crypto,使用Python3安装有问题时,可以对照下面的博客看下。
网友评论