【发布时间】:2018-04-22 04:32:31
【问题描述】:
我有两个 lambda 实例同时运行,这两个实例将对同一个 FIFO 队列进行一次短轮询,仅相隔几秒钟。
第一个实例将收到前 10 条消息,第二个实例将收到 0 条消息,即使队列中总共有 15 条消息。
为什么第二个实例不能从队列中获取剩余的 5 条消息?这是预期的行为吗?我该如何克服它?
【问题讨论】:
标签: java lambda aws-lambda amazon-sqs
我有两个 lambda 实例同时运行,这两个实例将对同一个 FIFO 队列进行一次短轮询,仅相隔几秒钟。
第一个实例将收到前 10 条消息,第二个实例将收到 0 条消息,即使队列中总共有 15 条消息。
为什么第二个实例不能从队列中获取剩余的 5 条消息?这是预期的行为吗?我该如何克服它?
【问题讨论】:
标签: java lambda aws-lambda amazon-sqs
您的 15 条消息(很可能)都属于同一个消息组 ID。因此,在前 10 个被成功处理和删除之前,剩余的 5 个不会对您的消费者可用。对于 FIFO 队列,这是保持消息顺序的预期行为(为 @Michael-sqlbot 指出正确的方向,下面的 cmets 给出了正确的答案)。
将long polling 用于标准队列。短轮询不会检查每个 SQS 服务器,因此,它有可能无法获得所有结果。长轮询会检查所有 SQS 服务器,因此会得到所有结果。
【讨论】:
setWaitTimeSeconds 的值设置为 20 秒,并根据它轮询了 20 秒的日志,但在第二个 lambda 实例上没有检索到任何消息。
ReceiveMessageWaitTimeSeconds 属性?