Сейчас использую PHP, поэтому решил найти средства для решения тех же самых задач в экосистеме языка. Знаю и люблю Laravel и Symfony, но тащить их в проекты не хотелось — слишком много батареек, за которые приходится расплачиваться крутой кривой входа в проект и производительностью.
В итоге появился Comet — современный фреймворк на базе PHP для разработки быстрых API, использующий наработки команд SlimPHP и Workerman. Десятки тысяч RPS на обычной виртуальной машине и латенси менее миллисекунды!
Чтобы не быть голословным, приведу результаты тестирования Comet и других популярных фреймворков. Для более честного сравнения, все тяжелые модули вроде ORM были удалены из сборки всех участников теста.
Первый кейс — имитация highload-нагрузки в виде тысяч конкурентных запросов wrk на метод, возвращающую в виде простого текста строчку приветствия «Hello, World!»:
Для оценки минимальной задержки использовался вариант, в котором единственный клиент последовательно отправлял по одному запросу на тот же самый ендпойнт:
Как видно из результатов, особенности архитектуры Comet позволяют обрабатывать в десять раз больший поток запросов с минимальными задержками, чем традиционные фреймворки.
Давайте заглянем в код, чтобы получить представление о том, с чем придется столкнуться в реальной разработке на Comet:
use Comet\Comet;
require_once __DIR__ . '/vendor/autoload.php';
$app = new Comet();
$app->get('/hello', function ($request, $response) {
$response
->getBody()
->write("Hello, Comet!");
return $response;
});
$app->run();
Все довольно прозрачно: использование роутера и замыканий обеспечивает компактный код, более похожий на то, к чему привыкли разработчики NodeJS / Express.
Я выложил на GitHub весь код и планирую расширять возможности фреймворка:
https://github.com/gotzmann/comet
Буду рад комментариям, коммитам и, конечно — использованию Comet в реальных проектах :)
Matisumi
А о чем нам вообще могут говорить синтетические тесты нагрузки, где тестируемый метод просто возвращает заранее заготовленную строку?
gotz Автор
Об оверхеде, который накладывает фреймворк на любые решения. Это как планка, выше которой прыгнуть не получится :) Для каких-то проектов это не критично, но там, где по условиям техзадания вызов API должен гарантированно укладываться в 1мс, а оверхед фреймворка на обслуживание такого вызова выше, придется искать другие варианты.
Но в целом согласен с вопросом и планирую дополнить раздел тестов более-менее реальными кейсами «сходить в базу» и «отрендерить HTML шаблон». Для себя тестиовал поведение Comet с PDO и Eloquent — последний оказался в два раза медленнее на простых вставках в базу.
ForexBroker
Да что тут можно вообще говорить, когда используется для теста Laravel, а не Lumen…
gotz Автор
Согласен, надо добавить в тесты Lumen — но по ожиданиям, его производительность будет где-то на уровне Symfony (судя по тестам TechEmpower Benchmarks)