2010-10-15 4 views
0

Представьте 3 системных компонента: 1. Внешняя электронная коммерция для обработки транзакций по кредитным картам 2. Локальная база данных для хранения результатов обработки 3. Локальный пользовательский интерфейс (или услуга выигрыша) для выполнения обработки платежей документ о заказе клиентаАрхитектура для надежной обработки платежей

Внешняя веб-служба, очевидно, не является транзакционной, поэтому, как гарантировать: 1. результаты, которые в конечном итоге сохраняются в базе данных при получении от веб-службы, даже если база данных недоступна в данный момент (проблема с сетью , тайм-аут db) 2. Запретить клиентам обработку заказа клиента во время платежа, инициированного другим клиентом, но результаты не соответствуют (и ожидание в какой-либо очереди восстановления)

Цель состоит в том, чтобы обрабатывать компоненты, не имеющие транзакционной системы, и гарантировать, что транзакция не будет повторяться другим процессом в случае отказа.

(пожалуйста, смотрите на него в контексте пост распродажи обработка платежей, где несколько операторов могут попытаться ручной обработкой платежей, а не веб-контроля приложения)

ответ

0

Распределенные сообщения.

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

Если что-то произойдет позже, что аннулирует транзакцию, другое сообщение может быть поставлено в очередь, чтобы «отменить» изменение.

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

+0

Это более или менее то, как я это сделал, используя MSMQ, просто хотел увидеть, как другие решат проблему. Я тоже проверил NServiceBus, что дало мне дополнительный обзор по этому вопросу. Благодарю. – Tomek

1

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

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

В общем, вы передаете управление шлюзу платежей и запускаете задачу, ожидающую ответа от шлюза, который либо «принят платеж», либо «отклонен платеж». Когда вы получите ответ, вы переходите к следующему шагу в вашем процессе, и все хорошо.

Если вы не получите ответ на все (тайм-аут), или ответ неверен, то, как вы приступите очень многое зависит от платежного шлюза:

  • Если шлюз поддерживает его отправить запрос «отменить платеж». Если платеж отменяется успешно, вы, вероятно, захотите отправить пользователя на страницу со словами «извините, пожалуйста, попробуйте еще раз».

  • Если шлюз не поддерживает отмену или у вас нет связи с шлюзом, вам необходимо вручную (лично, например, телефон) связаться с третьей стороной, чтобы узнать, что пошло не так, и как действовать. Для облегчения этого вам нужно сбросить так много деталей, как у вас есть ошибки журналов, такие как дата/время, идентификатор клиента, стоимость сделки, идентификаторы продуктов и т.д.

После того, как вы вернулись на вашем сайте (и оплата будет принята), тогда вы гораздо больше контролируете ошибки, но вкратце, если вы не можете выполнить заказ, вам следует либо сбросить данные на диск (например, файл csv для ручной обработки), либо обратиться к шлюзу, чтобы отменить оплата.

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

+0

Благодарим Пола, соглашайтесь с тем, что обработка ошибок и отчетность имеют решающее значение для осознания состояния системы и реагирования на сбои во времени. Хотя в моей системе не так много сбоев, я искал более прочный и автоматический способ их обработки. Спасибо за ответ. – Tomek

1

Спросите у платежного процессора, могут ли они обнаруживать повторяющиеся транзакции на основе вашего идентификатора заказа.Затем, если вы не можете сохранить ответ из-за сбоя базы данных, вы можете безопасно повторно отправить запрос, не опасаясь двойной зарядки (по крайней мере один PSP, который я использовал, возвратил тот же код ответа/авторизации в этом сценарии, а также флаг, чтобы сказать, что это был дубликат).

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

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

+0

Идея пометить заказ перед обработкой транзакций интересна, теперь просто надежный способ хранения результата транзакции в случае сбоя БД ... Спасибо – Tomek

+0

Предположительно, у платежного сервиса есть API-вызов в строке «дайте мне статус этой транзакции ", которую вы можете использовать после восстановления БД, чтобы получить и сохранить результат? В противном случае, у них есть веб-интерфейс, который вы можете использовать для ручного запроса статуса и обновления вручную? Звучит немного волосатым, но если неудачи нечасты, тогда это может быть достаточно хорошим. – SimonJ

Смежные вопросы