SQS Lambda消费者和过滤器存在可能的错误吗?

0

【以下的问题经过翻译处理】 我已经配置了一个带有Lambda消费者的队列。Lambda触发器配置了一个过滤器,以仅处理队列中的某些消息:

"FilterCriteria": {
  "Filters": [
    {
      "Pattern": "{\"body\":{\"action\":[\"sample1\"]}}"
    }
  ]
}

当向队列发送匹配过滤器的消息时,没有问题,消息会被lambda函数消费并从队列中移除。

当发送不匹配过滤器{"action":"testing"}的消息时,消息不会被lambda函数消费(这是预期的),但消息会从队列中删除,不再可用于任何其他消费者。

当我们为Lambda函数配置maxConcurrency,情况会变得更糟:Lambda会消费部分消息,而一些消息(匹配过滤器)不会被消费,但仍会在SQS中被删除。

我是遇到了一个bug,还是对过滤器的工作方式存在误解?

profile picture
专家
已提问 5 个月前25 查看次数
1 回答
0

【以下的回答经过翻译处理】 首先,让我们了解一下 lambda 事件过滤器的设计初衷并不是多次过滤相同的消息,在每次成功的单次/批量调用后,消息都会被清除,除非您在处理突然出现的错误时显式地删除它们。

这样做是为了避免再次处理不匹配的消息,而且这样做可能会堵塞批量大小,导致 lambda 过滤器无休止地运行,无法在头部找到合适的记录进行处理。

你可能会问,我们为什么要使用这个过滤器,这是为了确保我们处理的是正确的消息以节省我们的计算时间和空间。因为 SQS 本身无法过滤。

此外,SQS 更适合于一个消费者类型的架构,如果你想有另一个消费者,最好有多个 SQS 队列。

要拥有单独的队列,您可以初始化创建一个具有相同payload的Event Bridge事件,然后使用Event Bridge规则 将消息移至正确的 SQS,并使用过滤模式和单次/批量调用策略。

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则