1 of 51

Высокопроизводительные приложения Swoole

2024

2 of 51

О спикере

Сидоркин Алексей

В Т1 Консалтинг с ноября 2019

В разработке с 2015

Проекты

  • CRM банка Зенит
  • ERP компании «Мое Дело»
  • CRM Национальное Рейтинговое Агентство
  • НОТА ЮНИОН�(группа продуктов HR Tech)

2

3 of 51

План

1

Архитектура Swoole и отличия в подходе от классического fpm

3

4 of 51

План

1

Архитектура Swoole и отличия в подходе от классического fpm

2

Основные абстракции, которые дает Swoole

4

5 of 51

План

1

Архитектура Swoole и отличия в подходе от классического fpm

2

Основные абстракции и возможности Swoole

3

Примеры использования Swoole

5

6 of 51

План

1

Архитектура Swoole и отличия в подходе от классического fpm

2

Основные абстракции и возможности Swoole

3

Примеры использования Swoole

4

Проблемы и решения при использовании Swoole

6

7 of 51

План

1

Архитектура Swoole и отличия в подходе от классического fpm

2

Основные абстракции и возможности Swoole

3

Примеры использования Swoole

4

Проблемы и решения при использовании Swoole

5

Перспективы развития Swoole, сравнение парадигм асинхронного подхода в разных языках

7

8 of 51

Swoole

Swoole — высокопроизводительной асинхронный и многопоточный фреймворк для PHP. Он отличается от традиционной модели PHP-FPM, предлагая асинхронный ввод-вывод и корутины, а также возможность работать с веб-сокетами и различными сетевыми протоколами непосредственно в PHP.

8

9 of 51

Класcическая архитектура php

9

10 of 51

Архитектура Swoole

Master процесс

Reactor поток

Timer поток

Процесс менеджер

Процесс worker

Процесс Taskworker

10

11 of 51

Архитектура Swoole

Master процесс — это первая точка входа на сервер OpenSwoole.

11

12 of 51

Архитектура Swoole

Reactor потоки - создаются в главном процессе для обработки сетевых подключений на стороне клиента и сетевого ввода-вывода.

12

13 of 51

Архитектура Swoole

Процесс-менеджер создает или уничтожает рабочие процессы и рабочие процессы задач.

13

14 of 51

Архитектура Swoole

Рабочий процесс получает данные из потоков Reactor и выполняет бизнес-логику, а затем отправляет ответ обратно в потоки Reactor.

Код приложения выполняется внутри рабочих процессов.

14

15 of 51

Архитектура Swoole

Процессы задач используются для кода, который содержит блокирующие операции, что бы не останавливать процесс выполнения основных воркеров или корутин.

15

16 of 51

Архитектура Swoole

Примерно так выглядит процесс обработки запросов:

  1. Клиент отправляет запрос, который принимается реакторным потоком Master-процесса.
  2. Реакторный поток передает данные в рабочий процесс для выполнения основной бизнес-логики.
  3. Рабочий процесс может обрабатывать запрос сам или делегировать выполнение задач задачным процессам.
  4. Задачный процесс возвращает результат в рабочий процесс, который затем отправляет данные обратно клиенту через реакторный поток.

16

17 of 51

Основные абстракции и возможности Swoole

серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC

17

18 of 51

Основные абстракции и возможности Swoole

серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC

Встроенное in Memory хранилище

18

19 of 51

Основные абстракции и возможности Swoole

серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC

Встроенное in Memory хранилище

Возможность запускать задачи по расписанию (cron)

19

20 of 51

Основные абстракции и возможности Swoole

серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC

Встроенное in Memory хранилище

Возможность запускать задачи по расписанию (cron)

Корутины и каналы, для работы с асинхронным кодом

20

21 of 51

Основные абстракции и возможности Swoole

серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC

Встроенное in Memory хранилище

Возможность запускать задачи по расписанию (cron)

Корутины и каналы, для работы с асинхронным кодом

Неблокирующие клиенты

21

22 of 51

Основные абстракции и возможности Swoole

серверы: HTTP, UDP, TCP, WebSocket, MQTT, GRPC

Встроенное in Memory хранилище

Возможность запускать задачи по расписанию (cron)

Корутины и каналы, для работы с асинхронным кодом

Неблокирующие клиенты

Возможность запускать в отдельных воркерах блокирующие операции

22

23 of 51

Swoole Сервер

23

24 of 51

Swoole Глобальный Контекст

