AWS上标准SQS队列的文档说它可能偶尔会发送两次消息。
什么是检查这个的理想方式?我基本上有一个lambda设置,它由进入队列的项目激活。对项目进行一些计算,并将数据写回到DB中。
在再次写入数据之前,检查数据是否已写入数据库是否足够,因为之前已经传递了消息?
或者有更好的方式来做到这一点?
无论如何都有一个FIFO队列进入lambda?
我遇到了类似的问题,并且能够通过验证dynamoDB中已经存在唯一消息标识符来解决此问题。如果它已经存在,则不会处理数据。如果密钥尚未存在,则将其存储在发电机中。到目前为止,您可以使用AWS dynamo DB流来执行通过AWS lambda使用新密钥保存dynamo之后需要完成的任何处理。
有一些选项如下
对于这样的问题,您可以尝试从服务中获得许多变通方法,例如检查重复的message_ids或为此目的维护两个队列。所有这些看似合法,但消耗额外的处理能力。一个好的解决方案是使用AWS SQS本身的内部功能。但是,它仍然不足以满足我们的要求。下面给出了一些可用于此目的的方法。
这是您建议的方法,我们检查数据库中已处理的message_ids,并确保不处理相同的消息两次。确保为message_id列添加索引以便更快地进行检查。
在这里,您可以要求您的消息发布者确保不会将重复的消息发送到SQS。只有在您维护自己的发布服务时才可以执行此操作。如果您可以访问它,这可能是理想的解决方案。
您可以使用EC2实例而不是lambda,以便可以在EC2中保存已处理的message_id。无论何时收到消息,这都将保存数据库I / O操作。缺点是您必须使用轮询和EC2成本比使用Lambda更多。
您可以使用FIFO队列并强制执行一次处理,以确保不会将重复消息发送到SQS。这涉及Lambda(使用CloudWatch)或EC2实例轮询消息。这可能是性能密集型的,但我们可以强制执行我们的要求。
到目前为止,lambda触发仅在SQS标准队列中受支持。因此,选择FIFO不是一种选择。如果从实际角度来看,第二种选择将是理想的解决方案。它更容易和干净,而不是使整个建筑成为意大利面。希望这可以帮助。