亚马逊SQS死信队列:它真的是死信还是毒药?

时间:2014-02-14 18:33:20

标签: amazon-web-services message-queue amazon-sqs message-bus

我正在努力澄清亚马逊的SQS死信队列究竟在做什么。

根据http://aws.typepad.com/aws/2014/01/amazon-sqs-new-dead-letter-queue.html

  

死信队列 - SQS队列的ARN(亚马逊资源名称),它将接收消费者在接收的最大数量后未成功处理的消息。

这听起来不像Poision Queue吗?关键的区别在于消费者确实收到了消息。当信息可能正常,但无法传递时,可能是由于服务中断而导致死信。 http://www.eaipatterns.com/DeadLetterChannel.html

这听起来像是多次成功接收消息,但处理消息失败,我理解为毒药消息队列的含义。

消息总线与队列

死信模式在普通旧队列的上下文中有不同的含义吗?由于SQS只是一个队列,而不是消息总线,因此它不负责传递消息。相反,它等待拾取(请求)消息。因此传统的死信模式并不真正适用,因为没有消息总线尝试传递消息而无法找到收件人。

SQS可以像消息总线一样工作吗?

是否有办法通过SQS设置通道和侦听器,而不是显式轮询来自队列的消息?

3 个答案:

答案 0 :(得分:13)

好问题。

基于您引用的the canonical source的定义(为清晰起见,删除了引文):

  

Dead Letter Channel工作的具体方式取决于特定消息传递系统的实现,如果它提供了一个。该通道可称为“死信息队列”或“死信队列”。通常,安装消息系统的每台机器都有自己的本地死信通道,这样无论机器上的消息是什么,它都可以从一个本地队列到另一个没有任何网络不确定性。这也记录了消息死亡的机器。当消息传递系统移动消息时,它还可以记录消息应该被传递的原始频道。

......目前尚不清楚是否真的存在差异。我理解你的意思是"毒药队列,"以及您对SQS如何工作的理解是合理的。在语义上,DLQ和PQ之间的差异 - "无法传递"在电子邮件的风格与#34;毒药" - 对我来说不清楚。也许PQ是DLQ的味道。

FWIW,ActiveMQ's redelivery policy使用与DLQ相同的定义 - 混合DLQ / PQ - 与SQS一样。

  

SQS可以像消息总线一样工作吗?

SQS不能,但有类似的产品可以。

  1. Amazon SNS

    SNS(简单通知服务)是一种通用的发布 - 订阅主题系统。 SNS允许您创建主题,然后注册接收推送通知的订阅者。目前,推送通知可以采用HTTP / S,电子邮件,短信,SQS和移动设备推送通知的形式。

    SNS对HTTP / S有一个非常合理的retry policy,但不支持DLQ或PQ AFAIK。

  2. IronMQ's Push Queues

    IronMQ是另一种REST-ful消息排队服务,它比SQS功能更强大。 (真正的FIFO消息排序,更长的延迟等等,但遗憾的是消息尺寸更小。)推送队列允许您设置推送用户,"每当新消息被放入队列时,它就会收到HTTP POST。

    如果IronMQ无法传递消息 - HTTP POST超时,或者您的端点返回除2xx之外的任何内容 - 那么它将重试传递。如果它没有重试,那么它会将消息放入错误队列 - 在这种情况下组合DLQ和PQ。

    这可能就像你要去一个真正的" ESB"在托管服务中。

  3. 当然,那里有真正的开源ESB和SOA框架 - MULEServiceMix等等 - 但我对你的内容并不了解。 39;重新尝试在那里做任何形式的推荐。 :)

答案 1 :(得分:2)

我不确定在大多数情况下,DLQPQ之间的区别是必要的。事实上,我觉得这个定义是相当武断的。对于大多数事务性消息传递实现,如果消息未在指定的重试次数内成功消耗掉队列,则会转到DLQ。为格式错误的消息设置单独的队列意味着您现在只有两个位置可以查找未成功处理的消息,两个要监视的异常队列或操作注意事项,以及一些看似可能属于它们的消息在任一队列中(想到批处理场景)。

答案 2 :(得分:0)

不,它不会像活跃的ESB那样行事。根据定义,简单队列服务很简单。有一个“至少一次”的交付保证,但除此之外它很少做出承诺。

它仅适用于轮询/长轮询。您可以拥有多个队列,每个队列服务于不同的目的,但单个队列非常简单,并非旨在为多个功能提供服务或提供高级逻辑。 SWF可能提供您想要的,但您可能需要实施ESB。

http://aws.amazon.com/swf/