使用 AWS SQS 重试我的代码失败的消息

Retrying messages where my code fails with AWS SQS

我一直在尝试查找有关在我的代码失败时使用重试和错误队列而不是在我的应用程序中进行内存重试的更多信息。

这是我的场景:

我正在发送一条消息,内容大致如下:

“处理此任务的输出 - 它希望您使用此流的内容更新此 xml 文件”。

我有将输出写入 xml 文件的代码,但它 偶尔会失败并需要重试 因为我的 application/person 的另一部分可能当时正在使用该文件。

我想做的是说“每当输出代码失败时,重新发送告诉它开始输出的 SQS 消息process/send 一个具有相同信息的新消息。因此重试消息。”此外,一旦它重试并失败 100 次,我想将它移到错误队列中。

有谁知道这方面的任何实施方式吗?在我开始实施之前,我想看看已经完成的事情。

SQS 已经可以轻松完成您想要的一切:

您的代码应该将消息放入 "Process the output for this task - It want's you to update this xml file with the contents of this stream"

的队列中

您的工作任务轮询队列并获取消息并开始工作。我喜欢为此使用 windows 服务,但计时作业或计划任务也可以。

只有当工作人员成功完成任务时,它才会从队列中删除消息——这是工作人员作业在退出前应该做的最后一件事。它在获取消息时不会从队列中删除消息,它只会在成功处理消息时删除消息。

如果 worker 没有完成,因此消息仍在队列中,那么在可见性超时到期后,消息将自动重新进入队列(或更准确地说,再次在队列中可见)-你不需要把它放回队列中。

要实施 'fail after 100 tries',您需要设置一个 'Dead Letter Queue':http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/SQSDeadLetterQueue.html

你告诉它,如果一个工作任务已经请求该消息 100 次(可配置从 1 到 1000 次)并且没有成功处理它,那么自动将消息移动到指定的死信队列。

再简单不过了 - 只需单击几下鼠标,SQS 就会为您完成所有工作 - 您需要做的就是编写将原始消息放入第一个队列的代码,完成工作,然后从队列中删除消息 if/when 任务成功完成..