SQS (Simple Queue Service)
- 概念
- 简单消息服务,类似于Rabbit MQ,主要作用是作为消息中间件,解耦应用程序的各个组件
- SQS不保证消息FIFO,但能保证消息的高可靠
- 消息的生命周期
- 生产者将消息发送到消息队列,此时消息的状态变为in-flight
- 消费者从消息队列中获取消息,此时消息的状态变为processed,在visibility timeout的时间段以内,其它消费者无法获取到相同的消息
- 消费者处理完毕消息后,从SQS中消息删除
- Visibility Timeout
- 某个消费者从消息队列中取出一个消息后,visiblity timeout开始计时,此时该消息不能被其它消费者获取。如果超时了该消息还没有被开始的消费者删除,则该消息的状态又变为in-flight,其它消费者可以获取该消息继续处理。
- 该机制很好理解,试想,如果某个消费者获取了某个消息,但可能某种原因处理失败了却又一直不删除此消息,该消息就会一直处于processed状态,消息即不能被删除,又不能被其它消费者处理,这就是一个问题,所以引入了timeout机制。
- 超时时间范围30s-12h,默认30s
- Delay Queue
- 如果设置了delay queue,所有消息都会被延时处理,直到delay的时间到了。
- delay的时间范围0-15m
- In-flight
- 消息被发送到queue后其状态为in-flight,默认可以有120000个in-flight消息
- Queue的操作,Unique IDs
- CreateQueue,ListQueues,DeleteQueue,SendMessage, SendMessageBatch,ReceiveMessage,DeleteMessage,DeleteMessageBatch,ChangeMessageVisibility,etc
- 发送消息到queue后,SQS会返回一个消息的唯一ID,该ID只是用于标识该消息,不能操作消息
- 从queue获取到消息后SQS会返回receipt handle,可以用此句柄操作消息,如删除消息等
- Queue and message identifiers
- Queue:queue URL,每个Queue都有个URL用于唯一标识该Queue
- Message ID:唯一标识消息,但不能操作消息
- Receipt handles:消息句柄,也能唯一标识消息,用于操作消息
- Message Attributes
- 消息属性,用于对消息的额外描述,如时间戳,签名等,可选项,不是必须设置的
- Long Polling
- 默认情况用于获取消息的逻辑是在一个循环里不停的调用ReceiveMessage,如果有消息则交专门的线程处理,如果没有则返回空。ReceiveMessage不是阻塞式的,也就是说如果没有消息其就会马上返回。这样可能有一个问题,如果一直没有消息则会陷入死循环,会增加CPU的开销。可以通过每次循环后sleep一段时间来解决,但如果有很多消息则会降低系统性能,因为每次都要sleep。
- Long Polling是指为SQS设置一个时间,在该时间段里调用ReceiveMessage后如果没有消息则调用会被阻塞。如果被阻塞后在该时间段内有新的消息,则立即返回消息,如果超时后还没消息则返回空。
- Long Polling时间范围1-20s
- Dead Letter Queue
- 将处理失败的消息放入dead letter queue,以便trouble shooting
- Access Control
- 通过创建IAM policy可以设置Queue的访问权限,例如只允许某个账号在某个时间段访问Queue等
- Queue就是AWS的一个资源,通过IAM policy可以准确指定访问权限
- Durability
- 如果向SQS发送消息,SQS只有确定存储完成后才会返回成功,这能保证消息的持久性,且操作简单
- 不像其它的异步处理系统,发送消息后会立刻返回,而不管消息是否处理成功
- 如果要建立SQS的异步调用,可以在SendMessage调用的上层进行处理,例如专门的线程来发送消息而不管发送结果
- 消息可以在Queue中存放4-14天
SWF (Simple Workflow Service)
- 概念
- 简单工作流服务,用于协调某个工作流的各个处理子流程,在各个处理流程上应用不同的处理分支来完成任务
- SWF支持串行处理,并行处理,同步处理和异步处理等类型
- Domains
- SWF域,是一组资源的集合和分组
- 一个domain可以包含多个workfkow,且workflow之间可以有交互,但一个workflow只能属于某一个domain
- History
- 通过查看workflow history可以知道详细的处理流程细节,完成时间,错误记录等
- Actors
- Workflow Starter:用于初始化和启动某个workflow
- Workflow Decider:用于决定下一个工作流是什么
- Activity Workers:用于执行具体的任务
- Tasks
- Activity tasks:执行具体的任务
- Lambda tasks:通过Lambda执行具体的任务
- Decision tasks:执行任务来决定下一个工作流是什么
- Task List
- 任务列表,可以理解为task的队列,是所有任务的集合
- Long Polling
- Decider和Activity worker与SWF相互通信的途径
- 与SQS的long polling有点类似,都是周期性的检查他们和SWF的状态,如果有需要处理的任务,则进行相应的处理
- Object Identifier
- Workflow Type:Domain name,version
- Activity Type:Domain name,version
- Decision and activity task:Unique task token
- Execution of workflow:Domain,workflow ID,run ID
- Execution Closure
- 如何结束任务:完成,取消,错误,超时
- 简单的workflow执行流程
- Starter通知SWF开始某个工作流
- SWF通知Decider下一步如何处理
- Decider返回SWF下一个处理的任务
- SWF通知Activity worker处理任务
- Activity worker处理完毕后返回SWF
- SWF通知Decider下一步如何处理
- ......
- Decider通知SWF任务处理完毕
- SWF关闭workflow执行流程,归档历史记录等
SNS (Simple Notification Service)
- 概念:简单通知服务,用于通知终端用户某个事件的发生,运行方式类似生产者消费者模式。
- 通知方式
- Email,发邮件
- SQS,向队列发消息
- HTTP/s,可能是通过提交http请求或者调用RESTful发送消息
- SMS,发短信
- AWS Lambda,执行Lambda程序
- Topic
- 一个topic就是一个SNS的接入点,任何想发送通知的生产者都是将通知发送到某个topic
- Subscription
- 订阅某个topic,就是将某种通知方式关联到某个topic,只要topic接受到生产者发送的通知,SNS就会将通知转发给所有订阅者
- 一个topic可以对应多个subscription,一个subscription只对应一个topic
- SNS的使用场景
- Fanout:通知的扇出,是指某个topic接受到某个生产者发送的消息后,SNS会将其消息转发给所有订阅者,通知被扩散了
- Applicaiton and system alert,应用和系统的告警,如EC2 instance异常关闭,EC2 的CPU使用率过高,系统出现异常导致无法启动服务等都可以通过SNS告知用户
- Push Email and Text Message:向用户群发邮件或短信,例如广告信息,通知信息等
- Mobilie Push Notificatoin:向应用推送更新通知,并可以包含下载链接等