Как реализовать очень быстрый REST API на php вкупе с фреймворком?
Есть готовое REST Stateless API для мобильного приложения на стэке nginx, php-fpm 5.6 (w OPCache), yii2, redis, mysql, S3. Приложение по логике простое, общего характера как Instagram.
Задача: получить 5000-10000 RPS (кол-во запросов в секунду), больше — лучше.
Естесственно на обычном nginx+fpm цифра сейчас не впечатляет, около 3000 RPS.
Есть идеи пробовать HHVM, ReactPHP (ratchet) или даже всё переделать на Node.js (будет затратнее на переквалификацию и переноса всей логики).
Какой стэк выбрать и в какую сторону копать, чтобы получить заветные цифры и не потратить при этом много времени?
1. Найди узкие места по производительности в коде через XHProf + исправь их.
2. Пересмотри индексы в БД. Например FK могут быть слишком высокой платой за целостность.
3. Все "тяжелые" обработки, не виляющие на вывод - выноси в очередь: RabbitMQ / ZeroMQ / Gearman / ...
4. Если нет блокирующих зависимостей - попробуй на HHVM.
5. Yii-шная валидация моделей занимает довольно много времени. + Генерация моделей при выборке (используй asArray).
--
По поводу NodeJS - он вас особо не спасет. Профит, который получишь - это не stateless система (общие данные в памяти можно хранить и дергать сессию / кэш / бд для них не надо). Под ноду еще надо уметь писать, по началу у будет callback на callback-е и callback-ом погонять.
--
В любом случае рано, или поздно упрешься в железо, посему продумывай на перед возможности по горизонтальному масштабированию.
Конкретно по скорости можешь в сторону golang посмотреть.
Что за шутки? Откуда цифра в 300 RPS?
К РНР там гири привязывали, что ли?
Какова доля РНР? Где тесты, показывающие, что бутылочное горлышко - РНР фреймворк, а не, скажем, база?
Опечатка вышла. Вообще вопрос заключался в том, что возможно ли в теории получить 10-20к и более RPS на стандартном стеке, не переходя на «неумирающий» php или Node.
переквалификация - это хорошо! Думаю, лучше node.js
Я сам его знаю только поверхностно, но у меня нет задач, нет мотивации =(
Вот будет, с радостью изучу...
Для начала нужно определить что можно выжать с сервера вообще на каком-нибудь простейшем нативном коде, эмулирующем задачу, типа подключаемся к БД, открываем файл на ФС, читаем/пишем что-то, считаем, выводим и отпрофилировать её.