AWS MQ
SQS(Simple Queue Service)
SQS有两种不同类型的队列,它们分别是:
- 标准队列(Standard Queue)
- FIFO队列(先进先出队列)
标准队列
标准队列拥有无限的吞吐量,所有消息都会至少传递一次,并且它会尽最大努力进行排序。
标准队列是默认的队列类型。

FIFO队列
FIFO (First-in-first-out)队列在不使用批处理的情况下,最多支持300TPS(每秒300个发送、接受或删除操作)。
在队列中的消息都只会不多不少地被处理一次。
FIFO队列严格保持消息的发送和接收顺序。

更多关于标准队列和FIFO队列的区别,可以查看我需要哪种类型的队列?
SQS的其他特点
- SQS是靠应用程序去拉取的,而不能主动推送给应用程序,推送服务我们使用SNS(Simple Notification Service)
- 消息会以256 KB的大小存放
- 消息会在队列中保存1分钟~14天,默认时间是4天
- 可见性超时(Visibility Timeout)
- 即当SQS队列收到新的消息并且被拉取走进行处理时,会触发Visibility Timeout的时间。这个消息不会被删除,而是会被设置为不可见,用来防止该消息在处理的过程中再一次被拉取
- 当这个消息被处理完成后,这个消息会在SQS中被删除,表示这个任务已经处理完毕
- 如果这个消息在Visibility Timeout时间结束之后还没有被处理完,则这个消息会设置为可见状态,等待另一个程序来进行处理
- 因此同一个消息可能会被处理两次(或以上)
- 这个超时时间最大可以设置为12小时
- 标准SQS队列保证了每一个在队列内的消息都至少会被处理一次
- 长轮询(Long Polling)
- 默认情况下,Amazon SQS使用短轮询(Short Polling),即应用程序每次去查询SQS队列,SQS都会做回应(哪怕队列一直是空的)
- 使用了长轮训,应用程序每次去查询SQS队列,SQS队列不会马上做回应。而是等到队列里有消息可处理时,或者等到设定的超时时间再做出回应。
- 长轮询可以一定程度减少SQS的花销
SNS (Simple Notification Service)
SNS (Simple Notification Service) 是一种完全托管的发布/订阅消息收发和移动通知服务,用于协调向订阅终端节点和客户端的消息分发。
SNS是一项 Web 服务,用于协调和管理向订阅终端节点或客户交付或发送消息的过程。在 Amazon SNS 中有两种类型的客户端:发布者和订阅者,也称为生产者和消费者。发布者通过创建消息并将消息发送至主题与订阅者进行异步交流,主题是一个逻辑访问点和通信渠道。订阅者(即 Web 服务器、电子邮件地址、Amazon SQS 队列、AWS Lambda 函数)在其订阅主题后通过受支持协议(即 Amazon SQS、HTTP/S、电子邮件、SMS、Lambda)中的一种使用或接收消息或通知。
我们可以使用SNS将消息推送到SQS消息队列中、AWS Lambda函数或者HTTP终端节点上。
SNS通知还可以发送推送通知到IOS,安卓,Windows和基于百度的设备,也可以通过电子邮箱或者SMS短信的形式发送到各种不同类型的设备上。

在创建SNS Topic时的一些选项:
- Encryption: 代表是否对Topic中的消息进行加密。如果需要处理的数据中有敏感信息,应做此设置。
- Delivery retry policy (HTTP/S): 默认为3,也就说尝试三次后,消息还没有送到的话,就会彻底丢失。因此在使用SNS的时候,一旦出现这种情况,就应该使用DLQ来做容错。
SNS的一些特点
- SNS是实时的推送服务(Push),有别于SQS的拉取服务(Pull/Poll)
- 拥有简单的API,可以和其他应用程序兼容
- 可以通过多种不同的传输协议进行集成
- 便宜、用多少付费多少的服务模型
- 在AWS管理控制台上就可以进行简单的操作
SNS vs SQS
AWS提供了SQS和SNS。SQS是一个分布式的队列消息service,SNS是一个分布式的发布-订阅消息service。具体有人会问这两者有什么区别,这里给出了回答: What is the difference between Amazon SNS and Amazon SQS?。 在我的实践中,SQS和SNS会结合起来使用,首先应用发布消息到SQS的queue里面,然后SNS消费这个queue的消息,放到自身的topic里面持久保存,然后其他的应用订阅这个topic,消费里面的消息。
sqs是一对一,不能一对多,消息可持久化,不推只能等拉,拉完就删除。
sns可一对多,不能持久化,push模型。
sqs及aws笔记,更全, link
个人觉得 sns是推 能力的一个抽象。比如推送,mq里的push,都是推。aws把推给抽象出来。就可以让用户像搭积木一样使用。