Почему зависает сайт при 30-40 одновременно выполняемых запросах?

Есть скрипт, посылаю запросы через multi curl к сайту, в ответ, когда запросы выполнены он присылает call back. (каждый запрос он присылает отдельно, по одному ответу).

Когда происходит ситуация, что приходит 30-35 call backов одновременно скрипт запускается, делает обращение к базе, и через proxy начинает выполнять curl запрос, естественно он может висеть долго, т.к. делается через proxy.

Я слышал про система очередей, но не совсем понимаю как это работает и поможет ли в моей ситуации.

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

=====
Когда выполняются много call backов (они запускают curl запросы) при попытке обратится к phpmyadmin страница грузится минутами..., однако через filezila все работает быстро итд.
Ниже показываю как выглядит нагрузка:
5df93b7ea262a878591165.png

Вопрос в итоге такой: Можно ли что-то сделать, или только не нагружать большим количество запросов пока не выполнились старые? Не хватает ресурсов или чего? Поможет ли в моем случае система очередей?
  • Вопрос задан
  • 469 просмотров
Решения вопроса 1
akubintsev
@akubintsev
Опытный backend разработчик
Из всего что я понял, получается у вас в callback-хендлере делается запрос через curl куда-то ещё (через proxy) и тем самым воркер из пула web-сервера держится до момента окончания выполнения запроса. Ваш сервачок быстро исчепает пул веб-воркеров, даже если вы увеличите их до 100 и хватит памяти. Конечно, это плохое решение.
Да, в сущности нужно реализовывать систему очередей.
Вам нужно как можно быстрее выполнять пришедний запрос-колбек и освобождать пул. Для этого нужно ограничить его работу тем, чтобы положить необходимые данные в какое-то хранилище или передать сообщением в менеджере очередей, делегировав работу по отправке другому пулу воркеров. Например 1-4 воркерам/демонам на ReactPHP или Node.js, которые будут брать пачку заданий и асинхронно рассылать запросы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Wexter
1) Если PHP работает через FPM - увеличить количество процессов покуда хватает памяти/процессора
2) Если работает через апач - выкинуть апач и поставить FPM, затем повторить п. 1
3) Если уж хотите очереди - скармливайте запросы серверу очередей, клиенту отдавайте ID задачи, а клиент раз в N секунд пусть опрашивает завершилась задача или нет
Ответ написан
2ord
@2ord
продвинутый чайник
Скорее всего из-за выполнения блокирующих операций I/O.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы