Недавно начал изучать Yii и приложения, поделенные на две части
https://www.dropbox.com/s/s6kc8as1o07qovm/split.png
Фронтенд в данном случае - это весь интерфейс пользователя: и гостям, и авторизованным, и админам. Он отдаёт в браузер HTML+JS+CSS.
А бакенд - это вся серверная логика (базы данных, очереди, общение с другими серверами - например, читалка погоды и чужих RSS). Фронтенд общается с бакендом по протоколу REST поверх HTTP.
У меня на бакенде и фронтенде используется фреймворк Yii на PHP.
Упёрся в технический тупик: для генерации одной страницы во фронтенде требуется данных для 10 блоков HTML, они запрашиваются с бакенда десятью HTTP запросами. Тестовый сервер бакенда в виртуалке отвечает на один запрос за 100 - 300 миллисекунд. В общем, получается, что одна страница на фронтенде сгенерируется не менее чем за 1 - 3 секунды.
Я придумал способ, как собрать в кучу все запросы и послать не серией, а одновременно (multy curl) - но это надо кодить, потому что в фреймворке Yii такого, кажется, нет и готовых решений в Интернет я тоже не нашёл. Времени-то на кодинг этой логики мне не жалко, но вопрос такой - я вообще в правильном направлении копаю или нет? Может быть вообще фронтенд не на PHP делать?
Допустим, фронент выйдет на нагрузку 100 000 page view в сутки. Это ~1.1 запрос в секунду. На бакенд в параллельном режиме multy curl уйдут 11 запросов в секунду. А если page view будет 1 миллион? Не велика ли будет нагрузка на сервер бакенда, когда ему в пик начнут приходить 100+ запросов в секунду?
Как спрогнозировать потребности в ресурсах и настроить nginx и php-fpm для такой работы? Я предположил, что на 1 воркер на фронтенде потребуется 10 воркеров на бакенде, а это в 10 раз больше памяти на PHP, которым понадобится в 10 раз больше коннектов к БД и кэшу, которым тоже понадобится больше ресурсов.
По поводу 100 - 300 миллисекунд на запрос:
1) На стороне бакенда используется кэш на Redis и также файловый page cache на уровне nginx, но сейчас я их отключил для оценки максимальной длительности - как будто постоянно запрашивают то, чего в кэше нет. Включение кэша может на порядок уменьшить время ответа.
2) Сервер работает в виртуалке с ограничениями на память, процессор, воркеров nginx - продуктовый сервер, конечно же, будет жечь в полную силу :)
3) У фреймворка Yii есть довольно ощутимый вклад в время ответа, но это из-за режима отладки YII_DEBUG = true. Отладку можно выключить и скорость немного возрастёт.
4) Протокол HTTP, скорее всего, имеет вклад в время передачи туда-сюда. Стоит ли их физически размещать на одном сервере (запросы будут на
127.0.0.1/...) ? Может быть для запросов между фронтендом и бакендом пользоваться fsockopen, а не curl?
Вот такая куча вопросов. Нет у меня многомудрого коллеги, который на них ответит.
Коротко перечислю их ещё раз:
* стоит ли придумывать оптимизации в логике обмена фронтенда с бакендом в реализации на Yii+PHP или уже есть более производительные решения на других языках?
* выдерживают ли пром сервера работу с нагрузкой 1000+ запросов в секунду?
* стоит ли физически размещать на одном сервере фронтенд и бакенд?
* стоит ли между фронтендом и бакендом обмениваться через сокеты?