首页 > 解决方案 > 管理 AWS SQS 和 DLQ

问题描述

设想 :

创建一个 lambda,每当有消息到达 SQS(假设 SQS-A)时都会触发它。lambda(用 python 编写)负责将传入的有效负载发送到另一个端点。

问题是,每当目标端点或服务器关闭时,我试图将其放入另一个 SQS(假设为 SQS-B),如果出现其他异常而不是将其放入交易信队列中。

这里我想说两件事。

  1. 如果出现 ConnectionError(python 异常表示端点已关闭),我想停止 SQS-A(因为目标服务器已关闭,所以没有必要运行 lambda)。

(或者)

  1. 每当我收到此错误时,我都会将其发送到 SQS-B,我希望在第一个请求到来时触发 SQS-B,它应该检查是否仍然存在连接错误,它必须在 10 分钟后触发,然后再次检查,如果异常在 30 分钟后持续触发,像这样我想将时间增加到 4 小时,然后每 4 小时检查/触发 lambda。如果没有例外,那么它应该读取 SQS-B 中的所有消息。

帮助我如何实现任何一种方法或推荐任何其他更好的方法

标签: pythonamazon-web-servicesaws-lambdaamazon-sqs

解决方案


由于一个简单的问题(目标不可用),您正在创建一个复杂的架构。尽量不要使事情过于复杂。

我会推荐:

  • 让原始系统将消息发送到Amazon SNS 主题
  • 主题触发 Lambda 函数
    • 如果它成功处理了消息,则无需进一步操作
    • 如果远程终端节点不可用,则将消息放入Amazon SQS 队列以供以后处理
  • 使用 Amazon CloudWatch Events每n分钟触发一个 Lambda 函数,该函数抓取队列中的任何消息并尝试再次发送它们。如果远程端点仍处于关闭状态,它将退出并在n分钟后再次尝试该过程。
    • 如果消息超过几个小时,可能还值得向管理员发送电子邮件。

如果您必须将原始消息发送到 SQS 队列,那么您可以按照您的描述进行操作...首先发送到 Queue-A,这会触发 Lambda 函数。如果端点关闭,Lambda 会将消息发送到 Queue-B 以供以后处理。但是,仅每n分钟从 Queue-B 处理一次(而不是试图让每个单独的消息都有自己的延迟计时器)。


推荐阅读