SlideShare a Scribd company logo
Designing hybrid Go/PHP
applications using
RoadRunner
Антон Титов
Spiral Scout
2
Антон Титов (a.k.a. “Wolfy-J”)
Технический директор и соучредитель Spiral Scout
https://github.com/wolfy-j https://habr.com/ru/users/lachezis/ https://twitter.com/lachezis
Введение
Коммерческая разработка последние 12 лет
Основной стек: PHP7, Golang
О чем я буду рассказывать
1. Краткий экскурс в жизненный цикл умирающего PHP-приложения
2. Ускоряем PHP-приложение за счёт демонизации
3. RoadRunner - разработка собственного сервера PHP-приложений
4. Варианты использования RoadRunner
Введение
3
Ускорение приложения:
- Снижение расходов
- Избавление от 502 ошибок
Цель презентации
Введение
Увеличение гибкости разработки:
- Упрощаем РНР-код
- Интегрируем Golang в РНР-проект
- Контроль приложения на
инфраструктурном уровне
4
Жизненный цикл PHP-приложения
5
Устройство “классического”
PHP-приложения
- Единая точка входа
- Однопоточная модель работы
- Часть кода приложения общая
- Умирает после каждого запроса
Жизненный цикл РНР-приложения
6
Жизненный цикл РНР-приложения
Ускоряем приложение с
помощью Lazy-loading
- Уменьшаем среднее время ответа
- Запрашиваем только необходимый
код
- Используем фреймворк
- Полагаемся на OPCache
7
Жизненный цикл РНР-приложения
Кэшируем частые вычисления
- Уменьшаем среднее время ответа
- Усложняем приложение
- Прогреваем наш код
- Примеры: ORM, роутинг, шаблоны
8
Обработказапроса
Жизненный цикл приложения
+ Что такое memory leak, race
condition, deadlock?
+ Полная очистка памяти между
запросами
+ Можно меньше думать*
- Много лишней работы (CPU, IO)
- Невозможно кэшировать в памяти
Жизненный цикл РНР-приложения
- Keep-Alive не эффективен
9
Жизненный цикл РНР-приложения
Как это работает на сервере
+ Проверено - работает
+ Есть альтернатива - Nginx-Unit
+ Почти невозможно убить
приложение
- Один запрос - один процесс - одна
смерть*
- PHP-FPM всё равно если у вас
блог или нагруженный API
10
Ускоряем наше приложение
11
Что можно сделать
Загрузка и обработка кода
Ускоряем наше приложение
- OPCache
- RFC: Preloading
- JIT
12
Что можно сделать
Загрузка и обработка кода
Ускоряем наше приложение
- OPCache
- RFC: Preloading
- JIT
Радикальная смена стека
- HHVM, kPHP, PeachPie
- Переписать всё на language
13
Что можно сделать переделать
Загрузка и обработка кода
Ускоряем наше приложение
- OPCache
- RFC: Preloading
- JIT
Радикальная смена стека
- HHVM, kPHP, PeachPie
- Переписать всё на language
Избавиться от загрузки кода
Избавиться от уничтожения
процесса
Использовать память процесса
на полную катушку
14
Ускоряем наше приложение
Переносим точку входа -
демонизация
Задача
- Внедряем в приложение основной
цикл
- Загружаем код только один раз
- Минимально меняем код приложения
Цели
- Уменьшение среднего времени ответа
- Снижение нагрузки на сервер
Обработказапроса
- Держим соединения открытыми
15
Ускоряем наше приложение
Обработказапроса
Адаптируем приложение
“Бесплатная” инициализация:
- Фокусируемся только на runtime
- Предварительные вычисления:
- Роутинг
- Шаблоны
- Настройки, конфиги
- Схемы ORM
- Singleton - это не ругательство
16
Ускоряем наше приложение
Дольше
обрабатывает
запрос
Обработказапроса
Дольше
загружается
Обработказапроса
17
Проблемы долгоживущей модели
Ускоряем наше приложение
Утечки памяти
- Используем проверенные библиотеки, пишем аккуратно
- Мониторим воркеры
18
Проблемы долгоживущей модели
Ускоряем наше приложение
Утечки памяти
- Используем проверенные библиотеки, пишем аккуратно
- Мониторим воркеры
Утечки данных
- Не храним активного пользователя в глобальном контексте
- Аккуратно обращаемся с данными сессий
19
Проблемы долгоживущей модели
Утечки памяти
Ускоряем наше приложение
- Используем проверенные библиотеки, пишем аккуратно
- Мониторим воркеры
Утечки данных
- Не храним активного пользователя в глобальном контексте
- Аккуратно обращаемся с данными сессий
Управление ресурсами
- Контролируем соединения к базам данных
- Избегаем долгоживущих file lock
20
Исследуем долгоживущую модель
21
Исследуем долгоживущую модель
Обработказапроса
Неблокирующий подход
+ Максимальная производительность
+ Новые возможности: промисы, веб-
сокеты
- Неэффективное использование
блокирующих библиотек
- Повышенная сложность разработки
- Приложение и сервер - один процесс
+ Приложение и сервер - один процесс
22
Исследуем долгоживущую модель
Существующие решения
+ Максимальная производительность
+ Новые возможности: промисы, веб-
сокеты
- Неэффективное использование
блокирующих библиотек
- Повышенная сложность разработки
- Приложение и сервер - один процесс
+ Приложение и сервер - один процесс
23
Исследуем долгоживущую модель
Блокирующий подход
Обработказапроса
+ Пишем однопоточный код
+ Игнорируем время инициализации
- Потенциальные утечки памяти
- Общение между процессами не
бесплатное
+ Выполняем тяжелую работу вне РНР
24
Исследуем долгоживущую модель
Существующие решения
+ Интеграция с несколькими
фреймворками
- Медленный
- Утечки памяти на уровне сервера
- Не работает на Windows*
+ Написан на РНР
PHP-PM
25
Пишем свой сервер приложений
26
Пишем свой сервер
Ожидания
Пишем свой сервер приложения
- Совместимость с существующими фреймворками
27
Пишем свой сервер
Ожидания
Пишем свой сервер приложения
- Совместимость с существующими фреймворками
- Разные процессы для сервера и приложения, горячая перезагрузка
28
Пишем свой сервер
Ожидания
Пишем свой сервер приложения
- Совместимость с существующими фреймворками
- Разные процессы для сервера и приложения, горячая перезагрузка
- Высокая скорость и стабильность работы
29
Пишем свой сервер
Ожидания
Пишем свой сервер приложения
- Совместимость с существующими фреймворками
- Разные процессы для сервера и приложения, горячая перезагрузка
- Высокая скорость и стабильность работы
- Легкая расширяемость, больше чем HTTP-Server
30
Пишем свой сервер
Ожидания
Пишем свой сервер приложения
- Совместимость с существующими фреймворками
- Разные процессы для сервера и приложения, горячая перезагрузка
- Высокая скорость и стабильность работы
- Легкая расширяемость, больше чем HTTP-Server
- Работа из коробки везде, где только возможно
31
Пишем свой сервер
Ожидания
Пишем свой сервер приложения
- Совместимость с существующими фреймворками
- Разные процессы для сервера и приложения, горячая перезагрузка
- Высокая скорость и стабильность работы
- Легкая расширяемость, больше чем HTTP-Server
- Работа из коробки везде, где только возможно
- Возможность писать очень быстрые расширения
32
33
Что необходимо для создания PHP-сервера
- Коммуникация между Golang и РНР-процессами
RoadRunner
- Менеджер процессов - создание, уничтожение, мониторинг
- Балансировщик задач - эффективно раздаем задачи воркерам
- HTTP-стек - передаем данные НТТР-запроса воркеру
34
Варианты взаимодействия между процессами
Embedding:
RoadRunner
- Требует кастомной сборки РНР
- Сложен в настройке
- Общий процесс для сервера и РНР
- Пример: https://github.com/deuill/go-php
35
Варианты взаимодействия между процессами
Embedding:
RoadRunner
- Требует кастомной сборки РНР
- Сложен в настройке
- Общий процесс для сервера и РНР
- Пример: https://github.com/deuill/go-php
Shared Memory:
- Зависит от OS
- Требуется ручная синхронизация
- Сложен в реализации
36
Варианты взаимодействия между процессами
Embedding:
RoadRunner
- Требует кастомной сборки РНР
- Сложен в настройке
- Общий процесс для сервера и РНР
- Пример: https://github.com/deuill/go-php
Shared Memory:
- Зависит от OS
- Требуется ручная синхронизация
- Сложен в реализации
KISS
37
Пишем свой транспортный протокол - Goridge
Требования:
RoadRunner
- Работа используя PIPES, UNIX/TCP SOCKETS
- Проще - лучше (KISS)
- Минимальный оверхед
- Заголовки пакетов
- Полудуплекс
- Обнаружение ошибок
- Возможность реализации на РНР без внешних пакетов
38
Goridge v2.0: Структура пакета данных
RoadRunner
1 байт: тип [CONTROL, ERROR, STREAM, FORMAT]
8 байт: размер (LE) 8 байт: размер (BE) Данные
- 17 байт оверхед (заголовок)
- 2^64 максимальный размер
- 8 контрольных флагов
- Обнаружение ошибок, используя инвертированный size ([1234]:[4321])
39
Goridge v3.0*: Работа над ошибками
RoadRunner
1 байт: тип [CONTROL, ERROR, STREAM, FORMAT]
8 байт: размер (LE) контрольная сумма Данные
- уменьшаем оверхед
- больше пространства для мета-данных
- поддержка Async PHP
40
Реализация на уровне языка
RoadRunner
- encoding/binary
- io для STDIN, STDOUT
- net для UNIX, TCP
- pack/unpack
- streams для STDIN/STDOUT
- sockets для UNIX, TCP
41
Побочный эффект: интеграция с Golang net/rpc
RoadRunner
42
Побочный эффект: интеграция с Golang net/rpc
RoadRunner
43
Менеджер PHP-процессов - Воркер
RoadRunner
- Используем os/exec, runtime, sync,
atomic
- Мониторим состояние
- Собираем статистику
- Общаемся через Goridge
- Собираем данные STDERR в
реальном времени
44
Менеджер PHP-процессов - Фабрика
- Graceful-уничтожение воркера
(через запрос STOP)
- Запрашиваем создание
воркера в любой момент
- PID Handshake при
использовании сокетов
RoadRunner
45
- Храним активные воркеры в стеке
- Запрашиваем первый свободный воркер
- Используем Golang buffered channel в виде LIFO Stack
RoadRunner
Балансировщик задач: запрос воркера
46
- Блокируем воркер на время выполнения запроса
- Timeout в случае, если нет свободных воркеров
- Используем sync, atomic
RoadRunner
Балансировщик задач: обработка запроса
47
- В случае успеха возвращаем воркер в конец стека
- Воркер готов выполнить следующий запрос
- Отдаем ответ пользователю
RoadRunnerRoadRunner
Балансировщик задач: возврат воркера
48
- В случае ошибки просим
новый воркер
- Отдаем ошибку
пользователю
RoadRunnerRoadRunnerRoadRunner
Балансировщик задач: обработка ошибок
49
- Блокирующий подход
- 200ns на аллокацию
воркера
- Работа даже в случае
критических ошибок
RoadRunnerRoadRunnerRoadRunner
Балансировщик задач: обработка ошибок
50
RoadRunnerRoadRunnerRoadRunnerRoadRunner
Проактивный Мониторинг
- Ловим утечки памяти без fatal
exception (превентивно)
- Убиваем зависшие воркеры
- Заменяем старые воркеры
- Заменяем idle-воркеры
- Пишем свои модули
мониторинга
51
- Конвертируем net/http-запрос в PSR-7-формат
- Посылаем запрос первому свободному воркеру
- Распаковываем запрос в PSR-7-объект
- Генерируем ответ
RoadRunnerRoadRunnerRoadRunner
Реализация HTTP стека
52
Реализация на уровне языка
RoadRunner
- Стандартная библиотека
- HTTPS, HTTP/2
- Множество расширений
- Не зависит от фреймворка
- Множество расширений
- Иммутабельный*
NET/HTTP PSR-7
53
Как это выглядит в коде
- Единая точка входа
- Запускается в любом
окружении
- Конфигурация количества
воркеров, таймаутов и т.д.
RoadRunner
54
Как это выглядит в коде
RoadRunner
55
- Единая точка входа
- Запускается в любом
окружении
- Конфигурация количества
воркеров, таймаутов и т.д.
Сборка под нужды проекта
RoadRunner
56
Варианты использования
57
Модульность
- Возможность использования в виде
standalone библиотеки
- Общение с воркерами бинарными
пакетами
- Общение с сервером через Goridge
RPC
RoadRunner
58
Пишем Middleware на Golang: Авторизация
- Валидируем запрос до вызова PHP
- Передаем контекст, используя PSR-7-
атрибуты
- Реализуем Rate-Limiter, Circuit-Breaker
RoadRunner
59
Пишем Middleware на Golang: Мониторинг
- Собираем метрики приложения в
реальном времени
- Собираем application-specific метрики
- Смотрим за потреблением памяти
RoadRunner
60
Распределенный трейсинг и логирование
- Тегируем запросы
- Передаем тег запроса нижестоящему
сервису
- Собираем логи со всех воркеров
- Строим распределенный трейс вызовов
RoadRunner
61
Записываем историю запросов
- Сохраняем историю запросов
- Производим нагрузочное тестирование
- Производим автоматическое
тестирование
- Убеждаемся в стабильности API
RoadRunner
62
Обрабатываем часть запросов на Golang
- Обрабатываем избранные запросы на
Golang
- Переносим код на другой стек, по
необходимости
RoadRunner
63
Пишем WebSocket-сервер
RoadRunner
64
- Golang сервис на уровне сервера
- Коммуникация, используя Goridge
- Тонкий сервисный слой на PHP
- Реализуем сервер нотификаций
Управляем окружением PHP
RoadRunner
65
- Модифицируем ENV, используя
внешний провайдер
- Избавляемся от .env
- Упрощаем деплой
- Изолируем окружение внутри
RoadRunner
Интегрируем Golang-библиотеки в PHP
RoadRunner
66
- Библиотека для полнотекстового
поиска BleveSearch
- Тонкий сервисный слой на PHP
- Поиск по документации без внешних
баз данных
AWS Lambda
RoadRunner
67
- На основе Golang runtime
- Минимальный оверхед
- Доступ к настройкам окружения
- < 0.5ms на echo-запрос после
прогрева
https://roadrunner.dev/docs/library-aws-lambda
gRPC для PHP
- Protobuf-прокси с генерацией
сервисного слоя
- Golang и PHP-сервисы в одном
приложении
- Middleware (Interceptors)
- Может работать в связке с HTTP
RoadRunner
68
https://github.com/spiral/php-grpc
Сервер очередей
- Смена драйвера без изменения кода
- Работа без брокера (очередь в памяти)
- Реконнекты, pre-fetch контроль
- Graceful shutdown, pause, resume
- Publish/Consume из PHP и Golang
- Ловит фатальные ошибки воркеров
RoadRunner
69
https://github.com/spiral/jobs
Разделяем доменные области
PHP
- Бизнес-логика приложения, API
- HTML-рендеринг
- ORM и работа с базами данных
Golang
- Инфраструктурная логика
- Авторизация
- Мониторинг
- Очереди, источники данных
- Многопоточные алгоритмы
- WebSockets, etc
RoadRunner
70
Итоги
71
Использование на Production
- В четыре раза более низкий latency по
сравнению c PHP-FPM
- Отсутствие 502 ошибок под нагрузками
- Uptime воркеров до 2-х месяцев
- Используем Keep-Alive
- Работа в Alpine Docker в Kubernetes
RoadRunner
72
Бенчмарк: https://habr.com/ru/post/431818/
RoadRunner
73
Бенчмарк: https://habr.com/ru/post/431818/
RoadRunner
74
Бенчмарк: https://habr.com/ru/post/431818/
RoadRunner
75
Доступность: https://habr.com/ru/post/431818/
RoadRunner
76
37.000+ установок с Сентября 2018
RoadRunner
77
Интеграции от комьюнити*
RoadRunner
78
RoadRunner
RoadRunner
79
- Если требуется ускорить приложение
- Если нужен больший контроль над PHP
- Если возможностей PHP не хватает
- Когда вашу проблему решает Golang-библиотека
Контрибьюторы приветствуются.
Спасибо за внимание!
roadrunner.dev
80
Ссылки
- https://roadrunner.dev/
- https://github.com/spiral
- https://github.com/spiral/goridge
- https://github.com/spiral/roadrunner
- https://twitter.com/spiralphp
RoadRunner
81
Публикации
- https://blog.spiralscout.com/php-was-never-meant-to-die-830de87915ee
- https://scottaubrey.info/blog/2018-09-12-roadrunner-a-php-application-server/
- https://habr.com/ru/company/badoo/blog/434272/
- https://habr.com/ru/post/431818/
- https://www.ctolib.com/topics-132962.html
- https://nextat.co.jp/staff/archives/235
- https://nextat.co.jp/staff/archives/236
RoadRunner
82

More Related Content

What's hot

Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)AvitoTech
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Fwdays
 
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox ExtensionОранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extensionchaykaborya
 
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"Fwdays
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Yandex
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Полный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoПолный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoAzamat Tokhtaev
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton TsitouFwdays
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Ontico
 
Презентация Git-flow (на русском)
Презентация Git-flow (на русском)Презентация Git-flow (на русском)
Презентация Git-flow (на русском)Sergey Chudakov
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Fwdays
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Fwdays
 
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NETДенис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NETElias Fofanov
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkOleksandr Torosh
 
Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Yulia Karpova
 
Введение в maven
Введение в mavenВведение в maven
Введение в mavenDmitry Zinushin
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Вячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестированияВячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестированияElias Fofanov
 

What's hot (20)

JPHP
JPHPJPHP
JPHP
 
Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)
 
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...Alexandr Serbul "The Rust language for a high-load network service - a quick ...
Alexandr Serbul "The Rust language for a high-load network service - a quick ...
 
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox ExtensionОранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension
 
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
Сергей Яковлев "Phalcon 2 - стабилизация и производительность"
 
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
Михаил Корепанов "Инкрементальные обновления на клиенте. Ловкость рук и никак...
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Полный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoПолный цикл разработки на Python + Django
Полный цикл разработки на Python + Django
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou"Fault tolerant workflow orchestration on PHP", Anton Tsitou
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
Презентация Git-flow (на русском)
Презентация Git-flow (на русском)Презентация Git-flow (на русском)
Презентация Git-flow (на русском)
 
Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"Владислав Грязнов "Многозадачность в PHP"
Владислав Грязнов "Многозадачность в PHP"
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"
 
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NETДенис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
Денис Давыдов - Кроссплатформенные инструменты серверной разработки .NET
 
Phalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP FrameworkPhalcon - самый быстрый PHP Framework
Phalcon - самый быстрый PHP Framework
 
Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015Rsnx tsvetkov che btrix conf 2015
Rsnx tsvetkov che btrix conf 2015
 
Sivko
SivkoSivko
Sivko
 
Введение в maven
Введение в mavenВведение в maven
Введение в maven
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Вячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестированияВячеслав Смирнов - Инструменты нагрузочного тестирования
Вячеслав Смирнов - Инструменты нагрузочного тестирования
 

Similar to Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"

развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...it-people
 
Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)Alexey Lavrenuke
 
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)Ontico
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Sergey Xek
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовSQALab
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesAliaksandr Ikhelis
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовSQALab
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
Андрей Завадский "Бессерверная архитектура"
 Андрей Завадский "Бессерверная архитектура" Андрей Завадский "Бессерверная архитектура"
Андрей Завадский "Бессерверная архитектура"Fwdays
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...rit2011
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Ontico
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияOvadiah Myrgorod
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенPyNSK
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Ontico
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Fwdays
 

Similar to Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner" (20)

развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2...
 
Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
 
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
Что делать, когда у вас 100 партнеров / Иван Потапов (Lamoda)
 
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
Полмиллиона юзеров в онлайне без падений: оптимизация высоконагруженного se...
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
 
