在使用AWS进行开发的时候,SNS(Simple Notification Service)是一个使用频率非常高的服务。下面就介绍一下SNS的设置和基本使用。

AWS SNS教程
SNS和SQS的区别
SNS是一对多:一个消息源,多个订阅者。也就是说,如果别的应用/人对你的消息感兴趣,那就需要订阅。
SQS是一对一,也就是通常只有一个消息的消费者。
设置SNS
在创建SNS Topic时的一些选项:
- Encryption: 代表是否对Topic中的消息进行加密。如果需要处理的数据中有敏感信息,应做此设置。
- Access policy: 这里针对两种操作:public/subscribe,可以选择Only the topic owner, Everyone, Only the specified AWS account等选项。这在复杂工作流中可能会用到。
- Delivery retry policy (HTTP/S): 默认为3,也就说尝试三次后,消息还没有送到的话,就会彻底丢失。因此在使用SNS的时候,一旦出现这种情况,就应该使用DLQ来做容错。
- Delivery status logging: 这个选项用于将消息传递的信息记录在日志中,这样就知道消息是否送到了。
通过Lambda监听消息
创建Lambda时选择”Use a blueprint” => “sns-message”,相关选项:
- Execution role: 这取决于Lambda要访问的资源,比如:如需要将信息写入DynamoDB,则需要相应权限。
使用Node.js
创建Topic
首先进入AWS SNS控制台创建一个Topic。如果使用serverless的话,可以在serverless.yml中定义topic。
订阅
JavaScript
import { SNS } from "aws-sdk";
const sns = new SNS();
const topicArn = `arn:aws:sns:eu-west-1:YOUR_AWS_ACCOUNT_ID:YOUR_TOPIC_NAME`;
const params = {
Protocol: 'EMAIL',
TopicArn: topicArn,
Endpoint: 'YOUR_EMAIL'
};
sns.subscribe(params, (err, data) => {
if(err) console.log('err1', err);
});发布消息
JavaScript
import { SNS } from "aws-sdk";
const sns = new SNS();
const topicArn = `arn:aws:sns:eu-west-1:YOUR_AWS_ACCOUNT_ID:YOUR_TOPIC_NAME`;
const params = {
TopicArn: `${topicArn}`,
Subject: `YOUR SUBJECT`,
Message: 'YOUR MESSAGE'
}
await sns.publish(params, (err, data) => {
if(err) console.log('err1', err);
}).promise();