首页 > 解决方案 > 是否可以多次从 AWS SQS 加载相同的消息

问题描述

我有一个 SQS FIFO 队列,我们​​发送一堆 id 以在另一端进行处理。我们有 4 名工人在消化消息。一旦 worker 接收到消息,它会删除 msg 并存储这些 id,直到它在执行操作之前达到限制。

我注意到的是,当每个 id 只发送一次时,一些 id 会被多次接收。正常吗?

标签: amazon-web-servicesamazon-sqs

解决方案


您当前的流程似乎是:

  • 工作人员从队列中拉(接收)消息
  • 它删除消息
  • 它对消息执行操作

这不是使用队列的推荐方式,因为工作人员可能在删除消息之后但在完成操作之前失败。因此,该消息将“丢失”。

使用队列的推荐方法是:

  • 从队列中拉出一条消息(使消息暂时不可见)
  • 处理消息
  • 删除消息

这样,如果worker在处理消息时失败了,它会在隐身期过后自动“重新出现”在队列中。工作人员还可以发送“仍在工作”信号,以使消息在处理过程中更长时间不可见。

Amazon SQS FIFO 队列提供一次性处理。这意味着一条消息只会被传递一次。(但是,如果在消息被删除之前隐身期到期,则会再次提供。)

您说“某些 id 被多次接收”。我建议添加调试代码以尝试了解发生这种情况的情况,因为如果在不可见期间删除消息,则不应该发生这种情况。


推荐阅读