管理AWS SQS和DLQ

时间:2018-07-20 11:11:45

标签: python amazon-web-services aws-lambda amazon-sqs

场景:

创建一个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中的所有消息。

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

1 个答案:

答案 0 :(得分:0)

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

我建议:

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

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