Amazon web services SQS的近似计算精度如何
我有一个系统,其中多个工人并行地从标准SQS队列消费 我注意到,当我有相对较多的消息(即300万条)时,我最后处理的总数总是比消息总数多出几条消息(大约30条)。(增加0.001%~0.002%) 我怀疑这是因为“至少一次”交付: 亚马逊文档:即使你删除了一条消息,你也有可能收到它。如果您请求删除邮件时,其中一台存储邮件副本的服务器不可用,则这种情况可能很少发生。副本保留在服务器上,并可能在后续接收请求时再次返回给您。您应该将系统创建为幂等的,以便多次接收特定消息不是问题 因此,我想使用“ApproxiateReceiveCount”来确定我的消息在处理之前是否已被处理:Amazon web services SQS的近似计算精度如何,amazon-web-services,amazon-sqs,Amazon Web Services,Amazon Sqs,我有一个系统,其中多个工人并行地从标准SQS队列消费 我注意到,当我有相对较多的消息(即300万条)时,我最后处理的总数总是比消息总数多出几条消息(大约30条)。(增加0.001%~0.002%) 我怀疑这是因为“至少一次”交付: 亚马逊文档:即使你删除了一条消息,你也有可能收到它。如果您请求删除邮件时,其中一台存储邮件副本的服务器不可用,则这种情况可能很少发生。副本保留在服务器上,并可能在后续接收请求时再次返回给您。您应该将系统创建为幂等的,以便多次接收特定消息不是问题 因此,我想使用“App
(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消息处理是正确的。这意味着多次处理同一消息将产生相同的结果
这意味着什么完全取决于您的业务逻辑
现在,如果您在步骤2之后或步骤3期间失败(意味着处理永远不会正确完成),则您将永远无法获得对消息的另一次正确处理。它不够准确,无法将重复数据消除逻辑建立在它的基础上。这就是为什么它被称为“近似值”。重复数据消除逻辑的最佳选择是对照DynamoDB表等具有强一致读取和条件写入的内容检查SQS消息ID。超过可见性超时确实会将消息丢弃到DLQ,但只有在最后一次发生这种情况时,消息超出了使用DLQ设置配置的接收次数。@Michael sqlbot max receive设置为1如果您收到消息,并且没有删除它,则在可视性超时过期后,它应显示在DLQ中。我有一个理论:当您的消费者两次收到同一消息时,他们也得到了同样的近似计数?如果是这样的话,那就是找到并丢弃重复的sidempotent的方法,事实上,这是唯一真正正确的答案。如果(在某些情况下)您实际使用了FIFO队列,FIFO队列具有更好的保护,以防止消息的错误处理,包括在接收过程中发生的错误,否则,当您从未实际看到消息时,可能会导致接收计数>1,但即便如此,这个答案基本上仍然是正确的。我有一个理论:当你的消费者两次收到相同的信息时,他们是否也会得到相同的近似接受计数?如果是这样,这就是查找和丢弃重复项的方法