版权声明:本文为博主原创文章,未经博主同意不得转载。https://blog.csdn.net/hongchangfirst/article/details/25877059
SQS即Simple Queue Service, 是一个分布式的消息队列服务,使用它非常easy,消息队列服务能够用来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 系统中的某台server在运行删除时不可用。DeleteMessage 操作未能删除消息的全部副本。该消息副本可能会被再次递送。所以应该在应用中进行对应的设计,以便在再次收到已删除的消息时不会出现错误或不一致。
假设连续 30 天以上时间没有针对某个队列签发下面不论什么请求,SQS有可能删除该队列:SendMessage、ReceiveMessage、DeleteMessage、GetQueueAttributes 和 SetQueueAttributes。设计应用程序时应将此考虑在内,这点比較恶心,认为不应该有这种性质。
短轮询和长轮询(差别是是否採样)
假设使用短轮询,则您从队列中检索消息时。Amazon SQS 会对server的一个子集(基于加权随机分布)进行採样,而且仅从这些server返回消息。
这意味着。特定接收请求可能不会返回您的全部消息。或者,假设您的队列中有少量消息(少于 1 000 条),则意味着,特定请求可能不会返回您的不论什么消息,而兴许请求则会返回您的不论什么消息。假设您继续从您的队列中检索消息。则 Amazon SQS 会对全部server进行採样,您会收到您的全部消息。
使用 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