Многозадачность в PHP
Владислав Грязнов
interkassa.com
vlad.groznov@gmail.com
info@cronar.io
Структура доклада
● Проблематика
○ Этапы разработки ПО
○ Поддержка
○ Автоматизация
● Очевидные решения
○ Кейсы
○ Проблемы
○ Требования к универсальному решению
● Теория
○ Параллельные вычисления
○ PHP создан, чтобы умирать
○ Терминология
○ Очередь сообщений (Message Queue)
● Продвинутые решения
○ Очереди сообщений
○ Процессы в PHP
○ Готовые решения
● Cronar.io
○ Выбранный инструментарий
○ Общая схема
○ Типовые проблемы и их решения
○ Почему нам нужно наше решение
● Выводы
○ Good practice
○ Перспективы
ПРОБЛЕМАТИКА
Классические этапы разработки ПО
● Багфиксинг
● Работа с данными (Отчеты,
Статистика)
● Обновление информации
(не через админку)
● Новые бизнес-процессы,
рожденные после запуска
(сверки, контракты ... )
● Увеличение нагрузки
Поддержка
Пробовали включить и выключить?
Идея #1: Автоматизировать процессы
Идея #2: Создать центр управления полетами
ОЧЕВИДНЫЕ РЕШЕНИЯ
Backup по расписанию
Экспорт платежей из ПС
Пришлите мне на почту в 10:00 экспорт платежей из ПС
Дайте возможность самому устанавливать когда и кому
отправлять файл экспорта!
А теперь нужно отправлять 100к пользователям
Очевидные решения
Задача: Экспорт платежей
Решение: CLI-скрипт
Очевидные решения
Задача: Экспорт платежей
Выслать на почту в 10:00
Решение: допилить CLI-скрипт
+ настроить Cron
Очевидные решения
Задача: Экспорт платежей
Выслать на почту в 10:00
Предоставить контроль над “когда” и “кому”
Решение: допилить CLI-скрипт
+ админ панель
+ прикрутить редактор cron задач (???)
Очевидные решения
Задача: Экспорт платежей
Выслать на почту в 10:00
Предоставить контроль над “когда” и “кому”
Отправлять всем 1000k пользователям
Индивидуальные экспорты
Очевидные решения
● Контроль результата выполнения
● Отладка процесса обработки очереди задач
● Обработка ошибок
● Повторение в случае ошибок (попытки)
● Одновременная обработка нескольких задач в очереди
● Борьба за ресурсы воркерами
● Повторение кода в скриптах (бывает)
● Избыточность траты ресурсов сервера
● Масштабирование (разные ноды, разные списки)
● Согласованность задач (последовательность выполнения
задач)
● Отсутствие дубликатов и одновременного выполнения
● Управление задачами (массой в кроне)
● Мониторинг выполнения задач
● Периодическое повторение задачи
Проблемы
● Уровни доступа для управления (ACL)
● Масштабируемость (на разные ноды)
● Согласованность (между нодами)
● Контроль (память, процессы, нагрузка)
● Мониторинг (GUI, CLI)
● Легкость интеграции в любой PHP проект
● Минимум зависимостей
● Минимум кода
● Цепочки задач
● Шаблоны задач
● Планировщик задач
● Синхронная / Асинхронная обработка задач
● Балансировка процессов
Требования к универсальному решению
ТЕОРИЯ
Архитектура веб-приложения
PHP code
Front Server
Application Server
DB / Memory / NOSQL
Client
https://youtu.be/NI7FY9is62g
Параллельное вычисление:
PHP создан, чтоб умирать!
...
Параллельное вычисление:
PHP создан, чтоб умирать!
Параллельное вычисление:
PHP создан, чтоб умирать!
● memory limit
● Утечка памяти
○ Циклические ссылки
○ Extensions
● time limit (default: 30 sec)
● GC (Garbage collection)
Параллельное вычисление:
PHP создан, чтоб умирать!
● Команда...
● Поддержка 2х решений...
● Накладные расходы...
Параллельное вычисление: Модель акторов
Концепции
● отправить конечное
число сообщений другим
акторам
● создать конечное число
новых акторов
● выбрать тип поведения,
которое будет
использоваться для
следующего сообщения
в свой адрес.
возникла в 1973 году
http://www.slideshare.net/OmskIT/20131109-03
Worker
Queue
Producer
Daemon
Job
WorkerManager
Client
McDonalds over PHP
Очередь
● Слабое связывание
● Избыточность
● Масштабируемость
● Эластичность и возможность выдерживать пиковые нагрузки
● Отказоустойчивость
● Гарантированная доставка
● Гарантированный порядок доставки
● Буферизация
● Понимание потоков данных
● Асинхронная связь
Y C C XXAppAppApp Worker
список сообщений
Process 1
thread 2
thread 3
Memory
Memory
Process 1
Process N
...
Process N
Memory
Code
Code
Code
Multiprocessing Multithreading
Процессы
ПРОДВИНУТЫЕ РЕШЕНИЯ
Очередь сообщений
● RabbitMQ
● ZeroMQ
● ActiveMQ
● Beanstalkd
● ...
Очереди сообщений
Очередь сообщений
Очереди сообщений: Benchmark
Очередь сообщений
Очереди сообщений: Benchmark
Очередь сообщений
RabbitMQ
● простой в использовании и развертывании
● за крутой роутинг и сохранность данных платим скоростью
● очень гибкий
● 4 протокола
ZeroMQ (для мелких сообщений)
● предназначена для легких и очень шустрых сообщений
● для реализации дополнительные сценариев нужно будет
чуть-чуть попотеть самому
ActiveMQ
● рядом с RabbitMQ
● легче реализовать дополнительные сценарии за счет чистой
производительности
● Это швейцарский армейский нож
Beanstalkd
● вообще ничего лишнего
● классное flow задачи из коробки
Очереди сообщений
Процессы:
POSIX
стандарт
● Основные определения (Base definitions)
● Оболочка и утилиты (Shell and utilities)
● Системные интерфейсы (System interfaces)
● Обоснование
● Переноса кода
● Унификации интерфейсов
Main process
$pid1 = pcntl_fork();
Child 1 process
say_hello_to_Kate();
Main process
$pid2 = pcntl_fork();
Main process Child 1 process
say_hello_to_Nata();
● Zombie process
● Catch Errors
● File Descriptors (reconnect DB)
● Communication using
part of shared memory
$pid1 == 0$pid1 > 0
$pid2 == 0$pid2 > 0
https://github.com/kriswallsmith/spork
Процессы: PHP PCNTL
Features found:
Процессы: PHP PThreads
share
nothing
architecture
Memory
Memory
Memory
Process
Thread
Thread
Процессы: в PHP
PHP Pthreads !== Posix Threads
just copy memory
PCNTL
resource descriptors fail (reconnect DB)
share
nothing
architecture
Процессы: Наблюдение за процессами
● Cron - system
● SystemD - system
● SupervisorD - python
● Forever - nodejs
● Terminal - handmade
● shell_exec - handmade
ГОТОВЫЕ РЕШЕНИЯ
Очередь задач и многопоточность с помощью Gearman и ZF
SupervisorD
Server
Gearman
Proccess
Manager
Worker
PHPPHPPHP
Queue
Application
PHP
https://github.com/gearman
Готовые решения: Gearman
last update 2012
Готовые решения: Gearman
PHP
PHP-Resque Worker
PHP
Queue
Application
PHP
https://github.com/chrisboulton/php-resque
pcntl_fork
REDIS
PHP
Готовые решения: PHP-Resque
CRONARIO
CRONARIO
● PHP 5.3+
● PHP Extension Pthreads
● Redis
Cronario: Выбранные инструменты
<OS>
POSIX
REDIS
Producer
Process
Manager
Queue
Monitor
Control panel
DBJobs
GUI
Daemon
Balancer
Facade
MongoDb
MySQL
Cronario: Архитектура
Producer
Process
Manager
Queue
new Job();
Cronario: Схема работы
Jobs
DB
Worker
create
save Job put ID
create
process
get job ID
1 create worker
2 lopp
- get Job
- worker do
1. Центральное управление задачами
2. Синхронная / Асинхронная обработка задач
3. Балансировка асинхронных процессов (автоматическая, ручная)
4. Контроль (память, процессы, нагрузка)
5. Удобный мониторинг
6. Мониторинг (GUI, CLI)
7. Цепочки задач
8. Планировщик задач
Cronario: Почему нам нужен
ВЫВОДЫ
1. Пользуйтесь очередями
2. Храните в очереди идентификаторы задач
3. Делите большие задачи на более мелкие
4. Пакетно обрабатывайте типовые задачи (bulk)
5. Читайте, изучайте тесты к пакетам
Выводы: Good Practice
Перспективы
phpDaemon
— asynchronous application framework
ReactPHP
— asynchronous I/O (node.js) experimental
AppServer.io
— server writen on PHP
http://cronar.io
https://github.com/cronario
Cronario
do jobs like a boss
Cronario: OpenSource
Спасибо за внимание!
Спасибо за внимание!Вопросы?
1. https://ru.wikipedia.org/wiki/Cron
2. http://queues.io/
3. http://gearman.org/
4. http://daemon.io/
5. http://appserver.io/
6. http://massivescale.net/celery-php/
7. https://en.wikipedia.org/wiki/Actor_model
8. https://en.wikipedia.org/wiki/Concurrent_computing
9. https://ru.wikipedia.org/wiki/RabbitMQ
10. http://www.mullie.eu/parallel-processing-multi-tasking-php/
11. http://php.net/manual/ru/refs.fileprocess.process.php
12. http://php.net/manual/en/book.pcntl.php
13. http://stackoverflow.com/questions/731233/activemq-or-rabbitmq-or-
zeromq-or/1687696#1687696
14. http://blog.x-aeon.com/2013/04/10/a-quick-message-queue-
benchmark-activemq-rabbitmq-hornetq-qpid-apollo/
15. https://github.com/chrisboulton/php-resque
16. http://habrahabr.ru/post/165981/
17. http://habrahabr.ru/post/179399/
Материалы для доклада

Владислав Грязнов "Многозадачность в PHP"