【问题标题】:AWS - SQS concurrencyAWS - SQS 并发
【发布时间】:2020-03-10 07:21:20
【问题描述】:

关于SQS消息并发的一个小问题。

场景
我创建了 3 分钟超时的 lambda。
此 lambda 由 SQS 服务触发(使用默认配置)。

当 SQS 触发我的 lambda 时,他等待 X 秒(不到 3 分钟)。
等待后,他再次运行相同的 lambda。

现在,我同时运行了两个 lambda。

对于这种情况,最终 - lambda_1 失败而 lambda_2 成功。

问题
SQS 消息从队列中删除?

成功的 lambda 从队列中删除消息。
失败的 lambda 会重试此消息。

我该如何控制并发问题?

谢谢。

【问题讨论】:

    标签: amazon-web-services concurrency amazon-sqs


    【解决方案1】:

    对于要从队列中删除的 SQS 消息,lambda 必须在成功处理后将其从队列中显式地delete。 (

    如果 lambda 在处理消息时失败,消息将在 message visibility 超时完成时返回到队列中(默认为 30 秒)。这样,它就有机会被 lambda 再次处理。

    在您的 SQS 队列设置中,您可以设置 Dead-Letter Queues 来存储尝试成功处理失败的消息。

    编辑:

    正如@michael-sqlbot 正确指出的那样,我的答案的第一部分是不正确的。当您的函数成功处理批处理时,Lambda 会从队列中删除其消息。

    要控制 lambda 并发使用 Reserved Concurrency 设置。

    【讨论】:

    • 好的,谢谢。据我了解,如果 SQS 从队列中唤醒两个具有相同消息的相同 lambda(因此 lambda 有 30(+-)秒延迟)。如果一个 lambda 成功而一个失败,则消息仍然在队列中,因为 lambda 失败。或者我很困惑,这不是相同的信息? (不同的id?)
    • @בני SQS 通常不会为同一消息调用两个函数(重复消息可能会发生,但很少发生)。 SQS 的全部目的是为单个消息提供一个生产者和一个消费者。
    • @בני 没​​问题。如果是这样,接受答案将不胜感激。
    • @Marcin 第一部分不正确。 Lambda 函数不需要删除消息。如果调用完成且未引发异常,则从队列中删除批处理中的消息。唯一需要从代码中删除消息的情况是,如果您正在批处理 n > 1 条消息,并且您希望在同一个函数调用中成功处理一些消息,而在其他一些消息上失败。 "When your function successfully processes a batch, Lambda deletes its messages from the queue."“Lambda”是指 Lambda 服务,而不是函数。
    • @Michael-sqlbot 谢谢。我相应地编辑了答案。
    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2020-07-21
    • 2019-04-24
    • 2020-05-17
    • 2021-12-16
    • 2019-05-14
    • 2020-07-28
    • 2018-12-23
    相关资源
    最近更新 更多