Apache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектовApache.JMeter для .NET-проектов
Apache.JMeter для .NET-проектов
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
Андрей Завадский "Бессерверная архитектура"
 Андрей Завадский "Бессерверная архитектура" Андрей Завадский "Бессерверная архитектура"
Андрей Завадский "Бессерверная архитектура"
 
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
полмиллиона юзеров в онлайне без падений оптимизация высоконагруженной Server...
 
Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)Компиляция скриптов PHP (Алексей Романенко)
Компиляция скриптов PHP (Алексей Романенко)
 
Создаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровожденияСоздаем Drupal дистрибутив: от идеи до сопровождения
Создаем Drupal дистрибутив: от идеи до сопровождения
 
JSON-RPC
JSON-RPCJSON-RPC
JSON-RPC
 
JSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобенJSON-RPC или когда rest неудобен
JSON-RPC или когда rest неудобен
 
Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)Мой маленький уютный PaaS / Илья Беда (bro.agency)
Мой маленький уютный PaaS / Илья Беда (bro.agency)
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"
 

More from Fwdays

"What I learned through reverse engineering", Yuri Artiukh
"What I learned through reverse engineering", Yuri Artiukh"What I learned through reverse engineering", Yuri Artiukh
"What I learned through reverse engineering", Yuri ArtiukhFwdays
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor TurskyiFwdays
 
