Высокопроизводительные приложения Swoole
2024
О спикере
Сидоркин Алексей
В Т1 Консалтинг с ноября 2019
В разработке с 2015
Проекты
2
План
1
Архитектура Swoole и отличия в подходе от классического fpm
3
План
1
Архитектура Swoole и отличия в подходе от классического fpm
2
Основные абстракции, которые дает Swoole
4
План
1
Архитектура Swoole и отличия в подходе от классического fpm
2
Основные абстракции и возможности Swoole
3
Примеры использования Swoole
5
План
1
Архитектура Swoole и отличия в подходе от классического fpm
2
Основные абстракции и возможности Swoole
3
Примеры использования Swoole
4
Проблемы и решения при использовании Swoole
6
План
1
Архитектура Swoole и отличия в подходе от классического fpm
2
Основные абстракции и возможности Swoole
3
Примеры использования Swoole
4
Проблемы и решения при использовании Swoole
5
Перспективы развития Swoole, сравнение парадигм асинхронного подхода в разных языках
7
Swoole
Swoole — высокопроизводительной асинхронный и многопоточный фреймворк для PHP. Он отличается от традиционной модели PHP-FPM, предлагая асинхронный ввод-вывод и корутины, а также возможность работать с веб-сокетами и различными сетевыми протоколами непосредственно в PHP.
8
Класcическая архитектура php
9
Архитектура Swoole
Master процесс
Reactor поток
Timer поток
Процесс менеджер
Процесс worker
Процесс Taskworker
10
Архитектура Swoole
Master процесс — это первая точка входа на сервер OpenSwoole.
11
Архитектура Swoole
Reactor потоки - создаются в главном процессе для обработки сетевых подключений на стороне клиента и сетевого ввода-вывода.
12
Архитектура Swoole
Процесс-менеджер создает или уничтожает рабочие процессы и рабочие процессы задач.
13
Архитектура Swoole
Рабочий процесс получает данные из потоков Reactor и выполняет бизнес-логику, а затем отправляет ответ обратно в потоки Reactor.
Код приложения выполняется внутри рабочих процессов.
14
Архитектура Swoole
Процессы задач используются для кода, который содержит блокирующие операции, что бы не останавливать процесс выполнения основных воркеров или корутин.
15
Архитектура Swoole
Примерно так выглядит процесс обработки запросов:
16
Основные абстракции и возможности Swoole
серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC
17
Основные абстракции и возможности Swoole
серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC
Встроенное in Memory хранилище
18
Основные абстракции и возможности Swoole
серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC
Встроенное in Memory хранилище
Возможность запускать задачи по расписанию (cron)
19
Основные абстракции и возможности Swoole
серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC
Встроенное in Memory хранилище
Возможность запускать задачи по расписанию (cron)
Корутины и каналы, для работы с асинхронным кодом
20
Основные абстракции и возможности Swoole
серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC
Встроенное in Memory хранилище
Возможность запускать задачи по расписанию (cron)
Корутины и каналы, для работы с асинхронным кодом
Неблокирующие клиенты
21
Основные абстракции и возможности Swoole
серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC
Встроенное in Memory хранилище
Возможность запускать задачи по расписанию (cron)
Корутины и каналы, для работы с асинхронным кодом
Неблокирующие клиенты
Возможность запускать в отдельных воркерах блокирующие операции
22
Swoole Сервер
23
Swoole Глобальный Контекст
Вывод:
1 запрос - 1�2 запрос - 2�…
n запрос - n
24
Swoole Сервер Конфигурации
worker_num: Эта опция устанавливает количество рабочих процессов, которые будут обрабатывать входящие запросы. Рекомендуется установить значение, равное количеству ядер вашего процессора.���dispatch_mode: Эта опция управляет способом распределения входящих запросов между рабочими процессами. Значение 2 означает, что запросы будут равномерно распределены между рабочими процессами.
max_request: Эта опция устанавливает максимальное количество запросов, которые может обработать каждый worker-процесс перед его перезапуском. Это может помочь предотвратить утечку памяти.
Другие Опции Сервера: буферы, таймауты, лимиты.
25
Swoole Swoole\Server::task
Запуск и ожидание результата выполнения задачи
План выполнения задачи
26
Swoole Swoole\Server::task
27
Swoole Swoole\Table
28
Swoole Swoole\Timer
29
Swoole Swoole\Coroutine и Swoole\Channel
30
Промежуточные выводы
Для успешного запуска Swoole/Server в продакшн рекомендуется провести детальный просмотр конфигурации и подобрать оптимальные настройки перед запуском. Это позволит достичь лучшей производительности и избежать ошибок работы сервера.
31
Промежуточные выводы
Для успешного запуска Swoole/Server в продакшн рекомендуется провести детальный просмотр конфигурации и подобрать оптимальные настройки перед запуском. Это позволит достичь лучшей производительности и избежать ошибок работы сервера.
Максимально избегайте блокирующих операций в worker'ах. Для выполнения блокирующих операций используйте TaskWorker.
32
Промежуточные выводы
Для успешного запуска Swoole/Server в продакшн рекомендуется провести детальный просмотр конфигурации и подобрать оптимальные настройки перед запуском. Это позволит достичь лучшей производительности и избежать ошибок работы сервера.
Максимально избегайте блокирующих операций в worker'ах. Для выполнения блокирующих операций используйте TaskWorker.
Некорректно работают глобальные переменные, отсутствуют Сессии, Глобальный стейт требует аккуратного использования
33
Swoole примеры мини App
Структура:
.
├── composer.json
├── composer.lock
├── server.php
└── src
└── Controllers
├── AwayController.php
└── HelloController.php
34
Swoole примеры мини App
35
Swoole примеры мини App
36
Swoole примеры мини App
37
Swoole примеры мини App
38
Swoole примеры мини App
39
Swoole примеры мини App
40
Swoole примеры мини App
41
Swoole примеры мини App
42
Как попал в проект
Было
Стало
43
Портал Опубликованных вакансий
| Redis + native PHP | Swolle + global State |
TTFB | 35 мс | 2 мс |
RPS | 230 RPS | 2 000 RPS |
max time 75% | 246 ms | 23 ms |
min time | 43 ms | 9 ms |
44
Проблемы при использовании Swoole
Отсутствие нормальной работы с Супер Глобальными переменными
Отсутствие Сессий
Повышенное внимание при работе со statefull сервисами
Повышенное внимание при работе со statefull сервисами
DI тоже глобальный стейт (очищать между запросами)
45
Проблемы при использовании Swoole
https://github.com/chrisguitarguy/RequestIdBundle/blob/main/src/EventListener/RequestIdListener.php
46
Проблемы при использовании Swoole
47
Проблемы при использовании Swoole
doctrine - сильно течет по памяти
entity manager - Супер stateFull
Можно решить через Decorator
48
Проблемы при использовании Swoole
Проблема:�работа с постоянными коннекшенами требует организации retry
Решение:
49
Summary
1
Высокая производительность, высокие показатели TTFB и утилизация ресурсов.
2
Swoole - экосистема асинхронных io операций и клиентов, in Memory storege, различных серверов, Корутины, каналы, семафоры, мьютексы
3
Легкий старт и простота экосистемы.
4
Сложность миграции существующих проектов
5
Побочные эффекты от шаринга State, невозможность использования Глобальных переменных, отсутствие Session.
50
Дополнительная информация, �ссылки и код
Спасибо за внимание!
Вопросы?