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

23

我正在努力澄清Amazon的SQS Dead Letter Queue到底是做什么的。

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

死信队列 - SQS队列的ARN(Amazon资源名称),将接收由消费者在最大接收次数后未能成功处理的消息。

这不更像一个Poision队列吗?关键区别在于消费者确实收到了消息。死信是指消息可能是好的,但由于服务中断无法传递。http://www.eaipatterns.com/DeadLetterChannel.html

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

消息总线与队列

在普通队列的情况下,“Dead Letter Pattern”是否有不同的含义?由于SQS只是一个队列,而不是消息总线,因此它不负责传递消息。相反,它等待消息被获取(请求)。因此,传统的“Dead Letter Pattern”并不适用,因为没有消息总线试图传递消息并找不到收件人。
SQS能否像消息总线一样运作?
是否有一种通过SQS设置通道和监听器的方式,而不是显式地从队列中轮询消息的方法?

1
这是一个支持设施。问:我的消息到底发生了什么?答:哦,它在死信队列中。 - Hans Passant
看起来他们的实现有些不足。所有这些都是对你代码中差劲的断言/输入检查的后备。我认为你应该更加谨慎地处理糟糕的消息。 - theMayer
3个回答

17

好问题。

根据您引用的权威来源的定义(为了清晰起见删除引用),死信通道的具体工作方式取决于特定的消息传递系统实现,如果它提供了这样一个通道的话。该通道可能被称为“死消息队列”或“死信队列”。通常,在安装了消息传递系统的每台机器上都有自己的本地死信通道,以便无论消息在哪台机器上死亡,都可以将其从一个本地队列移动到另一个本地队列,而不会出现任何网络不确定性。这也记录了消息死亡的机器。当消息传递系统移动消息时,它还可能记录消息原本应该传递的通道。

...并不清楚是否真的存在区别。我理解你所说的“毒药队列”,你对SQS如何工作的理解是正确的。语义上,DLQ和PQ之间的区别--电子邮件风格的“无法投递”和“毒药”的区别--对我来说不清楚。也许PQ是DLQ的一种变体。

值得一提的是,ActiveMQ的重传策略使用SQS相同的DLQ定义--混合DLQ/PQ。

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

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

  1. Amazon SNS

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

    SNS针对HTTP/S有一个相当合理的重试策略,但据我所知,不支持DLQ或PQ。

  2. IronMQ的推送队列

    IronMQ是另一个比SQS更全面的RESTful消息队列服务。(真正的FIFO消息排序,更长的延迟等),但可悲的是,它支持更小的消息大小。 推送队列允许您设置推送“订阅者”,每当将新消息放入队列时,它们就会收到一个HTTP POST。

    如果IronMQ无法传递消息 - HTTP POST超时或您的端点返回任何不是2xx的内容 - 那么它将重试传递。 如果尝试次数用完,则将消息放入错误队列 - 在这种情况下,这是一种组合DLQ和PQ。

    这可能是您在托管服务中获得真正“ESB”的最接近方式。

当然,还有真正的开源ESB和SOA框架 - MULEServiceMix等 - 但我不知道您尝试做什么才能做出任何建议。 :)


6
我不确定大多数情况下是否有必要区分 DLQPQ。事实上,我发现这个定义相当武断。对于大多数事务性消息实现,如果消息在指定的重试次数内无法成功从队列中消费,则会进入 DLQ。为捕获格式错误消息而设置单独的队列意味着您现在需要查找两个地方的消息,这些消息未能被成功处理,需要监控两个异常队列或考虑操作,并且有一定比例的消息似乎可能属于任一队列(批处理场景)。

0
不,它不会像主动式ESB一样运作。简单队列服务从定义上就是简单的。它有“至少一次”交付保证,但除此之外几乎没有什么承诺。
它只是为轮询/长轮询而设计的。您可以有多个队列,每个队列都为不同的目的提供服务,但单个队列非常简单,并且不打算为多个功能提供服务或提供高级逻辑。SWF可能会提供您所需的内容,但很可能您需要实现一个ESB。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接