标准SQS AWS队列,检查双重交付

问题描述 投票:0回答:3

AWS上标准SQS队列的文档说它可能偶尔会发送两次消息。

什么是检查这个的理想方式?我基本上有一个lambda设置,它由进入队列的项目激活。对项目进行一些计算,并将数据写回到DB中。

在再次写入数据之前,检查数据是否已写入数据库是否足够,因为之前已经传递了消息?

或者有更好的方式来做到这一点?

无论如何都有一个FIFO队列进入lambda?

amazon-web-services aws-lambda amazon-sqs
3个回答
0
投票

我遇到了类似的问题,并且能够通过验证dynamoDB中已经存在唯一消息标识符来解决此问题。如果它已经存在,则不会处理数据。如果密钥尚未存在,则将其存储在发电机中。到目前为止,您可以使用AWS dynamo DB流来执行通过AWS lambda使用新密钥保存dynamo之后需要完成的任何处理。


0
投票

有一些选项如下

  1. 最明显的是在消息中有一些唯一标识符,然后将它们存储在某些持久机制(理想情况下为DynamoDB)中,以便在处理每条消息之前进行检查。这样您就知道此消息是否已被处理。如果这是您决定的路由,那么您可以将该标识符作为消息属性的一部分而不是消息正文,这样您就不必解析整个正文以查看它是否重复 优点:处理消息是实时的 缺点:您需要在最后保留ID和重复数据删除的开销
  2. 第二种选择是使用FIFO队列,然后使用指定的时间表调度Lambda(使用AWS Cloudwatch Alarms)轮询FIFO队列,如果存在消息,则处理它们 优点:您可以节省在最后保留ID和重复数据删除的开销 缺点:不是实时的
  3. 第三个花哨的选项(仅仅因为你要求更高级的选项)是拥有2个SQS队列(1个标准和其他FIFO)并让你的消息生产者将消息放入两个SQS队列中。现在让你有基于标准队列的Lambda触发器,但是当调用Lambda时,从FIFO队列中读取消息。这样,如果Lambda被触发重复消息,那么对于那个Lambda调用,FIFO队列中没有任何东西可用,你就不做任何处理 优点:处理乱码是实时您没有维护唯一ID的麻烦 缺点:2个队列

0
投票

对于这样的问题,您可以尝试从服务中获得许多变通方法,例如检查重复的message_ids或为此目的维护两个队列。所有这些看似合法,但消耗额外的处理能力。一个好的解决方案是使用AWS SQS本身的内部功能。但是,它仍然不足以满足我们的要求。下面给出了一些可用于此目的的方法。

  1. SQS标准队列+ Lambda +数据库

这是您建议的方法,我们检查数据库中已处理的message_ids,并确保不处理相同的消息两次。确保为message_id列添加索引以便更快地进行检查。

  1. Message Publisher + SQS标准队列+ Lambda +数据库

在这里,您可以要求您的消息发布者确保不会将重复的消息发送到SQS。只有在您维护自己的发布服务时才可以执行此操作。如果您可以访问它,这可能是理想的解决方案。

  1. SQS标准队列+ EC2 +数据库

您可以使用EC2实例而不是lambda,以便可以在EC2中保存已处理的message_id。无论何时收到消息,这都将保存数据库I / O操作。缺点是您必须使用轮询和EC2成本比使用Lambda更多。

  1. SQS FIFO队列+ Lambda(或EC2)+数据库+轮询

您可以使用FIFO队列并强制执行一次处理,以确保不会将重复消息发送到SQS。这涉及Lambda(使用CloudWatch)或EC2实例轮询消息。这可能是性能密集型的,但我们可以强制执行我们的要求。

到目前为止,lambda触发仅在SQS标准队列中受支持。因此,选择FIFO不是一种选择。如果从实际角度来看,第二种选择将是理想的解决方案。它更容易和干净,而不是使整个建筑成为意大利面。希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.