Как отобразить страницу "ваш платеж обрабатывается..." пользователю во время обработки транзакции в фоновом режиме?


Я управляю интернет-магазином, который испытывает очень острый трафик. Недавно вся система остановилась во время большого события продажи, потому что платежный шлюз имел какую-то проблему, и ответы от их API заняли 17 секунд, чтобы ответить вместо обычных 2-3 секунд. Сотни людей пытались сделать покупки одновременно. Это привело к тому, что все рабочие веб-потоки на каждом веб-сервере в производственном кластере были связаны ожиданием ответов API от платежный шлюз. Весь производственный кластер был заперт и не мог обслуживать ни одной страницы.

Одним из решений этой проблемы было бы использование Resque для обработки платежей в фоновом режиме. Веб-серверы немедленно возвращали ответ пользователю, который говорил что-то вроде: "ваш платеж обрабатывается...- Веб-сервер сможет перейти к следующему веб-запросу.

Проблема заключается в продолжении проверки после обработки платежа. Я не могу использовать AJAX чтобы проверить, завершена ли транзакция, потому что многие клиенты не имеют JavaScript. Я не могу на это положиться. Я не хочу использовать JavaScript или любую другую технологию push-сервера с низким уровнем надежности, потому что это создало бы дорогостоящую проблему поддержки клиентов, если бы процент возвратов был остановлен на обработке...' страница.

Как я могу спроектировать поток страниц, чтобы транзакции могли обрабатываться в фоновом режиме, надежно?

4 3

4 ответа:

Найдите решение на основе событий (EventMachine, например) и попросите его обработать эти запросы. Стандартные серверы RoR все рухнут в этом сценарии. Какая-то внутренняя обработка с javascript, безусловно, самый простой способ решить эту проблему, но если это не вариант, я бы изучил перемещение этого потока в нечто, что лучше разработано для обработки таких вещей, как API, которые не отвечают вечно.

Ты пробовал Гирмана?

Http://gearman.org/

Я знаю, что вы сказали, что не можете полагаться на клиентов с включенным Javascript, но я не думаю, что это элегантно-пытаться достичь этого без клиентских сценариев.

  1. Можно, например, заставить пользователя постоянно нажимать кнопку обновить, чтобы сгенерировать HTTP-запрос на возврат статуса платежной транзакции с сервера ("обработка", "успешно" или "не удалось") до тех пор, пока она не будет завершена, но это неудобно.

  2. Или, для немного лучшего опыт использования мета инструкция, обновить, чтобы автоматизировать обновление, но он по-прежнему делает ваш сайт выглядеть старомодно:

  3. Но я бы предпочел вместо этого использовать поведение клиента. Используйте его, чтобы немедленно изменить дисплей. Используйте библиотеку AJAX по вашему выбору, JQuery или просто Javascript. Манипулируйте DOM, чтобы показать только" обработку " messsage. Или, если вы оставите существующее элементы страницы там, убедитесь, что каждая кнопка или другая отправляемая часть формы отключена, чтобы предотвратить двойные клики пользователем. И предупредите пользователя, что оплата займет несколько секунд. Когда платеж будет обработан, HTTP-ответ поступит на экран прогресса, чтобы показать, что произошел сбой платежа или успех.

Все эти подходы должны свести на нет ваши опасения по поводу времени, затраченного платежным сервером на обработку транзакции. Если есть проблема на ваша серверная сторона тогда это другая проблема, которую нужно решить.

Да. Ответьте: "в процессе, мы вышлем вам подтверждение по электронной почте."Пусть фоновый процесс отправит электронное письмо со ссылкой, а также отметит запись, которая указывает на результат. После этого клиент может проверить назад, или ждать электронную почту и проверить назад.

Все, что вы делаете с AJAX, свяжет сервер, отвечающий на запрос AJAX. Та же проблема. Если только запрос не является простым опросом для получения результата на некоторой" достаточно низкой, но не слишком низкой " частоте. Опрос уродливее, чем уведомление.