我正在使用 Amazon SQS 实现一个任务队列(但我想这个问题适用于任何任务队列),根据工作已经重试多少次(将其移至不同的队列,增加可见性超时,发送警报..等)
跟踪失败的作业计数的最佳方法是什么?我想避免为工作保留一个集中的数据库:重试计数记录。我应该查看在队列中花费的时间而不是在监控过程中吗?IMO 充其量是丑陋或不干净的,迭代工作直到我找到古老的..
谢谢!安德拉斯
我正在使用 Amazon SQS 实现一个任务队列(但我想这个问题适用于任何任务队列),根据工作已经重试多少次(将其移至不同的队列,增加可见性超时,发送警报..等)
跟踪失败的作业计数的最佳方法是什么?我想避免为工作保留一个集中的数据库:重试计数记录。我应该查看在队列中花费的时间而不是在监控过程中吗?IMO 充其量是丑陋或不干净的,迭代工作直到我找到古老的..
谢谢!安德拉斯
还有另一种更简单的方法。通过您的消息,您可以请求 ApproximateReceiveCount 信息并以此为基础您的重试逻辑。这样您就不必将其保存在数据库中,并且可以根据消息本身进行计算。
http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html
我在将 SQS 与 SimpleDB 相结合方面取得了巨大成功。它是“集中式的”,但与 SQS 一样多。
每个作业都会在 simpleDB 中获得一条记录,在 SQS 中获得一个任务。您可以将任何您喜欢的信息放在 SimpleDB 中,例如作业创建时间。当工作人员从队列中拉出作业时,它可以从 simpleDB 中获取相应的记录以确定它的历史记录。您可以查看作业的年龄,以及尝试了多少次。完成后,您可以将工作人员数据添加到 SimpleDB 记录(完成时间、结果、日志、错误、堆栈跟踪等)并确认来自 SQS 的消息。
我更喜欢这种方法,因为它通过为失败的任务提供大量调试信息来帮助诊断故障。它还允许工作人员根据作业排队的时间、失败的次数等以不同的方式处理作业。
它还使您能够直接查询 SimpleDB 并计算每个任务的平均时间、失败率百分比等。
亚马逊刚刚发布了简单工作流服务 (swf),您可以将其视为 GAE 任务队列的更复杂/灵活的版本。
它可以让您监控您的任务(使用心跳)、配置重试策略并创建复杂的工作流程。它看起来很有希望抽象出任务的依赖关系、调度和任务容错(尤其是异步任务)
查看http://docs.amazonwebservices.com/amazonswf/latest/developerguide/swf-dg-intro-to-swf.html以获取概览。
SQS 代表“简单队列服务”,在概念上是该服务的错误名称。“队列”的首要特征是 FIFO(先进先出),而 SQS 缺乏这一点。只是想澄清一下。
此外,Azure 队列服务也缺少这一点。要获得最佳的云队列服务,请使用 Azure 的服务总线,因为它是一个真正的队列概念。