Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Проблемы конкурентности
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Проблемы конкурентности. Kee 01.02.21 в 11:35 |
|
|
Один из главных недостатков PHP-FPM в том, что он связывает отдельное соединение с довольно тяжелым процессом, и неспособен динамически масштабироваться для обработки большего количества одновременных запросов. Kee 01.02.21 в 11:38 |
||
|
Представьте 100 запросов, пришедших одновременно, и 100 процессов, которые требуются для их обслуживания. Kee 01.02.21 в 11:40 |
||
|
Кроме того, представьте и 100 подключений к базе данных, поскольку открытое соединение с БД нельзя использовать повторно для других запросов. Kee 01.02.21 в 11:40 |
||
|
В теории, если мы будем рассматривать скрипт, который всего лишь возвращает "Hello world", процесс PHP будет выполнен за предсказуемый и короткий промежуток времени. Больших проблем не предвидится, задействованы только процессорные вычисления, и результат будет получен очень быстро. Kee 01.02.21 в 11:49 |
||
|
Но в реальности, современные веб-приложения всегда включают в себя и внешние операции ввода-вывода: они обращаются к базе данных, вызывают HTTP сервисы (к примеру, OAuth), выполняют массу дорогостоящих действий, вроде отправки почты, и так далее. Время ожидания результата внешних операций зачастую не поддаётся оценке, а по множеству причин результат может не вернуться вообще. И вот у нас куча процессов, ожидающих I/O, но не выполняющих на сервере ничего полезного. Kee 01.02.21 в 12:01 |
||
|
Общая идея при решении проблемы конкурентности - сделать процессы асинхронными. Мы рассмотрим несколько различных способов осуществления такой возможности. Kee 01.02.21 в 17:58 |
||
|
До того, как Swoole PHP и другие CLI фрейморки завоевали популярность, распространённым решением проблемы для отделения пользователя от внешних вызовов АПИ и запросов было использование очереди. Вам наверняка знакомы такие решения, как Redis, или очереди в базе данных из Laravel. На уровне приложения вы всего лишь помещали данные для задачи в очередь, а позже вызывали другой, фоновый процесс, который обрабатывал задачу асинхронно. Kee 02.02.21 в 10:02 |
||
|
Вот минус такого подхода: как только вы помещали данные для задачи в очередь, в текущем запросе у вас больше не было возможности контролировать ход исполнения. Вам приходилось снова опрашивать HTTP сервер, чтобы узнать, закончено ли выполнение фоновой задачи, или ещё нет. Kee 02.02.21 в 10:08 |
||
|
Синхронный процесс: Kee 02.02.21 в 10:13 |
||
|
Асинхронный процесс: Kee 02.02.21 в 10:23 |
||
|
Вот общее представление о том, как работают асинхронные процессы. Этот подход может быть использован при запросах с клиентской стороны (из браузера), и даже представлен в виде системных вызовов к ядру Linux для операций ввода-вывода. Kee 02.02.21 в 11:37 |
||
|
Клиентская сторона, вместо того, чтобы удерживать PHP процесс и ожидать ответа на текущий запрос, получает быстрое подтверждение о том, что задача поставлена в очередь, и проверяет результат выполнения другими запросами. Kee 02.02.21 в 11:43 |
||
|
Но проблема остаётся проблемой, ведь мы по-прежнему тратим ресурсы на дополнительные HTTP запросы, проверяя статус выполнения. Kee 02.02.21 в 11:44 |
||
|
Есть ли лучшее решение, чем терять ресурсы на таких запросах? Kee 02.02.21 в 11:45 |
||
|
В этом великая сила решения - клиентские I/O больше не привязаны к процессам Linux. Kee 02.02.21 в 11:53 |
||
|
Вы можете заметить, что некоторые безсерверные сервисы, вроде AWS Lambda, до сих пор не отделяют клиентский I/O от процессов Linux. Решение не самое лучшее, и мы надеемся, что со временем они пересмотрят свой подход. Kee 02.02.21 в 12:12 |
