Что такое стандартный алгоритм повторов для обработки ошибок сервера? - PullRequest
1 голос
/ 14 января 2011

Я использую PHP SDK Amazon Web Services для их Гибкой системы платежей.Где-то в своей документации по API они, по сути, указывают, что время от времени могут быть ошибки на их конце, которые должны обрабатываться с вашей стороны «стандартным алгоритмом повтора».

В моем конкретном случае использованиямы говорим об отмене пользовательского платежного токена только после того, как новый платежный токен был успешным.То есть кто-то хочет изменить сумму пожертвования с 5 до 10 долларов.После завершения конвейера пользователь перенаправляется на URL обратного вызова.Этот сценарий попытается отменить предыдущий токен, а затем обновит новый токен, чтобы показать, что он авторизован.

Однако, если при отмене предыдущей транзакции пользователя возникает ошибка, новая транзакция все еще должна бытьобновлено.И затем мы приходим к нашей проблеме: у пользователя теперь есть ДВА токена оплаты, и с него будет снята сумма в размере 15 долларов США, если только первый токен не будет успешно отменен.такого характера?Я думал о запуске задания cron, которое просто ищет дубликаты токенов и отменяет предыдущие, но это немного хак, ИМХО.

Есть мысли?

1 Ответ

2 голосов
/ 14 января 2011

Обычный подход - это экспоненциальный откат - если вы потерпите неудачу, повторите попытку через одну секунду, затем через две, затем четыре и т. Д. С некоторым разумным ограничением (несколько часов), чтобы не тратить часы на ожидание. Это не должно происходить синхронно .Вы можете использовать какой-либо сервер очереди задач (RabbitMQ, Celery и т. Д.), Например, для запуска такой задачи в фоновом режиме.Вероятно, вы все равно должны выполнять платежные операции асинхронно, хотя, возможно, что они могут занять много времени.

Однако из моего прочтения API гибких платежей Amazon это не так.Это очень критичная по времени операция - если оставить маркер отправителя без ответа, у вас есть опция для инициирования платежа, но это не происходит автоматически.Таким образом, более простой подход может работать.Например, попробуйте отменить его сразу после получения нового токена.Если это не помогло, попробуйте еще раз в часовом задании cron.

Обратите внимание, конечно, что важно отслеживать, какой токен оплаты использовать.Предполагая, что вы используете ACID-совместимую базу данных (а вы действительно, ДЕЙСТВИТЕЛЬНО должны быть при работе с деньгами), это достаточно просто сделать - сохранить самый последний платежный токен у самого пользователя, а затем создать отдельную таблицу для хранения списка.токенов, срок действия которых истекаетЗатем просто обновите токен пользователя и добавьте старый токен в таблицу очистки за одну транзакцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...