当前位置: 首页 > 知识库问答 >
问题:

SQS队列/可见性超时/消息组

法兴德
2023-03-14

我是AWS的新手。我在这里试图理解SQS。我也看了一些培训,但我仍然不能得到一些答案那里的讨论论坛。我在这里重复我的问题。注意,我知道下面的几个问题有明显的答案,因此更多的是一种修辞。我的困惑源于这样一个事实,即我目前对这个主题的理解导致我对在明显已知的问题之后出现在我脑海中的后续问题给出了相互矛盾的答案,并且夺走了我认为我理解得很好的任何东西的信心。

如果我有一个名为MyQueue的标准队列,并且有100条消息,如果这个队列有两个完全独立的应用程序(作为使用者;注意,它们不是像您在Kafka中那样的相同应用程序的使用者组;相反,它们是两个独立的应用程序),那么使用者可能会收到

(i)出现故障的电文和

(ii)电文的多份副本

Q1:这两个应用程序会分别接收100条消息吗?还是一个用户可以使用的消息永远不会传递给另一个用户?如果后者为真(没有网络问题、交货不按顺序、多次交货),则:

  1. SNS-SQS扇出是否是确保同一消息由多个使用者处理的方法?
  2. 使用者是否应该在处理后从队列中删除消息?因此,如果一个消息被处理器拾取,并且在处理发生时它进入可见性超时,然后即使在可见性超时之前处理完成之后它也没有被使用者删除,那么该消息是否会重新出现给其他可能使用它的使用者呢?如果是这样的话,那么FIFO队列不也同样适用吗?

其他问题:

Q2:可见性超时是否同时适用于标准队列和FIFO队列?如果它也适用于保证只传递一次的FIFO队列,那么,如果可见性超时出现在使用者结束处理消息之前,那么它再次出现在队列中,只是再次传递,从而返回到至少一次处理。有人能证实吗?

Q3:什么是FIFO队列中的多个消息组?它们就像队列的分区吗?

共有1个答案

邹正阳
2023-03-14

问:这两个应用程序会分别接收100条消息吗?

使用者每次API调用最多可以请求10条消息。这些将变得“无形”,不会提供给其他消费者。(实际上,一个消息可能被提供给多个使用者的可能性很小。这种情况很少见,但也有可能发生。如果这对您的用例不利,那么您应该在数据库中跟踪消息,以确保每个消息只被处理一次。)

想要一条消息被‘多个消费者’消费是非常奇怪的。通常的愿望是处理每条消息一次。如果您确实希望一个消息由多个使用者处理,那么,是的,您可以将消息发送到SNS,然后SNS可以将其发送到多个队列。

问:消费者是否应该在处理完后从队列中删除消息?

是的。Amazon SQS不知道消息何时被处理。使用者必须通过接收消息时提供的ReceiptHandle删除消息。如果消息超时,而另一个使用者接收到它,SQS将提供一个不同的ReceiptHandle,以便它知道是哪个进程请求了删除。

这也适用于FIFO队列。

问:可见性超时是否同时适用于标准队列和FIFO队列?

是的。如果可见性超时过期,消息将提供给另一个使用者。“精确一次传递”避免了上面提到的一个标准队列中的消息可能被提供多次的罕见情况。但是,如果可见性超时,即使在FIFO队列中也是如此,那么它将故意在队列中再次可见。

问:什么是FIFO队列中的多个消息组?它们就像队列的分区吗?

消息组是对必须按顺序传递的消息进行分组的一种方式。

假设有两个消息组,AB,它们按以下顺序发送消息:A1,B1,A2,B2

即使A1尚未删除,也可以提供消息B1。但是,在删除A1之前,不会提供消息A2。把它们想象成‘迷你队列’。这允许处理许多不相关的消息,而不必等待所有先前的消息被删除。

请参见:使用Amazon SQS消息组ID-Amazon Simple Queue Service

 类似资料:
  • 编辑:在我写的时候解决了这个问题:P--我喜欢这样的解决方案。我想无论如何我都要把它贴出来,也许别人也会有同样的问题,找到我的解决办法。不关心点数/因果报应等等。我只是把整个事情写了出来,所以我想我应该把它和解决方案贴出来。 我有一个SQS FIFO队列。它使用的是一纸空文队列。以下是它的配置方式: 我有一个单一的生产者微服务,我有10个ECS映像运行作为消费者。 由于业务原因,我们在接近消息在队

  • 在AWS SQS FIFO的队列中;当读取消息的可见性超时时,队列的哪个位置将是消息? 例如: [A,B]按顺序排列 我从队列中读到一条消息,因此得到消息“a” 消息“A”的可见性超时过期,消费者可以再次使用该消息 消息的新顺序是什么? a)[A, B, C, D] b)[B, C, D, A]

  • 在使用AWS SQS时,消息的“SentTimestamp”属性是否在从队列接收后发生变化,但在可见性超时到期后没有删除并返回队列?

  • 我有一个简单的Spring Boot服务,它使用JMSTemplate监听AWS SQS队列。当消息得到正确处理时,一切都按预期进行。 我使用的是CLIENT_ACKNOWLEDGE,因此当处理过程中抛出异常时,会再次接收消息。但是,将忽略SQS队列上的默认可见性超时设置,并立即再次接收消息。 SQS队列配置了30秒的默认可见性超时和20次接收的重新驱动策略,然后再将消息放入DLQ。 我已禁用该服

  • 我对SQS非常陌生,如果我忽略了一些显而易见的事情,我很抱歉,但是有没有办法获取SQS中消息的当前可见性超时?我可以在这里看到如何更新超时可见性。但是我没有看到任何关于获取消息当前可见性超时的信息(也许你可以在收到消息时查看)。 我的用例是根据给定消息的当前可见性超时更改可见性超时。这可能吗? (注意:我知道我可以使用近似的接收时间来达到类似的效果,如果不可能获得当前可见性时间,我会走那条路)

  • 有一个SQS队列,我在其中不断收到消息。我只需要阅读和处理过去24小时内收到的信息。目前收到的信息应在第二天处理<代码>时间戳存储在消息正文中。 是否可以从SQS队列中选择性地读取消息。例如,只读那些值大于前一天的时间戳但小于当前时间戳(当前时间戳是此作业运行的时间)的消息?