Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 Lambda是否需要在处理后从SQS队列中删除消息?_Amazon Web Services_Aws Lambda_Aws Sdk_Amazon Sqs - Fatal编程技术网

Amazon web services Lambda是否需要在处理后从SQS队列中删除消息?

Amazon web services Lambda是否需要在处理后从SQS队列中删除消息?,amazon-web-services,aws-lambda,aws-sdk,amazon-sqs,Amazon Web Services,Aws Lambda,Aws Sdk,Amazon Sqs,我在这里查看AWS SQS文档: 我的理解是,我们需要在处理完消息后使用AmazonSQSClient.DeleteMessage()删除该消息,但是当我们使用SQS触发的Lambda时,这是必要的吗 我正在使用一个由SQSEvent触发的Lambda函数进行测试,除非我弄错了,否则如果Lambda函数运行到完成时没有抛出任何错误,则消息不会返回到SQS队列。如果这是真的,我宁愿避免对AmazonSQSClient.DeleteMessage()进行不必要的调用 2019年的一个类似问题,上面的

我在这里查看AWS SQS文档:

我的理解是,我们需要在处理完消息后使用
AmazonSQSClient.DeleteMessage()
删除该消息,但是当我们使用SQS触发的Lambda时,这是必要的吗

我正在使用一个由
SQSEvent
触发的Lambda函数进行测试,除非我弄错了,否则如果Lambda函数运行到完成时没有抛出任何错误,则消息不会返回到SQS队列。如果这是真的,我宁愿避免对
AmazonSQSClient.DeleteMessage()
进行不必要的调用

2019年的一个类似问题,上面的答案是SDK不会自动删除消息,需要在代码中显式删除消息。我想知道从那以后是否有什么变化


想法?

Amazon SQS在为您检索邮件后不会自动删除邮件,以防您无法成功接收邮件(例如,如果消费者失败或您失去连接)。要删除邮件,您必须发送一个单独的请求,确认您已成功接收和处理邮件


这一点没有改变,将来也可能不会改变,因为SQS无法在所有情况下确定消息是否已成功处理。如果SQS开始“假设”下游发生的情况,则在许多情况下,它有可能变得不可靠。

亚马逊SQS不会在为您检索消息后自动删除消息,以防您无法成功接收消息(例如,如果消费者失败或您失去连接)。要删除邮件,您必须发送一个单独的请求,确认您已成功接收和处理邮件


这一点没有改变,将来也可能不会改变,因为SQS无法在所有情况下确定消息是否已成功处理。如果SQS开始“假设”下游发生的情况,则在许多情况下,它有可能变得不可靠。

是的,否则下次您请求一组消息时,您将收到相同的消息-可能不会在下一次呼叫中收到,但最终您会收到。您可能不想一次又一次地处理同一组消息。

是的,否则下次您请求一组消息时,您会收到相同的消息-可能不会在下次通话中收到,但最终您会收到。您可能不想一次又一次地处理同一组消息。

这里的关键是您正在使用AWS Lambda与SQS的集成。在这种情况下,AWS Lambda处理从队列中检索消息(通过
事件
对象使消息可用),并在Lambda函数返回成功状态时自动从队列中删除消息。如果Lambda函数抛出错误,它将不会从队列中删除消息


当使用AWS Lambda与SQS集成时,您根本不应该使用AWS SDK与SQS队列交互。

这里的关键是您使用AWS Lambda与SQS集成。在这种情况下,AWS Lambda处理从队列中检索消息(通过
事件
对象使消息可用),并在Lambda函数返回成功状态时自动从队列中删除消息。如果Lambda函数抛出错误,它将不会从队列中删除消息


当使用AWS Lambda与SQS集成时,您根本不应该使用AWS SDK与SQS队列交互。

关于术语的次要说明。如果Lambda函数无法处理SQS消息,则这些消息不会返回到SQS队列。相反,它们再次变得可见(一旦它们的可见性超时发生)。这些消息从未离开SQS队列。关于术语的小注释。如果Lambda函数无法处理SQS消息,则这些消息不会返回到SQS队列。相反,它们再次变得可见(一旦它们的可见性超时发生)。这些消息从未离开SQS队列。对您来说,假设批处理成功。是的,对于Lambda函数,服务负责DeleteMessage调用。但是,在任何情况下,队列本身都不会做出任何假设,必须显式删除消息。对您来说,假设批处理成功。是的,对于Lambda函数,服务负责DeleteMessage调用。但是,在任何情况下,队列本身都不会做出任何假设,必须显式删除消息。有一种情况下,您可能希望Lambda直接与SQS交互,即如果您正在处理一批消息,并且为处理这些消息的某个子集的潜在故障做准备,您希望确保成功处理的消息不会在SQS中再次可见。您的Lambda函数可以显式删除每个SQS消息,因为在本例中成功处理了这些消息。或者,您可以使用中间件(例如)来为您执行此操作。有一种情况下,您可能希望Lambda直接与SQS交互,即如果您正在处理一批消息,并且为处理这些消息的某个子集的潜在故障做准备,您希望确保成功处理的消息不会在SQS中再次可见。您的Lambda函数可以显式删除每个SQS消息,因为在本例中成功处理了这些消息。或者,您可以使用中间件,例如,来为您执行此操作。