什么是死信队列?
死信队列(DLQ)是一种特殊类型的消息队列,用于临时存储软件系统由于错误而无法处理的消息。消息队列是支持分布式系统中的异步通信的软件组件。借助它们,您可以在软件服务之间发送任何数量的消息,且不需要消息接收器始终处于可用。死信队列特别用于存储没有目的地或无法由预期接收器处理的错误的消息。
为什么死信队列很重要?
死信队列(DLQ)与常规消息队列并存。它们充当错误和失败的消息的临时存储。DLQ 可防止源队列溢出未处理的消息。
例如,假设一个软件具有常规消息队列和 DLQ。该软件使用常规队列来保存计划发送到目的地的消息。如果接收器无法响应或处理已发送的消息,软件会将其移至死信队列。
消息移至 DLQ 管道有两个潜在原因:消息内容错误和接收器系统更改。
消息内容错误
如果传输的消息是错误的,则消息将移至 DLQ。硬件、软件和网络状况可能会损坏已发送的数据。例如,硬件干扰会在传输过程中稍微改变一些信息。意外的数据损坏可能导致接收器拒绝或忽略消息。
接收器系统更改
如果接收软件发生了发件人不知道的更改,则消息也可能会移至 DLQ。例如,您可以尝试通过发送 CUST_ID_005 消息来更新客户信息。但是,接收器可能无法处理传入的消息,因为它已将客户从系统的数据库中删除。
死信队列有什么优势?
接下来,我们将讨论死信队列(DLQ)的优势。
降低了通信成本
常规或标准消息队列将一直处理消息,直到保留期过期为止。这有助于确保持续消息处理,并最大限度降低队列受阻的几率。
但是,如果您的系统处理数千条消息,则大量错误消息将增加通信开销成本,从而为通信系统带来负担。与其尝试处理失败的消息直到它们过期为止,不如在数次处理尝试之后将它们移至死信队列。
改善了故障排除
如果您将错误的消息移至 DLQ,则可以让开发人员专注于识别错误原因。他们可以调查接收器无法处理消息的原因、进行修复并再次尝试传递消息。
例如,银行软件可能每天向后端系统发送数千份信用卡申请以供审批。后端系统从那里接收申请,但由于信息不完整,无法处理所有申请。软件不会进行无休止的尝试,而是将消息移至 DLQ,直到 IT 团队解决问题。这使系统能够在没有性能问题的情况下处理和传递剩余的消息。
何时应该使用死信队列?
如果您的系统存在以下问题,则可以使用死信队列(DLQ)。
无序队列
当您的应用程序不依赖于排序时,您可以利用 DLQ。虽然 DLQ 可以帮助您对错误的消息传输操作进行故障排除,但您应继续监控队列,并重新发送失败的消息。
FIFO 队列
消息排序在先入先出(FIFO)队列中非常重要。必须处理每一条消息,然后才能传递下一条消息。您可以将死信队列与 FIFO 队列配合使用,但您的 DLQ 实施也应该是 FIFO。
何时不应使用死信队列?
当您希望能够无限期地继续重试传输消息时,不应将死信队列(DLQ)与无序队列配合使用。例如,如果您的程序必须等待某一依存过程变为活动或可用状态,则不要使用死信队列。
同样,如果您不想打破消息或操作的确切顺序,则不应将先入先出(FIFO)队列与死信队列配合使用。例如,不要将死信队列与视频编辑套件编辑决策列表(EDL)中的指令配合使用。在此实例中,通过更改编辑顺序,将会更改后续编辑的上下文。
死信队列的工作原理是什么?
在大多数情况下,死信队列(DLQ)的工作方式与普通消息队列相似。它会存储错误的消息,直到您对其进行处理以调查错误原因为止。
接下来,我们将讨论 DLQ 的再驱动策略,以及消息如何移入和移出 DLQ。
创建再驱动策略
软件通过参考再驱动策略,将消息移至死信队列。再驱动策略由很多规则组成,这些规则确定软件应何时将消息移至死信队列。再驱动策略主要通过定义最大重试次数来调节源队列与死信队列之间的交互方式。
例如,如果您的开发人员将最大重试次数设置为 1,则系统会在尝试 1 次后将所有未成功的传递移至 DLQ。某些传递失败可能是由临时网络过载或软件问题造成的。这会将很多未传递的消息发送到 DLQ。为了获得适当平衡,开发人员可以优化最大重试次数,以确保软件在将消息移至 DLQ 之前执行足够的重试次数。
将消息移入死信队列
发件人和接收器之间的传递尝试可能会由于多种原因而失败:
- 接收器无法接收消息,因为消息不存在。
- 消息包含错误。
- 消息超过队列或消息长度限制。例如,某些接收器无法处理超过特定大小的消息。
- 消息的生存时间(TTL)已过期。TTL 是一个值,表示特定数据包在网络上有效的时间长度。
将消息移出死信队列
当消息移入死信队列时,开发人员会检查错误的消息以确定原因。DLQ 中的消息可能包含宝贵见解,能够防止将来再次出现类似问题。在开发人员分析并修复问题后,系统会将这些消息移出 DLQ 并移入源队列。这将允许发件人继续处理这些消息。
AWS 如何支持您的死信队列需求?
Amazon Simple Queue Service(Amazon SQS)提供了一种可扩展的方法,用于在分布式系统之间大规模地交换消息。开发人员使用 Amazon SQS 构建包含完全托管的标准队列和先进先出(FIFO)队列的可靠 Web 应用程序。
下面是 Amazon SQS 的其他优势:
- Amazon SQS 允许系统创建任意数量的消息队列
- 开发人员可以批量传输消息以实现成本效益
- Amazon SQS 支持消息锁定,从而防止多台计算机同时处理同一消息
立即创建 AWS 账户,开始使用 Amazon Web Services(AWS)。