Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Очередь задач и многопоточность с помощью Gearman и ZF

Dd3f18c87b851137000c7427d7bd5d32?s=47 fwdays
November 24, 2012

Очередь задач и многопоточность с помощью Gearman и ZF

— Возможности Gearman, сервер, клиент, очередь задач, схема работы.
— Запуск и работа Zend Framework приложений в качестве обработчиков (workers)
— Проблемы при работе Zend Framework приложений в качестве обработчиков, их решения (память, перехват ошибок, общий доступ к данным)
— Работа с очередью: приоритет задач, уникальность задач в очереди, сохранение, очистка.
— Мониторинг системы, получение информации о количестве задач в очереди, количестве обработчиков на задачу на каждом сервере.
— Анализ информации об очереди и обработчиках, управление обработчиками, поддержание работы системы, балансировка.

Dd3f18c87b851137000c7427d7bd5d32?s=128

fwdays

November 24, 2012
Tweet

More Decks by fwdays

Other Decks in Programming

Transcript

  1. Многопоточность с помощью Gearman и ZF Прокопив Станислав INTERKASSA stas@interkassa.com

    hoodsmile
  2. Развитие проекта => увеличение нагрузки Решение проблемы: 1. Обработка в

    несколько потоков 2. Использовать очередь задач
  3. • Когда один поток уже не справляется… • Есть возможность

    прироста производительности • Нужно запустить некую обработку отдельно от основного процесса Зачем нам многопоточность?
  4. • Запуск еще одного скрипта (wget, curl) • Использование pcntl,

    fork() • Использование libevent, например PhpDaemon PHP, эмулируем)
  5. • Балансировать нагрузку • Избавиться от единой точки отказа •

    Выполнять бизнес-логику приложения асинхронно Зачем нам очередь?
  6. Zend_Queue • Memcachedq • Apache Active MQ • Zend_Db Очередь

  7. Что же выбрать? • Налаженное взаимодействие очереди и потоков •

    Достаточная документация • Контроль за процессом
  8. Возможности • Распределение нагрузки • Очередь задач • Мониторинг системы

    • Синхронная/асинхронная обработка • Приоритет задач
  9. Gearman • Open Source - Свободно распространяемый, с открытым кодом

    и вменяемым сообществом. • Мультиязычный - Интерфейсы для многих языков, может служить мостом • Гибкий - подходит любая архитектура типа Map/Reduce.
  10. Gearman • Быстрый - простой протокол, оптимизированный сервер • Легко

    внедряемый - легковесный, подходит как для существующих, так и новых приложений • Нет единой точки отказа – поможет не только масштабировать приложения, но и повысить отказоустойчивость
  11. Взаимодействие с Gearman Gearman Job Server Client Queue Client Worker

    task1 Worker task1 Worker task2 task1 task2
  12. Что нам остается? • Предоставить менеджеру работников, которые подпишутся на

    выполнение задания • Как клиент, общаться с ним и ставить ему задачи
  13. Организуем рассылку (например) 1. Создать worker’ы для отправки email, sms…

    2. Запустить их и подключить к серверу 3. Подключиться клиентом, отправить задания в очередь
  14. Требования к обработчикам • Использование бизнес-логики приложения • Наследование общих

    частей кода • Избегать процедурного стиля • Удобный запуск
  15. Интегрируем с ZF 1. Создаем точку входа – front controller

    2. Подключаем в bootstrap необходимые ресурсы 3. Используем Zend Gearman (mwGearman для ZF2) 4. В новый обработчик добавляем только логику Спасибо Mike Willbanks: http://blog.digitalstruct.com/2010/10/17/integrating-gearman-into-zend-framework/ https://github.com/mwillbanks/Zend_Gearman https://github.com/mwillbanks/mwGearman
  16. Новый обработчик class Sender extends Zend_Gearman_Worker { protected function _work()

    { //some logic } } Запуск: exec('php worker.php Sender > /dev/null &');
  17. Подключение к серверу Обработчик: $worker->addServer('127.0.0.1', 4730) $worker->addFunction('sendEmail', array(&$this, 'sendEmail')) Клиент:

    $client->addServer('127.0.0.1', 4730)
  18. Отправляем задачи в очередь • В качестве задания - только

    string • Задачи с одинаковыми id не попадают в очередь • Задачи убираются из очереди только после успешной обработки • Во время выполнения задача остается в очереди $gearmanClient->doBackground('sendEmail', serialize($params), $id)
  19. Схема работы: Асинхронный режим

  20. Рабочий процесс • Запущено несколько обработчиков • В очередь отправляются

    задания Это все нужно как-то контролировать…
  21. Мониторинг вручную Выполняем подключение через telnet на порт 4730 Доступные

    команды: • status – информация об очереди • workers – запущенные обработчики
  22. Status

  23. Workers

  24. Мониторинг в приложении • Реализован через сокеты в NetGearman •

    Если использовать pecl - есть несколько решений на github, тоже работают через сокеты https://github.com/yugene/Gearman-Monitor https://github.com/brianlmoon/GearmanManager
  25. Мониторинг в приложении

  26. Что может пойти не так? • Ошибки – важно отлавливать

    и не допускать падения обработчиков, возвращать корректный результат • Общий доступ к данным – полезно использовать uniqueId для каждой задачи, транзакции, select->forUpdate() • Память – следить за утечками памяти, вызывать garbage_collector, перезапускать обработчики, которые используют много памяти
  27. Поддержка работоспособности $status = $monitor->getTasksStatus(); foreach ($status as $taskname =>

    $states) { $workers = (int) $states['workers']; if ($workers < $neededAmount) { for($i = 1; $i <= $neededAmount - $workers; $i++) { exec('php worker.php '. $taskname .' > /dev/null &'); } } } 1. Получаем информацию о запущенных обработчиках 2. Запускаем недостающие
  28. Если есть срочная задача • Подходит логика обработчика • Запущено

    много задач, обработчики заняты Используем приоритеты: $gearmanClient->doHighBackground(); $gearmanClient->doLowBackground();
  29. Нужен результат • Если подходит логика обработчика • Но нам

    нужно подождать ответ Используем синхронную обработку: $gearmanClient->setCompleteCallback(‘callback’); $gearmanClient->do();
  30. Схема работы: Синхронный режим

  31. Советы • Делайте проверку соединения с бд • Используйте транзакции

    и select->forUpdate() • Записывайте processId • Оставляйте возможность остановки процесса обработчика по условию • Следите за размером лога gearmand
  32. Спасибо за внимание! stas@interkassa.com hoodsmile