首页 > 解决方案 > AWS SQS 重新处理正在进行的消息

问题描述

我有一个文件阅读器,可以将 CSV 的每一行放入 SQS;订阅了一个 .Net lambda 函数以接收每一行并单独处理它。

当一个项目完成处理(大约 1-3 秒)时,它会从队列中删除。

一旦处理了一行,它就会向系统的另一个区域发送一个数据包,但我在日志中看到的是我们正在从函数接收重复的数据包。

由于 lambda 函数同时运行;我的工作理论是,当一个函数可用于消费另一个项目时,队列项目仍在运行中 - 因此它会消费一个已经被处理的项目。

由于删除操作最后发生,我的解决方案是将删除操作移到函数的开头。

但是我担心这是否明智,好像函数在处理过程中挂起或超时,我们将完全丢失数据包。另外,如果我从队列中删除该项目;一旦解析了消息中的数据,该函数是否能够继续?

所以我的问题分为两部分

  1. 订阅 SQS 的 lambda 函数是否有可能在同一函数的另一个实例已经在处理它时接收飞行中的消息?
  2. 一旦该功能拿起它,我删除队列项目是否有任何潜在问题

标签: .netamazon-web-services.net-coreamazon-sqs

解决方案


尽量避免这样的解决方案。您的函数可能会抛出异常或由于 lambda 的 5 分钟限制而被杀死,您将丢失消息

相反,我会尝试根据您的函数处理消息(或消息)所需的时间来调整可见性超时。另一方面,您可以减少听众每次阅读的消息数量(默认为 10)。因此,它会减少处理的总时间,并且处理时间将小于 visibilityTimeout(或默认情况下超时)如果您无法预测需要多少时间来处理消息,您可以在收到消息后调整(延长)visibilityTimeout .

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html


推荐阅读