Как организовать очередь POST-запросов, если сервер в дауне?
Здравствуйте! Сильно не пинайте, не знаю, что и делать. Прошу помощи.
Проблема такая: мне нужно получать данные извне, обрабатывать и перенаправлять сформированный JSON на сервер N, который очень часто не отвечает (не знаю, что они там с ним делают). Сам сервер N на IIS. Получается, что мой софт отправляет сформированный JSON, сервер его не хавает (тупо не работает) и данные теряются. Те клянутся, что сервак у них мульен процентов аптайм, но врут. Как мне выкрутиться из этой передряги? Что делают вообще в таких случаях? Погуглил вопрос, толком ничего не нашел, но понял, что нужно организовывать FIFO-очереди запросов, как это сделать средствами PHP я не знаю, у меня мало опыта в таких делах.
Додумал пока что до следующего:
Создать таблицу в базе для запросов с полями для JSON, DATETIME и какой-то меткой типа "обработан" (BOOL). Отправляем запрос. Если не получаю 200, то сую этот запрос в БД. Так не отправленные запросы с данными будут хоть не теряться. Включается крон-скрипт и поминутно? долбим сервак пустым запросом, пока не получим 200. Как только получим 200, то этот же скрипт берет из БД самый старый запрос и отправляет его, и так по цепочке, попутно выставляя метку "обработан" в true. Костыль ((
На большее меня не хватило, буду рад помощи и может быть даже готовым решениям, если они есть? Как вообще в этом случае поступают нормальные разработчики? Заранее спасибо за ответы!
Мыслишь верно.
У тебя твое приложение в какой то момент принимает решение отправить запрос, вместо этого запроса сразу добавляй его в таблицу очередь, отдельным воркером, пусть даже в этом же приложении с периодичностью запрашиваешь самую старую запись, если вернули не пустой результат, значит делаешь попытку отправить запрос.
Теперь про эти сервера, тебе нужно точно определять, успешно ли запрос отправлен или есть ошибки, проверяй все что вернул сервер, возможно там есть запросы на проверку и т.п. задачу из таблицы очереди удалять только после успешной отправки, можно завести статусы, чтобы можно было мониторить состояние, например перед отправкой запроса ставишь состояние 'отправляется', по окончании менять на 'успешно' (потом или сразу удалять) или 'ошибка' что делать с ошибочными тебе виднее, например повтор через интервал времени (периодически менять статус на 'ожидает отправки' для записей старее этот монтировал времени)
Тебе следует организовать очередь. Дели свою работу на 2 части 1. получает запрос и складывает в очередь 2. выбирает из очереди и шлет после отмечает код ответа.
Чем больше знаю, тем лучше понимаю, как мало знаю.
Можно складывать хоть в базу, хоть в файл (serialize(), или генерировать PHP-код для include()). И можно не проверять 200-ый код отдельным HEAD-запросом к /favicon.ico, а сразу пытаться передать нужный JSON. Получилось - удалять из очереди, конечно.
Тупо скидывай все задания в папку в виде JSON-файлов с данными, которые надо отправить. Дальше кроном каждую минуту их отправляй по одному, при успешной отправке тупо удаляешь файл. Итого, задание будет бесконечно выполнятся, пока не будет выполнено и стерто. Почему именно так? Это проще и удобнее, чем базой.