Использование вызовов API / функций или использование подхода Cron Job - расследование транзакций - как бы вы справились с этим? - PullRequest
1 голос
/ 06 января 2009

Я хотел что-то сделать, ребята. Я начинаю новый проект, примерно следующий:

Важная информация: я использую PHP и MySQL

Каждую минуту я получаю список транзакций из API от разных пользователей.

Пример:

user1 send $1 to user2
userx send $2 to usera
userw send $0.50 to user2

etc..

Допустим, пользователь user1 хочет отправить $ 1 пользователю user2. Есть две возможности: успешное или неудачное, потому что недостаточно средств или пользователь неправильно ввел имя пользователя. Если это не удается, я отправляю сообщение пользователю.

У меня сейчас несколько вариантов - пожалуйста, пройдите со мной через мой мыслительный процесс.

Вариант 1

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

Вариант 2

Создайте API или функцию, которая вызывается для каждой транзакции после их получения и приносит мне ответ. После чего я могу вызвать другой API или функцию для обработки этого ответа или перейти к следующей транзакции. Однако мне все равно придется поместить их в таблицу базы данных, поскольку я не могу рискнуть их потерять, если скрипт прекратит выполнение. Таким образом, это будет работать следующим образом: поместить все транзакции в таблицу базы данных - начать транзакцию - когда завершить транзакцию удалить из таблицы - запустить транзакцию 2.


Оба варианта ошибочны, потому что вы не знаете, как долго будет длиться список транзакций. Если он длинный, PHP определенно не оптимален для запуска в течение длительного времени - использование тайм-аута в ноль рискованно. Я ищу, чтобы создать решение, которое будет масштабироваться с помощью PHP. Поэтому я думал о варианте 3.


Вариант 3 (Оптимальное решение?)

Используйте API для возврата 10 транзакций.

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

PHP-скрипт получает 10 транзакций из API - обрабатывает 10 транзакций.

После завершения транзакции - удалите ее из этой таблицы и скопируйте в таблицу завершенных транзакций.

Сценарий cronjob проверяет каждые 3 минуты, если timesent больше, чем X минут (на основе верхней границы времени выполнения 10 транзакций). Если оно больше - установите их как не отправленные, чтобы их можно было снова отправить.


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

Большое спасибо,

Ice

Ответы [ 2 ]

1 голос
/ 10 января 2009

Если вы хотите сделать это, используя минимальное отклонение от текущего стека технологий, вы на правильном пути. По сути, вы воссоздаете голый MQ или сервер заданий.

Минимальные функции, необходимые для очереди задания / задачи / транзакции:

  • задание (пользователь1 отправляет $ 2 пользователю2)
  • состояние (готовность к обработке, ошибка, выполнено)

Вы, вероятно, также захотите

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

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

Независимо от того, получаете вы его из API или прямо из базы данных, это 6 из одного, полдюжины из другого.

0 голосов
/ 06 января 2009

Я бы предложил обрабатывать каждую транзакцию при получении запроса на эту транзакцию.

I.E. Боб нажимает кнопку «Отправить деньги», чтобы отправить Алисе 20 долларов. Я бы вызвал функцию для обработки этой транзакции и показал бы им сообщение «Транзакция выполнена успешно» или «Была проблема ...».

Если обработка транзакции займет много времени, вы могли бы сделать это через AJAX, показывая им хороший индикатор выполнения с надписью «Обработка ...», пока выполняется обработка на стороне сервера, а затем либо перенаправить их на * 1005. * или yoursite.com/transactions.php?result=failure&id=$id

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