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

Amazon web services 亚马逊SQS死信队列:它真的是死信还是毒药?,amazon-web-services,message-queue,amazon-sqs,message-bus,Amazon Web Services,Message Queue,Amazon Sqs,Message Bus,我试图澄清亚马逊的SQS死信队列到底在做什么 据 死信队列-SQS队列的ARN(亚马逊资源名称),该队列将接收在消费者最大数量的接收后未成功处理的消息 这听起来不是更像一个泊松队列吗?关键区别在于消费者确实收到了信息。当消息可能没有问题,但可能由于服务中断而无法传递时,就会出现死信 其中,由于这听起来像消息被成功接收了多次,但处理消息失败,我理解这就是有毒消息队列的含义 消息总线vs队列 死信模式在普通旧队列的上下文中有不同的含义吗?因为SQS只是一个队列,而不是消息总线,所以它不负责传递消息。

我试图澄清亚马逊的SQS死信队列到底在做什么

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

这听起来不是更像一个泊松队列吗?关键区别在于消费者确实收到了信息。当消息可能没有问题,但可能由于服务中断而无法传递时,就会出现死信

其中,由于这听起来像消息被成功接收了多次,但处理消息失败,我理解这就是有毒消息队列的含义

消息总线vs队列

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

SQS能否像消息总线一样工作?


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

没有,它的行为与活动ESB不同。简单队列服务的定义很简单。有一个“至少一次”的交付保证,但除此之外,它很少做出承诺

它仅设计用于轮询/长轮询。您可以有多个队列,每个队列都有不同的用途,但单个队列非常简单,不用于服务多个功能或提供高级逻辑。SWF可能提供您想要的,但您可能需要实现ESB

好问题

根据您引用的定义(为了清楚起见,删除了引文):

死信通道的具体工作方式取决于特定消息传递系统的实现(如果它提供的话)。该通道可以称为“死信队列”或“死信队列”。通常,安装消息传递系统的每台机器都有自己的本地死信通道,这样,无论消息死在哪台机器上,它都可以从一个本地队列移动到另一个本地队列,而不存在任何网络不确定性。这也会记录消息在哪台机器上消失。当消息传递系统移动消息时,它还可能记录消息传递的原始通道

…不清楚是否真的有区别。我理解你所说的“毒药队列”是什么意思,你对SQS工作原理的理解是正确的。从语义上讲,DLQ和PQ之间的区别——电子邮件风格中的“无法送达”与“毒药”——我并不清楚。也许PQ是DLQ的一种风格

FWIW使用与SQS相同的DLQ定义——一种混合DLQ/PQ

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

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

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

    SNS对HTTP/S有着相当合理的定义,但不支持DLQ或PQ AFAIK

  • IronMQ是另一个REST-ful消息队列服务,它的功能比SQS更全面。(真正的FIFO消息排序、更长的延迟等等,但遗憾的是消息大小更小。)推送队列允许您设置推送“订阅者”,然后在任何时候将新消息放入队列时接收HTTP POST

    如果IronMQ无法传递消息——HTTP POST超时,或者您的端点返回的不是
    2xx
    ——那么它将重试传递。如果重试次数不足,则会将消息放入错误队列——在本例中是DLQ和PQ的组合

    这可能是您在托管服务中接近真正的“ESB”的距离


  • 当然,也有真正的开源ESB和SOA框架——等等——但我对您在那里试图做什么来提出任何建议的了解还远远不够。:)

    我不确定在大多数情况下是否有必要区分
    DLQ
    PQ
    。事实上,我觉得这个定义相当武断。对于大多数事务性消息传递实现,如果消息没有在指定的重试次数内从队列中成功消费,则会转到
    DLQ
    。对格式错误的消息使用单独的队列意味着您现在只有两个位置可以查找未成功处理的消息,两个异常队列要监视或操作注意事项,以及某些百分比的消息似乎属于任一队列(想到批处理场景).

    这是一个支持设施。问:我的留言到底怎么了?A:噢,它在死信队列中。看起来它们的实现有些欠缺。所有这些都是对代码中糟糕的断言/输入检查的一种回退。我想你应该对如何处理坏消息更谨慎一点。