Объяснение
Запрос API (на другой сервис), который обычно отвечает за 10-20 секунд, сохраняется в базе данных,
После того, как он будет сохранен, система попытается использовать API мгновенно, чтобы показать результат пользователю, но он может потерпеть неудачу (и покажет, что он потерпел неудачу, но мы попробуем снова автоматически), поэтому существует также набор Cron Job
для запуска каждые 30 секунд и повторения запросов (неудачных).
Если API возвращает успех (будь то в режиме мгновенного использования или использования задания Cron), флаг будет изменен на успех в базе данных, и он не будет запущен снова.
Вопрос
Моя проблема заключается в том, что процесс Instant Call
to API находится в процессе, Cron Job
может также попробовать другой вызов, поскольку он еще не отмечен как успешный,
Также в редких случаях, когда выполняется предыдущее задание Cron, следующий задание Cron может снова запустить код.
Что я уже пытался предотвратить проблему
Я попытался сохранить вызовы API In Process
в таблице базы данных с помощью Status=1
и удалить их, когда вызов API был успешным, или установить статус на 0, если он не удалось,
if ($status === 0)
{
// Set Status to 1 in Database First (or die() if database update failed)
// Then Call The API
// If Failed Set Status to 0 so Cron Job can try again
// If Successful Change Flag to success and remove from queue
}
Но что делать, если
Instant Call
иCron Job Call
происходят в одно и то же время? они оба проверяют, есть ли статус 0, который он есть, затем оба устанавливают статус 1 и выполняют вызов API...
Вопросы
-
Я пытаюсь найти правильный способ справиться с этим?
-
Должны ли я беспокоиться о том, что они происходят в точное время (проблема, которую я объяснил в "Желтой цитате" выше), если есть много вызовов (иногда + 500/сек)
Обновить до баунти
Нет ли на самом деле простого способа обработки таких случаев на стороне PHP? если нет, то каким образом лучше мнение экспертов? ниже приведены некоторые методы, но ни один из них не является достаточно подробным, и ни у одного из них нет ни одного ниспадающего/приоритетного.
P.S. В базу данных много обновлений/вставок, я не думаю, что блокировка является эффективной идеей, и я не уверен в остальном.