Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services SQS的近似计算精度如何_Amazon Web Services_Amazon Sqs - Fatal编程技术网

Amazon web services SQS的近似计算精度如何

Amazon web services SQS的近似计算精度如何,amazon-web-services,amazon-sqs,Amazon Web Services,Amazon Sqs,我有一个系统,其中多个工人并行地从标准SQS队列消费 我注意到,当我有相对较多的消息(即300万条)时,我最后处理的总数总是比消息总数多出几条消息(大约30条)。(增加0.001%~0.002%) 我怀疑这是因为“至少一次”交付: 亚马逊文档:即使你删除了一条消息,你也有可能收到它。如果您请求删除邮件时,其中一台存储邮件副本的服务器不可用,则这种情况可能很少发生。副本保留在服务器上,并可能在后续接收请求时再次返回给您。您应该将系统创建为幂等的,以便多次接收特定消息不是问题 因此,我想使用“App

我有一个系统,其中多个工人并行地从标准SQS队列消费

我注意到,当我有相对较多的消息(即300万条)时,我最后处理的总数总是比消息总数多出几条消息(大约30条)。(增加0.001%~0.002%)

我怀疑这是因为“至少一次”交付:

亚马逊文档:即使你删除了一条消息,你也有可能收到它。如果您请求删除邮件时,其中一台存储邮件副本的服务器不可用,则这种情况可能很少发生。副本保留在服务器上,并可能在后续接收请求时再次返回给您。您应该将系统创建为幂等的,以便多次接收特定消息不是问题

因此,我想使用“ApproxiateReceiveCount”来确定我的消息在处理之前是否已被处理:

(Worker pseudocode)

List messages = sqs.receiveMessage()
for m in messages:
   if m.approximateReceiveCount > 1 then
      skip process
   else
      process as usual
end
我想知道这个“近似接收计数”有多准确,让重复数据消除逻辑依赖于它是否是一个好主意

请注意:


我已经设置了一个死信队列来处理任何超过“默认可见性超时”(设置为1h)的消息。由于没有将任何消息放回死信,因此我假设额外计数不是由于此“超时”效应。

您无法可靠地使用
approximateReceiveCount
属性来消除重复消息。因为如果您收到一条消息,然后失败,则您的
approximateReceiveCount
可能为1,但该消息仍需要再次处理

使用SQS时,最佳实践是确保您的SQS消息处理是正确的。这意味着多次处理同一消息将产生相同的结果

这意味着什么完全取决于您的业务逻辑

  • 您可以跟踪SQS消息ID,以确定它们是否已被处理
  • 或者,您可以在消息中使用其他ID来确定消息是否已被处理
  • 或者您可以多次处理数据,每次都会得到相同的结果
  • 由于处理、跟踪和可能的故障之间可能存在竞争条件,解决方案1或2可能难以可靠实施

    解决方案3可能是最好的,因为在处理失败的情况下,您可能无法以事务方式执行1或2

    解决方案1或2的问题

    例1:

    假设您的逻辑如下:

  • 从队列接收消息
  • 处理消息
  • 记录重复数据消除的消息
  • 从队列中删除消息
  • 但是,如果在步骤2和3之间失败,或者在步骤2和3之间另一个处理器再次收到该消息,则重复数据消除逻辑失败

    例2:

    或者,假设您的逻辑如下:

  • 从队列接收消息
  • 记录重复数据消除的消息
  • 处理消息
  • 从队列中删除消息

  • 现在,如果您在步骤2之后或步骤3期间失败(意味着处理永远不会正确完成),则您将永远无法获得对消息的另一次正确处理。

    它不够准确,无法将重复数据消除逻辑建立在它的基础上。这就是为什么它被称为“近似值”。重复数据消除逻辑的最佳选择是对照DynamoDB表等具有强一致读取和条件写入的内容检查SQS消息ID。超过可见性超时确实会将消息丢弃到DLQ,但只有在最后一次发生这种情况时,消息超出了使用DLQ设置配置的接收次数。@Michael sqlbot max receive设置为1如果您收到消息,并且没有删除它,则在可视性超时过期后,它应显示在DLQ中。我有一个理论:当您的消费者两次收到同一消息时,他们也得到了同样的近似计数?如果是这样的话,那就是找到并丢弃重复的sidempotent的方法,事实上,这是唯一真正正确的答案。如果(在某些情况下)您实际使用了FIFO队列,FIFO队列具有更好的保护,以防止消息的错误处理,包括在接收过程中发生的错误,否则,当您从未实际看到消息时,可能会导致接收计数>1,但即便如此,这个答案基本上仍然是正确的。我有一个理论:当你的消费者两次收到相同的信息时,他们是否也会得到相同的近似接受计数?如果是这样,这就是查找和丢弃重复项的方法