"Micro frontends: Unbelievably true life story", Dmytro Pavlov
"Micro frontends: Unbelievably true life story", Dmytro Pavlov"Micro frontends: Unbelievably true life story", Dmytro Pavlov
"Micro frontends: Unbelievably true life story", Dmytro PavlovFwdays
 
"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak
"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak
"Objects validation and comparison using runtime types (io-ts)", Oleksandr SuhakFwdays
 
"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi
"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi
"JavaScript. Standard evolution, when nobody cares", Roman SavitskyiFwdays
 
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...Fwdays
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil TopchiiFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro SpodaretsFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym KindritskyiFwdays
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...Fwdays
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...Fwdays
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...Fwdays
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...Fwdays
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...Fwdays
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...Fwdays
 

More from Fwdays (20)

"What I learned through reverse engineering", Yuri Artiukh
"What I learned through reverse engineering", Yuri Artiukh"What I learned through reverse engineering", Yuri Artiukh
"What I learned through reverse engineering", Yuri Artiukh
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
 
"Micro frontends: Unbelievably true life story", Dmytro Pavlov
"Micro frontends: Unbelievably true life story", Dmytro Pavlov"Micro frontends: Unbelievably true life story", Dmytro Pavlov
"Micro frontends: Unbelievably true life story", Dmytro Pavlov
 
"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak
"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak
"Objects validation and comparison using runtime types (io-ts)", Oleksandr Suhak
 
"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi
"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi
"JavaScript. Standard evolution, when nobody cares", Roman Savitskyi
 
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y..."How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
"How Preply reduced ML model development time from 1 month to 1 day",Yevhen Y...
 
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
"GenAI Apps: Our Journey from Ideas to Production Excellence",Danil Topchii
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets"What is a RAG system and how to build it",Dmytro Spodarets
"What is a RAG system and how to build it",Dmytro Spodarets
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi"Distributed graphs and microservices in Prom.ua",  Maksym Kindritskyi
"Distributed graphs and microservices in Prom.ua", Maksym Kindritskyi
 
"Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl..."Rethinking the existing data loading and processing process as an ETL exampl...
"Rethinking the existing data loading and processing process as an ETL exampl...
 
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T..."How Ukrainian IT specialist can go on vacation abroad without crossing the T...
"How Ukrainian IT specialist can go on vacation abroad without crossing the T...
 
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ..."The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
"The Strength of Being Vulnerable: the experience from CIA, Tesla and Uber", ...
 
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu..."[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
"[QUICK TALK] Radical candor: how to achieve results faster thanks to a cultu...
 
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care..."[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
"[QUICK TALK] PDP Plan, the only one door to raise your salary and boost care...
 
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"..."4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
"4 horsemen of the apocalypse of working relationships (+ antidotes to them)"...
 

