Java 对同一SQS FIFO队列执行receiveMessageRequest

Java 对同一SQS FIFO队列执行receiveMessageRequest,java,lambda,aws-lambda,amazon-sqs,Java,Lambda,Aws Lambda,Amazon Sqs,我有两个lambda实例同时运行,这两个实例将对同一FIFO队列进行短轮询,间隔仅几秒钟 第一个实例将接收前10条消息,第二个实例将接收0条消息,即使队列中总共有15条消息 为什么第二个实例不能从队列中获取剩余的5条消息?这是预期的行为吗?我如何克服它?您的15封邮件(很可能)都属于相同的邮件组ID。因此,在成功处理和删除前10封邮件之前,您的消费者将无法使用剩余的5封邮件。对于FIFO队列,这是保持消息顺序的预期行为(cheers@Michael sqlbot根据下面的评论指出了正确的答案方向

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

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

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

您的15封邮件(很可能)都属于相同的邮件组ID。因此,在成功处理和删除前10封邮件之前,您的消费者将无法使用剩余的5封邮件。对于FIFO队列,这是保持消息顺序的预期行为(cheers@Michael sqlbot根据下面的评论指出了正确的答案方向)

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

您的15封邮件(很可能)都属于相同的邮件组ID。因此,在成功处理并删除前10封邮件之前,其余5封邮件将不可供您的用户使用。对于FIFO队列,这是保持消息顺序的预期行为(cheers@Michael sqlbot根据下面的评论指出了正确的答案方向)


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

感谢您的回复。我已经试过了。我将
setWaitTimeSeconds
的值设置为20秒,并根据它轮询了20秒的日志,但在第二个lambda实例上没有检索到任何消息。这很公平,理论上应该可以做到。您是否尝试设置队列本身的
ReceiveMessageWaitTimeSeconds
属性?@StevenS。您的答案完全正确,但这是一个FIFO队列。如果消息都在一个组中,这是FIFO队列的正确行为。允许另一个消费者拥有来自同一组的消息将违反FIFO。@Michael sqlbot OK,因此丢失的5条消息具有相同的消息组ID,而该组的前10条消息尚未成功处理和删除。如果它们是不同的消息组ID,第二个消费者可以处理它们,但因为它们不是,所以在前10个完成之前,它们不可用。StevenS。还有@Michael sqlbo。谢谢你的解释!我很快就会去尝试,并在这里更新。谢谢你的回复。我已经试过了。我将
setWaitTimeSeconds
的值设置为20秒,并根据它轮询了20秒的日志,但在第二个lambda实例上没有检索到任何消息。这很公平,理论上应该可以做到。您是否尝试设置队列本身的
ReceiveMessageWaitTimeSeconds
属性?@StevenS。您的答案完全正确,但这是一个FIFO队列。如果消息都在一个组中,这是FIFO队列的正确行为。允许另一个消费者拥有来自同一组的消息将违反FIFO。@Michael sqlbot OK,因此丢失的5条消息具有相同的消息组ID,而该组的前10条消息尚未成功处理和删除。如果它们是不同的消息组ID,第二个消费者可以处理它们,但因为它们不是,所以在前10个完成之前,它们不可用。StevenS。还有@Michael sqlbo。谢谢你的解释!我很快就会去尝试,并在这里更新。