首页 > 代码库 > Amazon SQS(Simple Queue Service) 简介

Amazon SQS(Simple Queue Service) 简介

SQS即Simple Queue Service, 是一个分布式的消息队列服务,使用它非常简单,消息队列服务可以用来buffer burst, 使整个服务异步处理,不要求组件始终可用.

开发人员最初使用 Amazon SQS 时只需用到五个 API:

CreateQueue、SendMessage、ReceiveMessage、ChangeMessageVisibility 和 DeleteMessage。

Amazon SQS 会尽量保持消息顺序,但是由于队列的分布式特性,SQS无法保证发送消息的先后顺序。每个 Amazon SQS 队列都具有可配置的可见性超时(Default Visibility Timeout)。在从队列中读取消息后的指定时间内,该消息对其他读取者保持不可见。只要消息的处理时间短于可见性超时,每条消息都会得以处理并删除。如果处理消息的组件出现失败或不可用,可见性超时结束后该消息即对读取该队列的任何组件可见。这允许您让多个组件同时从同一队列中读取消息,每个组件负责处理不同的消息。 


在 Amazon SQS 返回消息后,该消息会保存在队列中,称之为In Flight状态。删除请求可确认已处理了该消息。如果不删除消息,Amazon SQS 将在另一个接收请求中递送该消息。由于分布式 Amazon SQS 系统中的某台服务器在执行删除时不可用,DeleteMessage 操作未能删除消息的所有副本。该消息副本可能会被再次递送。所以应该在应用中进行相应的设计,以便在再次收到已删除的消息时不会出现错误或不一致。 


 如果连续 30 天以上时间没有针对某个队列签发以下任何请求,SQS有可能删除该队列:SendMessage、ReceiveMessage、DeleteMessage、GetQueueAttributes 和 SetQueueAttributes。设计应用程序时应将此考虑在内,这点比较恶心,觉得不应该有这样的性质。


短轮询和长轮询(区别是是否采样)

如果使用短轮询,则您从队列中检索消息时,Amazon SQS 会对服务器的一个子集(基于加权随机分布)进行采样,并且仅从这些服务器返回消息。这意味着,特定接收请求可能不会返回您的所有消息。或者,如果您的队列中有少量消息(少于 1 000 条),则意味着,特定请求可能不会返回您的任何消息,而后续请求则会返回您的任何消息。如果您继续从您的队列中检索消息,则 Amazon SQS 会对所有服务器进行采样,您会收到您的所有消息。

使用 Amazon SQS 进行长轮询的一个好处是:在没有消息可返回以答复发送到 Amazon SQS 队列的 ReceiveMessage 请求时,可以减少空响应数量。在发送响应之前,长轮询允许 Amazon SQS 产品等到队列中的消息可用为止。因此,如果连接没有超时,则对 ReceiveMessage 请求的响应将至少包含一条可用的消息(如果有),最多可包含 ReceiveMessage 调用中请求的最大消息数。

Receive Message Wait Time就是设置短轮询还是长轮询的,0代表短轮询,最大到20.

Amazon SQS 使用您需要熟悉的以下三个标识符:

队列 URL
消息 ID
接收句柄


每个队列飞行消息(Messages in Flight)的数量限制为 120,000。消息被队列接收后会处于飞行状态,但尚未从队列中删除。如果达到 120,000 的限制,将会收到一条来自 Amazon SQS 的“OverLimit”错误消息。为避免达到限制,应该在处理消息后将其从队列删除。


延迟队列允许将队列中新消息的传递操作推迟特定的秒数(Delivery Delay)。如果您创建延迟队列,则发送到该队列的任何消息在延迟期间对使用者都不可见。延迟队列类似于可见性超时,因为这两种功能都使得使用者在特定的时间段内无法获得消息。延迟队列和可见性超时之间的区别在于:对于延迟队列,消息在首次添加到队列时是隐藏的;而对于可见性超时,消息只有在从队列取回后才是隐藏的。


默认拒绝和显式拒绝的区别很重要,因为默认拒绝可以被允许覆盖,但是显式拒绝就不能。显示拒绝是并的关系,默认拒绝是或的关系.

原文:http://blog.csdn.net/hongchangfirst/article/details/25877059

作者:hongchangfirst

hongchangfirst的主页:http://blog.csdn.net/hongchangfirst