Anton Tsitou "Designing hybrid Go/PHP applications using RoadRunner"

  • 1. Designing hybrid Go/PHP applications using RoadRunner Антон Титов Spiral Scout
  • 2. 2 Антон Титов (a.k.a. “Wolfy-J”) Технический директор и соучредитель Spiral Scout https://github.com/wolfy-j https://habr.com/ru/users/lachezis/ https://twitter.com/lachezis Введение Коммерческая разработка последние 12 лет Основной стек: PHP7, Golang
  • 3. О чем я буду рассказывать 1. Краткий экскурс в жизненный цикл умирающего PHP-приложения 2. Ускоряем PHP-приложение за счёт демонизации 3. RoadRunner - разработка собственного сервера PHP-приложений 4. Варианты использования RoadRunner Введение 3
  • 4. Ускорение приложения: - Снижение расходов - Избавление от 502 ошибок Цель презентации Введение Увеличение гибкости разработки: - Упрощаем РНР-код - Интегрируем Golang в РНР-проект - Контроль приложения на инфраструктурном уровне 4
  • 6. Устройство “классического” PHP-приложения - Единая точка входа - Однопоточная модель работы - Часть кода приложения общая - Умирает после каждого запроса Жизненный цикл РНР-приложения 6
  • 7. Жизненный цикл РНР-приложения Ускоряем приложение с помощью Lazy-loading - Уменьшаем среднее время ответа - Запрашиваем только необходимый код - Используем фреймворк - Полагаемся на OPCache 7
  • 8. Жизненный цикл РНР-приложения Кэшируем частые вычисления - Уменьшаем среднее время ответа - Усложняем приложение - Прогреваем наш код - Примеры: ORM, роутинг, шаблоны 8
  • 9. Обработказапроса Жизненный цикл приложения + Что такое memory leak, race condition, deadlock? + Полная очистка памяти между запросами + Можно меньше думать* - Много лишней работы (CPU, IO) - Невозможно кэшировать в памяти Жизненный цикл РНР-приложения - Keep-Alive не эффективен 9
  • 10. Жизненный цикл РНР-приложения Как это работает на сервере + Проверено - работает + Есть альтернатива - Nginx-Unit + Почти невозможно убить приложение - Один запрос - один процесс - одна смерть* - PHP-FPM всё равно если у вас блог или нагруженный API 10
  • 12. Что можно сделать Загрузка и обработка кода Ускоряем наше приложение - OPCache - RFC: Preloading - JIT 12
  • 13. Что можно сделать Загрузка и обработка кода Ускоряем наше приложение - OPCache - RFC: Preloading - JIT Радикальная смена стека - HHVM, kPHP, PeachPie - Переписать всё на language 13
  • 14. Что можно сделать переделать Загрузка и обработка кода Ускоряем наше приложение - OPCache - RFC: Preloading - JIT Радикальная смена стека - HHVM, kPHP, PeachPie - Переписать всё на language Избавиться от загрузки кода Избавиться от уничтожения процесса Использовать память процесса на полную катушку 14
  • 15. Ускоряем наше приложение Переносим точку входа - демонизация Задача - Внедряем в приложение основной цикл - Загружаем код только один раз - Минимально меняем код приложения Цели - Уменьшение среднего времени ответа - Снижение нагрузки на сервер Обработказапроса - Держим соединения открытыми 15
  • 16. Ускоряем наше приложение Обработказапроса Адаптируем приложение “Бесплатная” инициализация: - Фокусируемся только на runtime - Предварительные вычисления: - Роутинг - Шаблоны - Настройки, конфиги - Схемы ORM - Singleton - это не ругательство 16
  • 18. Проблемы долгоживущей модели Ускоряем наше приложение Утечки памяти - Используем проверенные библиотеки, пишем аккуратно - Мониторим воркеры 18
  • 19. Проблемы долгоживущей модели Ускоряем наше приложение Утечки памяти - Используем проверенные библиотеки, пишем аккуратно - Мониторим воркеры Утечки данных - Не храним активного пользователя в глобальном контексте - Аккуратно обращаемся с данными сессий 19
  • 20. Проблемы долгоживущей модели Утечки памяти Ускоряем наше приложение - Используем проверенные библиотеки, пишем аккуратно - Мониторим воркеры Утечки данных - Не храним активного пользователя в глобальном контексте - Аккуратно обращаемся с данными сессий Управление ресурсами - Контролируем соединения к базам данных - Избегаем долгоживущих file lock 20
  • 22. Исследуем долгоживущую модель Обработказапроса Неблокирующий подход + Максимальная производительность + Новые возможности: промисы, веб- сокеты - Неэффективное использование блокирующих библиотек - Повышенная сложность разработки - Приложение и сервер - один процесс + Приложение и сервер - один процесс 22
  • 23. Исследуем долгоживущую модель Существующие решения + Максимальная производительность + Новые возможности: промисы, веб- сокеты - Неэффективное использование блокирующих библиотек - Повышенная сложность разработки - Приложение и сервер - один процесс + Приложение и сервер - один процесс 23
  • 24. Исследуем долгоживущую модель Блокирующий подход Обработказапроса + Пишем однопоточный код + Игнорируем время инициализации - Потенциальные утечки памяти - Общение между процессами не бесплатное + Выполняем тяжелую работу вне РНР 24
  • 25. Исследуем долгоживущую модель Существующие решения + Интеграция с несколькими фреймворками - Медленный - Утечки памяти на уровне сервера - Не работает на Windows* + Написан на РНР PHP-PM 25
  • 26. Пишем свой сервер приложений 26
  • 27. Пишем свой сервер Ожидания Пишем свой сервер приложения - Совместимость с существующими фреймворками 27
  • 28. Пишем свой сервер Ожидания Пишем свой сервер приложения - Совместимость с существующими фреймворками - Разные процессы для сервера и приложения, горячая перезагрузка 28
  • 29. Пишем свой сервер Ожидания Пишем свой сервер приложения - Совместимость с существующими фреймворками - Разные процессы для сервера и приложения, горячая перезагрузка - Высокая скорость и стабильность работы 29
  • 30. Пишем свой сервер Ожидания Пишем свой сервер приложения - Совместимость с существующими фреймворками - Разные процессы для сервера и приложения, горячая перезагрузка - Высокая скорость и стабильность работы - Легкая расширяемость, больше чем HTTP-Server 30
  • 31. Пишем свой сервер Ожидания Пишем свой сервер приложения - Совместимость с существующими фреймворками - Разные процессы для сервера и приложения, горячая перезагрузка - Высокая скорость и стабильность работы - Легкая расширяемость, больше чем HTTP-Server - Работа из коробки везде, где только возможно 31
  • 32. Пишем свой сервер Ожидания Пишем свой сервер приложения - Совместимость с существующими фреймворками - Разные процессы для сервера и приложения, горячая перезагрузка - Высокая скорость и стабильность работы - Легкая расширяемость, больше чем HTTP-Server - Работа из коробки везде, где только возможно - Возможность писать очень быстрые расширения 32
  • 33. 33
  • 34. Что необходимо для создания PHP-сервера - Коммуникация между Golang и РНР-процессами RoadRunner - Менеджер процессов - создание, уничтожение, мониторинг - Балансировщик задач - эффективно раздаем задачи воркерам - HTTP-стек - передаем данные НТТР-запроса воркеру 34
  • 35. Варианты взаимодействия между процессами Embedding: RoadRunner - Требует кастомной сборки РНР - Сложен в настройке - Общий процесс для сервера и РНР - Пример: https://github.com/deuill/go-php 35
  • 36. Варианты взаимодействия между процессами Embedding: RoadRunner - Требует кастомной сборки РНР - Сложен в настройке - Общий процесс для сервера и РНР - Пример: https://github.com/deuill/go-php Shared Memory: - Зависит от OS - Требуется ручная синхронизация - Сложен в реализации 36
  • 37. Варианты взаимодействия между процессами Embedding: RoadRunner - Требует кастомной сборки РНР - Сложен в настройке - Общий процесс для сервера и РНР - Пример: https://github.com/deuill/go-php Shared Memory: - Зависит от OS - Требуется ручная синхронизация - Сложен в реализации KISS 37
  • 38. Пишем свой транспортный протокол - Goridge Требования: RoadRunner - Работа используя PIPES, UNIX/TCP SOCKETS - Проще - лучше (KISS) - Минимальный оверхед - Заголовки пакетов - Полудуплекс - Обнаружение ошибок - Возможность реализации на РНР без внешних пакетов 38
  • 39. Goridge v2.0: Структура пакета данных RoadRunner 1 байт: тип [CONTROL, ERROR, STREAM, FORMAT] 8 байт: размер (LE) 8 байт: размер (BE) Данные - 17 байт оверхед (заголовок) - 2^64 максимальный размер - 8 контрольных флагов - Обнаружение ошибок, используя инвертированный size ([1234]:[4321]) 39
  • 40. Goridge v3.0*: Работа над ошибками RoadRunner 1 байт: тип [CONTROL, ERROR, STREAM, FORMAT] 8 байт: размер (LE) контрольная сумма Данные - уменьшаем оверхед - больше пространства для мета-данных - поддержка Async PHP 40
  • 41. Реализация на уровне языка RoadRunner - encoding/binary - io для STDIN, STDOUT - net для UNIX, TCP - pack/unpack - streams для STDIN/STDOUT - sockets для UNIX, TCP 41
  • 42. Побочный эффект: интеграция с Golang net/rpc RoadRunner 42
  • 43. Побочный эффект: интеграция с Golang net/rpc RoadRunner 43
  • 44. Менеджер PHP-процессов - Воркер RoadRunner - Используем os/exec, runtime, sync, atomic - Мониторим состояние - Собираем статистику - Общаемся через Goridge - Собираем данные STDERR в реальном времени 44
  • 45. Менеджер PHP-процессов - Фабрика - Graceful-уничтожение воркера (через запрос STOP) - Запрашиваем создание воркера в любой момент - PID Handshake при использовании сокетов RoadRunner 45
  • 46. - Храним активные воркеры в стеке - Запрашиваем первый свободный воркер - Используем Golang buffered channel в виде LIFO Stack RoadRunner Балансировщик задач: запрос воркера 46
  • 47. - Блокируем воркер на время выполнения запроса - Timeout в случае, если нет свободных воркеров - Используем sync, atomic RoadRunner Балансировщик задач: обработка запроса 47
  • 48. - В случае успеха возвращаем воркер в конец стека - Воркер готов выполнить следующий запрос - Отдаем ответ пользователю RoadRunnerRoadRunner Балансировщик задач: возврат воркера 48
  • 49. - В случае ошибки просим новый воркер - Отдаем ошибку пользователю RoadRunnerRoadRunnerRoadRunner Балансировщик задач: обработка ошибок 49
  • 50. - Блокирующий подход - 200ns на аллокацию воркера - Работа даже в случае критических ошибок RoadRunnerRoadRunnerRoadRunner Балансировщик задач: обработка ошибок 50
  • 51. RoadRunnerRoadRunnerRoadRunnerRoadRunner Проактивный Мониторинг - Ловим утечки памяти без fatal exception (превентивно) - Убиваем зависшие воркеры - Заменяем старые воркеры - Заменяем idle-воркеры - Пишем свои модули мониторинга 51
  • 52. - Конвертируем net/http-запрос в PSR-7-формат - Посылаем запрос первому свободному воркеру - Распаковываем запрос в PSR-7-объект - Генерируем ответ RoadRunnerRoadRunnerRoadRunner Реализация HTTP стека 52
  • 53. Реализация на уровне языка RoadRunner - Стандартная библиотека - HTTPS, HTTP/2 - Множество расширений - Не зависит от фреймворка - Множество расширений - Иммутабельный* NET/HTTP PSR-7 53
  • 54. Как это выглядит в коде - Единая точка входа - Запускается в любом окружении - Конфигурация количества воркеров, таймаутов и т.д. RoadRunner 54
  • 55. Как это выглядит в коде RoadRunner 55 - Единая точка входа - Запускается в любом окружении - Конфигурация количества воркеров, таймаутов и т.д.
  • 56. Сборка под нужды проекта RoadRunner 56
  • 58. Модульность - Возможность использования в виде standalone библиотеки - Общение с воркерами бинарными пакетами - Общение с сервером через Goridge RPC RoadRunner 58
  • 59. Пишем Middleware на Golang: Авторизация - Валидируем запрос до вызова PHP - Передаем контекст, используя PSR-7- атрибуты - Реализуем Rate-Limiter, Circuit-Breaker RoadRunner 59
  • 60. Пишем Middleware на Golang: Мониторинг - Собираем метрики приложения в реальном времени - Собираем application-specific метрики - Смотрим за потреблением памяти RoadRunner 60
  • 61. Распределенный трейсинг и логирование - Тегируем запросы - Передаем тег запроса нижестоящему сервису - Собираем логи со всех воркеров - Строим распределенный трейс вызовов RoadRunner 61
  • 62. Записываем историю запросов - Сохраняем историю запросов - Производим нагрузочное тестирование - Производим автоматическое тестирование - Убеждаемся в стабильности API RoadRunner 62
  • 63. Обрабатываем часть запросов на Golang - Обрабатываем избранные запросы на Golang - Переносим код на другой стек, по необходимости RoadRunner 63
  • 64. Пишем WebSocket-сервер RoadRunner 64 - Golang сервис на уровне сервера - Коммуникация, используя Goridge - Тонкий сервисный слой на PHP - Реализуем сервер нотификаций
  • 65. Управляем окружением PHP RoadRunner 65 - Модифицируем ENV, используя внешний провайдер - Избавляемся от .env - Упрощаем деплой - Изолируем окружение внутри RoadRunner
  • 66. Интегрируем Golang-библиотеки в PHP RoadRunner 66 - Библиотека для полнотекстового поиска BleveSearch - Тонкий сервисный слой на PHP - Поиск по документации без внешних баз данных
  • 67. AWS Lambda RoadRunner 67 - На основе Golang runtime - Минимальный оверхед - Доступ к настройкам окружения - < 0.5ms на echo-запрос после прогрева https://roadrunner.dev/docs/library-aws-lambda
  • 68. gRPC для PHP - Protobuf-прокси с генерацией сервисного слоя - Golang и PHP-сервисы в одном приложении - Middleware (Interceptors) - Может работать в связке с HTTP RoadRunner 68 https://github.com/spiral/php-grpc
  • 69. Сервер очередей - Смена драйвера без изменения кода - Работа без брокера (очередь в памяти) - Реконнекты, pre-fetch контроль - Graceful shutdown, pause, resume - Publish/Consume из PHP и Golang - Ловит фатальные ошибки воркеров RoadRunner 69 https://github.com/spiral/jobs
  • 70. Разделяем доменные области PHP - Бизнес-логика приложения, API - HTML-рендеринг - ORM и работа с базами данных Golang - Инфраструктурная логика - Авторизация - Мониторинг - Очереди, источники данных - Многопоточные алгоритмы - WebSockets, etc RoadRunner 70
  • 72. Использование на Production - В четыре раза более низкий latency по сравнению c PHP-FPM - Отсутствие 502 ошибок под нагрузками - Uptime воркеров до 2-х месяцев - Используем Keep-Alive - Работа в Alpine Docker в Kubernetes RoadRunner 72
  • 77. 37.000+ установок с Сентября 2018 RoadRunner 77
  • 79. RoadRunner RoadRunner 79 - Если требуется ускорить приложение - Если нужен больший контроль над PHP - Если возможностей PHP не хватает - Когда вашу проблему решает Golang-библиотека Контрибьюторы приветствуются. Спасибо за внимание!
  • 81. Ссылки - https://roadrunner.dev/ - https://github.com/spiral - https://github.com/spiral/goridge - https://github.com/spiral/roadrunner - https://twitter.com/spiralphp RoadRunner 81
  • 82. Публикации - https://blog.spiralscout.com/php-was-never-meant-to-die-830de87915ee - https://scottaubrey.info/blog/2018-09-12-roadrunner-a-php-application-server/ - https://habr.com/ru/company/badoo/blog/434272/ - https://habr.com/ru/post/431818/ - https://www.ctolib.com/topics-132962.html - https://nextat.co.jp/staff/archives/235 - https://nextat.co.jp/staff/archives/236 RoadRunner 82