Вывод:

1 запрос - 1�2 запрос - 2�…

n запрос - n

24

25 of 51

Swoole Сервер Конфигурации

worker_num: Эта опция устанавливает количество рабочих процессов, которые будут обрабатывать входящие запросы. Рекомендуется установить значение, равное количеству ядер вашего процессора.���dispatch_mode: Эта опция управляет способом распределения входящих запросов между рабочими процессами. Значение 2 означает, что запросы будут равномерно распределены между рабочими процессами.

max_request: Эта опция устанавливает максимальное количество запросов, которые может обработать каждый worker-процесс перед его перезапуском. Это может помочь предотвратить утечку памяти.

Другие Опции Сервера: буферы, таймауты, лимиты.

25

26 of 51

Swoole Swoole\Server::task

Запуск и ожидание результата выполнения задачи

План выполнения задачи

26

27 of 51

Swoole Swoole\Server::task

27

28 of 51

Swoole Swoole\Table

28

29 of 51

Swoole Swoole\Timer

29

30 of 51

Swoole Swoole\Coroutine и Swoole\Channel

30

31 of 51

Промежуточные выводы

Для успешного запуска Swoole/Server в продакшн рекомендуется провести детальный просмотр конфигурации и подобрать оптимальные настройки перед запуском. Это позволит достичь лучшей производительности и избежать ошибок работы сервера.

31

32 of 51

Промежуточные выводы

Для успешного запуска Swoole/Server в продакшн рекомендуется провести детальный просмотр конфигурации и подобрать оптимальные настройки перед запуском. Это позволит достичь лучшей производительности и избежать ошибок работы сервера.

Максимально избегайте блокирующих операций в worker'ах. Для выполнения блокирующих операций используйте TaskWorker.

32

33 of 51

Промежуточные выводы

Для успешного запуска Swoole/Server в продакшн рекомендуется провести детальный просмотр конфигурации и подобрать оптимальные настройки перед запуском. Это позволит достичь лучшей производительности и избежать ошибок работы сервера.

Максимально избегайте блокирующих операций в worker'ах. Для выполнения блокирующих операций используйте TaskWorker.

Некорректно работают глобальные переменные, отсутствуют Сессии, Глобальный стейт требует аккуратного использования

33

34 of 51

Swoole примеры мини App

Структура:

.

├── composer.json

├── composer.lock

├── server.php

└── src

└── Controllers

├── AwayController.php

└── HelloController.php

34

35 of 51

Swoole примеры мини App

35

36 of 51

Swoole примеры мини App

36

37 of 51

Swoole примеры мини App

37

38 of 51

Swoole примеры мини App

38

39 of 51

Swoole примеры мини App

39

40 of 51

Swoole примеры мини App

40

41 of 51

Swoole примеры мини App

41

42 of 51

Swoole примеры мини App

42

43 of 51

Как попал в проект

Было

Стало

43

44 of 51

Портал Опубликованных вакансий

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

45 of 51

Проблемы при использовании Swoole

Отсутствие нормальной работы с Супер Глобальными переменными

Отсутствие Сессий

Повышенное внимание при работе со statefull сервисами

Повышенное внимание при работе со statefull сервисами

DI тоже глобальный стейт (очищать между запросами)

45

46 of 51

Проблемы при использовании Swoole

https://github.com/chrisguitarguy/RequestIdBundle/blob/main/src/EventListener/RequestIdListener.php

46

47 of 51

Проблемы при использовании Swoole

47

48 of 51

Проблемы при использовании Swoole

doctrine - сильно течет по памяти

entity manager - Супер stateFull

Можно решить через Decorator

48

49 of 51

Проблемы при использовании Swoole

Проблема:�работа с постоянными коннекшенами требует организации retry

Решение:

  • Обернуть конекшен в фабрику с инициализацией подключения, и сбросом после операции.

  • Обернуть в Декоратор с retry или ping

49

50 of 51

Summary

1

Высокая производительность, высокие показатели TTFB и утилизация ресурсов.

2

Swoole - экосистема асинхронных io операций и клиентов, in Memory storege, различных серверов, Корутины, каналы, семафоры, мьютексы

3

Легкий старт и простота экосистемы.

4

Сложность миграции существующих проектов

5

Побочные эффекты от шаринга State, невозможность использования Глобальных переменных, отсутствие Session.

50

51 of 51

Дополнительная информация, �ссылки и код

Спасибо за внимание!

Вопросы?