什么是处理服务器错误的标准重试算法?

时间:2011-01-14 03:17:31

标签: php amazon-web-services

我正在将Amazon Web Services的PHP SDK用于其灵活支付系统。在他们的API文档的某处,他们基本上指出,有时可能会出现错误,应该使用“标准重试算法”来处理。

在我的特定用例中,我们讨论的是仅在新的付款令牌成功后取消用户的付款令牌。也就是说,有人想将捐款金额从5美元改为10美元。完成管道后,用户将被重定向到回调URL。此脚本将尝试取消先前的令牌,然后更新新令牌以显示它已被授权。

但是,如果在取消用户的早期事务时发生错误,则仍需要更新新事务。然后我们就会遇到问题:用户现在有两个付款代币,除非第一个代币成功取消,否则将收取15美元的费用。

那么处理这种性质的东西是什么样的“标准重试算法”?我正在考虑运行一个只需要查找重复令牌的cron作业并取消之前的令牌,但这有点像黑客恕我直言。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

通常的方法是指数退避 - 如果你失败了,请在一秒钟内重试,然后是两次,然后是四次等等,并有一些合理的上限(几个小时)以确保你不会花费数小时等待。 这不需要同步发生。例如,您可以使用某种任务队列服务器(RabbitMQ,Celery等)在后台启动此类任务。不过,您可能应该以异步方式进行付款操作,因为they may take a long time.可能

但是,从我阅读的Amazon Flexible Payments API来看,这不是一个非常关键的时间操作 - 保留发件人令牌不被取消只是为您提供选项来启动付款,但不会t自动这样做。因此,更简单的方法可以工作。例如,尝试在获取新令牌后立即取消它。如果失败了,那么再按一小时的cron工作再试一次。

当然,请注意,跟踪要使用的付款令牌非常重要。假设您正在使用符合ACID标准的数据库(并且您真的,真的应该在使用钱时),这很简单 - 将最新的支付令牌保留在用户自己身上,然后创建一个单独的表来保存列表即将过期的代币。然后只需更新用户令牌,并在单个事务中将旧令牌添加到清除表中。