Назад | Перейти на главную страницу

Тупик NGinX + PHP-FPM Microservices

У меня есть несколько небольших сервисов, которые работают на двух серверах:

Вот и проблема. Через несколько непредсказуемых интервалов тайм-аут сервера начнется без заметной активности ЦП, памяти или диска.

Вскоре я обнаружил, что проблема в том, что на сервере A работают две службы, работа которых зависит друг от друга. В этом примере я назову их Service A.A и A.B. Когда служба A.B получает запрос, она скручивает A.A, чтобы получить данные об учетной записи пользователя в стиле oAuth.

Я определил, что проблема в тупике PHP-FPM. Когда служба A.B получает n запросов (n - это количество одновременных процессов, которые PHP-FPM может запускать) до того, как ей удалось отправить запрос службе на том же компьютере, она начнет ставить запросы в очередь.

Очевидно, что если все процессы уже выделены, PHP-FPM прекратит обработку любых новых запросов. К сожалению, это включает запросы, которые он скручивает на одном сервере. Следовательно, сервер будет фактически мертв (забирая с собой сервер B).

Сначала я нашел решение довольно простым: я создал несколько пулов PHP-FPM, позволяющих запускать приложения параллельно. Это облегчает проблему, поскольку теперь позволяет PHP-FPM создавать больше процессов в целом, но не исправляет это.

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

Я не хочу утверждать, что понимаю, как работает nguni, но насколько я могу понять, есть ли n + 1 (n все еще является пределом процесса PHP-FPM для одного из пулов) запросов для службы AB, которая зависит от AA - NginX будет ждать, пока PHP-FPM примет этот запрос.

Хотелось бы узнать, есть ли возможность иметь «2 очереди запросов» для двух разных служб или есть ли что-то еще не так с моим подходом.

- Конечно, если есть какая-либо диагностика / журнал, я должен запустить / предоставить. Я с радостью предоставлю его.