【问题标题】:Executing receiveMessageRequest to the same SQS FIFO queue对同一个 SQS FIFO 队列执行 receiveMessageRequest
【发布时间】:2018-04-22 04:32:31
【问题描述】:

我有两个 lambda 实例同时运行,这两个实例将对同一个 FIFO 队列进行一次短轮询,仅相隔几秒钟。

第一个实例将收到前 10 条消息,第二个实例将收到 0 条消息,即使队列中总共有 15 条消息。

为什么第二个实例不能从队列中获取剩余的 5 条消息?这是预期的行为吗?我该如何克服它?

【问题讨论】:

    标签: java lambda aws-lambda amazon-sqs


    【解决方案1】:

    您的 15 条消息(很可能)都属于同一个消息组 ID。因此,在前 10 个被成功处理和删除之前,剩余的 5 个不会对您的消费者可用。对于 FIFO 队列,这是保持消息顺序的预期行为(为 @Michael-sqlbot 指出正确的方向,下面的 cmets 给出了正确的答案)。

    long polling 用于标准队列。短轮询不会检查每个 SQS 服务器,因此,它有可能无法获得所有结果。长轮询会检查所有 SQS 服务器,因此会得到所有结果。

    【讨论】:

    • 感谢您的回复。我已经尝试过这样做。我将setWaitTimeSeconds 的值设置为 20 秒,并根据它轮询了 20 秒的日志,但在第二个 lambda 实例上没有检索到任何消息。
    • 很公平,理论上应该这样做。您是否尝试在队列本身上设置 ReceiveMessageWaitTimeSeconds 属性?
    • @StevenS。你的答案是完全正确的,但这是一个先进先出队列。如果消息都在一个组中,则这是 FIFO 队列的正确行为。允许另一个消费者拥有来自同一组的消息将违反 FIFO。
    • @Michael-sqlbot 好的,所以丢失的 5 条消息具有相同的消息组 ID,并且该组的前 10 条消息尚未成功处理和删除。如果它们是不同的消息组 ID,则第二个使用者可以处理它们,但由于它们不是,它们在前 10 个完成之前不会变得可用。
    • 史蒂文斯。和@Michael-sqlbo。感谢您的解释!我很快就会去尝试并在这里更新它。
    猜你喜欢
    • 2017-04-12
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2021-01-22
    相关资源
    最近更新 更多