SlideShare a Scribd company logo
1 of 56
Александр Готгельф Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue
Job Queue
Очередь сообщений client    server request getting request some tasks response response Синхронная обработка
Очередь сообщений client    server request getting request response response some tasks Асинхронная обработка
Очередь сообщений Message system (servers) message1 message handler1 message2 message3 message handler2 message4 Backend message handler3 .... Frontend Так что же такое очередь сообщений?
Очередь сообщений Масштабируемость Производительность
Zend Server Job Queue we   Web Servers      Job Queue Протокол   Я Job Queue Daemon Backend Severs      http Request
Zend Server Job Queue
Zend Server Job Queue Триггеры – результат взаимодействия Аналогия cron job Оптимизация системы, очистка базы... Job Queue Api
Zend Server Job Queue Пример – стандартный подход <?php function processingData($data) { if ( обработка $data) { returnTRUE; } else{ returnFALSE; } } // здесь мы вызываем функцию processingData для обработки данных($_POST['data']);
Zend Server Job Queue Пример – подход с использованием job queue API <?php $data=$_POST['data']; $q=new ZendJobQueue(); $ts= date('Y-m-d H:i:s', time()+10); $id=$q->createHttpJob('/jobs/processing_data.php', 	array('data'=>$data), 	array('name'=>'processing datausing a single job  	execution scheduled to run after 10	seconds','schedule_time'=>$ts)); if(!$id){ exit(1); }
Zend Server Job Queue Пример – подход с использованием job queue API Job script: <?php function processingData($data) { if( обработка $data){ return ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); } else{ return 	 	ZendJobQueue::setCurrentJobStatus(ZendJobQueue::FAILED); } } $params= ZendJobQueue::getCurrentJobParams(); processingData($params['data']); ?>
Zend Server Job Queue мониторинг
Zend Server Job Queue мониторинг
Gearman Инсталляция: Качаем Сервер: http://gearman.org/index.php?id=download tar -xvzf gearmand-version.tar.gz  cd gearmand  ./configure  make; make install
Инсталляция: Gearman Устанавливаем php extension pecl download gearman-0.7.0  tar -xvf gearman-0.7.0.tgz  cd gearman-0.7.0  phpize  ./configure  make  make install
Инсталляция: Gearman Добавляем  “extension=gearman.so” в php.ini Результат:
Gearman Application code Gearman Client  API  Application Я - Gearman Job Sever            (gearmand) Gearman Worker API Application code
Gearman Gearman включает в себя три основных компоненты: Client – создает задачи (jobs)для выполнения и отсылает их jobсерверу Job Server (gearmand) – координирует взаимодействие между clients и workers Worker – регистрируется у  jobсервера и забирает задачи для выполнения
Gearman Принцип работы gearmand gearmand gearmand       call(“funcB”) can_do(“funcA”) can_do(“funcA”) call(“funcA”) can_do(“funcB”) client client worker worker
Gearman
Gearman Создание задачи: GearmanClient::do выполняет одну задачу и возвращает результат  client.php GearmanClient::doBackground выполняет задачуасинхронно GearmanClient::addTask добавляет задачи в параллель, GearmanClient::runTasks  выполняет пул задач(параллельно)
Gearman пример: worker.php <?php $worker=new GearmanWorker(); $worker->addServer('127.0.0.1'); $worker->addFunction("reverse","reverse_fn"); while(1){ print"Waiting for job..."; $ret=$worker->work(); if($worker->returnCode()!= GEARMAN_SUCCESS) break; }
Gearman пример: <?php function reverse_fn($job){ $workload=$job->workload(); echo"Received job: ".$job->handle().""; echo"Workload: $workload"; $result= strrev($workload); $workload_size=$job->workloadSize(); for($i=0;$i<$workload_size;$i++){ $job->sendStatus($i+1,$workload_size); $job->sendData(substr($workload,$i,1));         sleep(1); } echo"Result: $result"; return$result; } worker.php
Gearman пример: <? $client=new GearmanClient(); $client->addServer(); $client->setOptions(GEARMAN_CLIENT_FREE_TASKS); $client->setCompleteCallback("done"); $client->setDataCallback("data"); $task1=$client->addTask("reverse","ABC123"); $task2=$client->addTask("reverse","BC123"); $result=$client->runTasks(); function done($task){ echo"COMPLETE: ".$task->jobHandle().", ". $task->data().""; } function data($task){ echo"DATA: ".$task->data().""; }  client.php s
Gearman Наблюдаем результат:
Gearman Использование:
Gearman Полезно!      telnet localhost 4730 workers 13 127.0.0.1 - : reverse 12 127.0.0.1 - : reverse 11 127.0.0.1 - :
Gearman 45+servers, 400K jobs/day 60+servers, 6M jobs/day
Job Queue: применение Асинхронные очереди Map/Reduce URL обработка          Анализ логов и агрегация              Работа с RSS фидами                 Обработка и анализ логов
Job Queue: применение (логи) Apache Node2 access_log client Apache Node1 access_log client Apache Node2 access_log client Gearman job server Worker Log Data Worker Worker Log Data Worker Worker Log Data Worker Gearman job server Client Анализ логов Client tail  -f
Job Queue: применение (логи) tail -f test | gearman -n -h localhost -f logger имя файла Шлет пакет данных для каждой линии хост имя функции для воркера
Job Queue: электронная комерция   Market Basket Analysis Анализ комбинаций покупаемых продуктов Время покупки Последовательность выбора
Job Queue: электронная комерция Импорт/Экспорт сушностей
Job Queue: электронная комерция Анализ кликов
Job Queue: электронная комерция Системы отчетов
Job Queue Действительно ли применение рассмотренных технолоний способно принести выйгрыш в производительности? 	Попробуем дать ответ с помощью примера. У нас есть внешний источник данных, которые нужно обработать и сохранить в базе. Причем сохранять данные нужно по одной единице, так как каждая из них требует дополнительную обработку.
Job Queue: Statistics
Job Queue: стандартный подход    :IndexController simpleImportAction() create() : Application_Model_DbTable_Products importData()
Job Queue: стандартный подход <?php class Application_Model_DbTable_Products extends Zend_Db_Table_Abstract { publicfunction importData() { 	… 	while(($data= fgetcsv($handle,10000000,';'))!==false){ $data[1]=$this->processingData($data[1]); $data=array( 'product'=>$data[0], 'sku'=>$data[1], 'insert_time'=>null, ); $this->insert($data); }         fclose($handle); } …
Job Queue: стандартный подход <?php class Application_Model_DbTable_Products extends Zend_Db_Table_Abstract { ... publicfunction processingData($data) { $data= str_repeat($data,1000); for($i=0;$i<=10;$i++){ $data= str_shuffle($data); } return$data; } ..
Job Queue: Gearman :GearmanController gearmanImportAction() create() :GearmanClient gearmand  loop [i < JOB_QTY] addTaskBackground() runTasks()
Job Queue: Gearman  worker : Application_Model_Gearmanworkers_ImportWorker create() addServer() addFunction("import", array(worker, "import"))
Job Queue: Gearman worker.php <?php class GearmanController extends Zend_Controller_Action { publicfunction importWorkerAction() { 	$worker=new Application_Model_Gearmanworkers_ImportWorker(); 	$worker->addServer(); 	$worker->addFunction("import",array($worker,"import")); print"Waiting for job..."; while($worker->work()) { if($worker->returnCode()!= GEARMAN_SUCCESS) { echo"return_code: ".$worker->returnCode().""; break; } } } }
Job Queue: Gearman client.php <?php class GearmanController extends Zend_Controller_Action { publicfunction gearmanImportAction() {         … # Create our client object. $client=new GearmanClient(); # Add default server (localhost). $client->addServer(); # Send reverse job for($i=1;$i<= Application_Model_File::JOB_QTY;$i++){           ${'task'.$i}=$client->addTaskBackground("import","$i"); } $client->runTasks();         … }
Job Queue: Zend Server Job Queue :ZendController zendImportAction() create() queue : ZendJobQueue  loop [i < JOB_QTY] createHttpJob()
Job Queue: Zend Server Job Queue <?php class ZendController extends Zend_Controller_Action { publicfunction zendImportAction() { ... $queue=new ZendJobQueue(); ... for($i=1;$i<= Application_Model_File::JOB_QTY;$i++){ $queue->createHttpJob( 'http://localhost/queue/public/zend/zend-job', array('id'=>$i)); } ... }     … }
Job Queue: Zend Server Job Queue <?php class ZendController extends Zend_Controller_Action {            … publicfunction zendJobAction() { $params= ZendJobQueue::getCurrentJobParams(); $id=$params['id']; # processing and insert products         ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); exit; } }
Job Queue: Statistics JOB_QTY = 1
Job Queue: Statistics JOB_QTY = 2
Job Queue: Statistics JOB_QTY = 5
Job Queue: Statistics PRODUCT_QTY = 100000
Job Queue - альтернативы Beanstalkd - http://kr.github.com/beanstalkd/ PHP Client: pheanstalk Dropr - https://github.com/s0enke/dropr/ Apache ActiveMQ - http://activemq.apache.org/ MemcacheQ queuing memcacheDB berkleyDB Redis Couchdb Tokyo Cabinet
Job Queue В погоне за производительностью не забывайте о масштабируемости
Job Queue
Job Queue Мои контакты: E-mail: gotgelf@gmail.com Skype: ramzes3988

More Related Content

What's hot

View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agencyit-people
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupTimophy Chaptykov
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновYandex
 
Все дороги ведут в Checkout
Все дороги ведут в CheckoutВсе дороги ведут в Checkout
Все дороги ведут в CheckoutMagecom Ukraine
 
Курсы актерского мастерства
Курсы актерского мастерстваКурсы актерского мастерства
Курсы актерского мастерстваVasil Remeniuk
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиціShtrih Sruleg
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.jsMad Devs
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...Mail.ru Group
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьYandex
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеPython Meetup
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьYandex
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеAlexander Byndyu
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Ontico
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.MageCloud
 

What's hot (20)

View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
 
Что API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон КорзуновЧто API Карт забыл на сервере — Антон Корзунов
Что API Карт забыл на сервере — Антон Корзунов
 
Все дороги ведут в Checkout
Все дороги ведут в CheckoutВсе дороги ведут в Checkout
Все дороги ведут в Checkout
 
Курсы актерского мастерства
Курсы актерского мастерстваКурсы актерского мастерства
Курсы актерского мастерства
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
JS утиліти WordPress на практиці
JS утиліти WordPress на практиціJS утиліти WordPress на практиці
JS утиліти WordPress на практиці
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря Groovy
 
Javascript
JavascriptJavascript
Javascript
 
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
«QuickCheck в Python: проверка гипотез и поиск ошибок», Александр Шорин, Ramb...
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Михаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. АсинхронностьМихаил Давыдов - JavaScript. Асинхронность
Михаил Давыдов - JavaScript. Асинхронность
 
Очередной скучный доклад про логгирование
Очередной скучный доклад про логгированиеОчередной скучный доклад про логгирование
Очередной скучный доклад про логгирование
 
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)Язык программирования Scala / Владимир Успенский (TCS Bank)
Язык программирования Scala / Владимир Успенский (TCS Bank)
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.
 

Viewers also liked

Hi,Cheese!!! - 1st draft
Hi,Cheese!!! - 1st draftHi,Cheese!!! - 1st draft
Hi,Cheese!!! - 1st draftdddartwax
 
Why businesses should talktojason the Leeds public relations and communicatio...
Why businesses should talktojason the Leeds public relations and communicatio...Why businesses should talktojason the Leeds public relations and communicatio...
Why businesses should talktojason the Leeds public relations and communicatio...Jason Kelly
 
Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...
Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...
Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...Kalle
 
Flex automation. tools comparison
Flex automation. tools comparisonFlex automation. tools comparison
Flex automation. tools comparisonAlex
 
Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010BertilVoogd
 
Galiciasindial11
Galiciasindial11Galiciasindial11
Galiciasindial11oscargaliza
 
Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0
Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0
Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0en casa
 
Estatal comercio convenio_alec_2010_12
Estatal comercio convenio_alec_2010_12Estatal comercio convenio_alec_2010_12
Estatal comercio convenio_alec_2010_12oscargaliza
 
עונשים בצבא
עונשים בצבאעונשים בצבא
עונשים בצבאhaimkarel
 
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry ApplicationsMorimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry ApplicationsKalle
 
ParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeatherParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeatherSenoraAmandaWhite
 

Viewers also liked (20)

Hi,Cheese!!! - 1st draft
Hi,Cheese!!! - 1st draftHi,Cheese!!! - 1st draft
Hi,Cheese!!! - 1st draft
 
testeeeestes
testeeeestestesteeeestes
testeeeestes
 
Why businesses should talktojason the Leeds public relations and communicatio...
Why businesses should talktojason the Leeds public relations and communicatio...Why businesses should talktojason the Leeds public relations and communicatio...
Why businesses should talktojason the Leeds public relations and communicatio...
 
Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...
Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...
Porta Ce Cursor A Contextual Eye Cursor For General Pointing In Windows Envir...
 
ลักษณะภูมิประเทศของทวีปยุโรป
ลักษณะภูมิประเทศของทวีปยุโรปลักษณะภูมิประเทศของทวีปยุโรป
ลักษณะภูมิประเทศของทวีปยุโรป
 
ความสัมพันธ์ทางเศรษฐกิจ
ความสัมพันธ์ทางเศรษฐกิจความสัมพันธ์ทางเศรษฐกิจ
ความสัมพันธ์ทางเศรษฐกิจ
 
Flex automation. tools comparison
Flex automation. tools comparisonFlex automation. tools comparison
Flex automation. tools comparison
 
Acta ci 150910
Acta ci 150910Acta ci 150910
Acta ci 150910
 
Acta 110929
Acta 110929Acta 110929
Acta 110929
 
Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010Inlichtingenfunctie Presentatie 17 3 2010
Inlichtingenfunctie Presentatie 17 3 2010
 
Galiciasindial11
Galiciasindial11Galiciasindial11
Galiciasindial11
 
Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0
Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0
Toxicidad de neonicotinoides a largo plazo tennekes 2010 toxicology_0
 
Cd covers
Cd coversCd covers
Cd covers
 
Estatal comercio convenio_alec_2010_12
Estatal comercio convenio_alec_2010_12Estatal comercio convenio_alec_2010_12
Estatal comercio convenio_alec_2010_12
 
עונשים בצבא
עונשים בצבאעונשים בצבא
עונשים בצבא
 
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry ApplicationsMorimoto Context Switching For Fast Key Selection In Text Entry Applications
Morimoto Context Switching For Fast Key Selection In Text Entry Applications
 
Web 2 0
Web 2 0Web 2 0
Web 2 0
 
Statby school 2553_m6_1057012007
Statby school 2553_m6_1057012007Statby school 2553_m6_1057012007
Statby school 2553_m6_1057012007
 
ParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeatherParaEmpezarSeasonsandWeather
ParaEmpezarSeasonsandWeather
 
Vpn
VpnVpn
Vpn
 

Similar to ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)

20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1Michael Karpov
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Oleg Poludnenko
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in railssergeymoiseev
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalAndrei Solntsev
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoMoscowDjango
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf Conference
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Pavel Novitsky
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Alex Tumanoff
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debuggingaheadWorks
 
Программирование на PySpark
Программирование на PySparkПрограммирование на PySpark
Программирование на PySparkRamblerML
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demomegakott
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 

Similar to ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф) (20)

20090720 hpc exercise1
20090720 hpc exercise120090720 hpc exercise1
20090720 hpc exercise1
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
 
бегун
бегунбегун
бегун
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
Functional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - finalFunctional Programming Dev Club 2009 - final
Functional Programming Dev Club 2009 - final
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Разработка расширяемых приложений на Django
Разработка расширяемых приложений на DjangoРазработка расширяемых приложений на Django
Разработка расширяемых приложений на Django
 
бегун
бегунбегун
бегун
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
ZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and DoctrineZFConf 2010: Zend Framework and Doctrine
ZFConf 2010: Zend Framework and Doctrine
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2Mike ponomarenko java17-fork-v1.2
Mike ponomarenko java17-fork-v1.2
 
Magento code debugging
Magento code debuggingMagento code debugging
Magento code debugging
 
Программирование на PySpark
Программирование на PySparkПрограммирование на PySpark
Программирование на PySpark
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Saint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demoSaint Perl 2009: CGI::Ajax demo
Saint Perl 2009: CGI::Ajax demo
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
course js day 4
course js day 4course js day 4
course js day 4
 

More from ZFConf Conference

ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf Conference
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf Conference
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf Conference
 
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf Conference
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf Conference
 
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf Conference
 
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf Conference
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf Conference
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf Conference
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf Conference
 
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...ZFConf Conference
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf Conference
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf Conference
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf Conference
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf Conference
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf Conference
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 

More from ZFConf Conference (20)

ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
ZFConf 2012: Кеш без промахов средствами Zend Framework 2 (Евгений Шпилевский)
 
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
ZFConf 2012: Dependency Management в PHP и Zend Framework 2 (Кирилл Чебунин)
 
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
ZFConf 2012: Capistrano для деплоймента PHP-приложений (Роман Лапин)
 
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
ZFConf 2012: Проектирование архитектуры, внедрение и организация процесса раз...
 
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
ZFConf 2012: Реализация доступа к СУБД IBM DB2 посредством встраиваемого SQL ...
 
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
ZFConf 2012: Code Generation и Scaffolding в Zend Framework 2 (Виктор Фараздаги)
 
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
ZFConf 2012: Zend Framework 2, a quick start (Enrico Zimuel)
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
 
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
ZFConf 2011: Что такое Sphinx, зачем он вообще нужен и как его использовать с...
 
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
ZFConf 2011: Как может помочь среда разработки при написании приложения на Ze...
 
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
ZFConf 2011: Гибкая архитектура Zend Framework приложений с использованием De...
 
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
ZFConf 2011: Behavior Driven Development в PHP и Zend Framework (Константин К...
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
ZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ruZFConf 2010: History of e-Shtab.ru
ZFConf 2010: History of e-Shtab.ru
 
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend FrameworkZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
ZFConf 2010: Fotostrana.ru: Prototyping Project with Zend Framework
 
ZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework ApplicationsZFConf 2010: Performance of Zend Framework Applications
ZFConf 2010: Performance of Zend Framework Applications
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 2, Dependency I...
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 

ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)

  • 1. Александр Готгельф Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue
  • 3. Очередь сообщений client server request getting request some tasks response response Синхронная обработка
  • 4. Очередь сообщений client server request getting request response response some tasks Асинхронная обработка
  • 5. Очередь сообщений Message system (servers) message1 message handler1 message2 message3 message handler2 message4 Backend message handler3 .... Frontend Так что же такое очередь сообщений?
  • 7. Zend Server Job Queue we Web Servers Job Queue Протокол Я Job Queue Daemon Backend Severs http Request
  • 9. Zend Server Job Queue Триггеры – результат взаимодействия Аналогия cron job Оптимизация системы, очистка базы... Job Queue Api
  • 10. Zend Server Job Queue Пример – стандартный подход <?php function processingData($data) { if ( обработка $data) { returnTRUE; } else{ returnFALSE; } } // здесь мы вызываем функцию processingData для обработки данных($_POST['data']);
  • 11. Zend Server Job Queue Пример – подход с использованием job queue API <?php $data=$_POST['data']; $q=new ZendJobQueue(); $ts= date('Y-m-d H:i:s', time()+10); $id=$q->createHttpJob('/jobs/processing_data.php', array('data'=>$data), array('name'=>'processing datausing a single job execution scheduled to run after 10 seconds','schedule_time'=>$ts)); if(!$id){ exit(1); }
  • 12. Zend Server Job Queue Пример – подход с использованием job queue API Job script: <?php function processingData($data) { if( обработка $data){ return ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); } else{ return ZendJobQueue::setCurrentJobStatus(ZendJobQueue::FAILED); } } $params= ZendJobQueue::getCurrentJobParams(); processingData($params['data']); ?>
  • 13. Zend Server Job Queue мониторинг
  • 14. Zend Server Job Queue мониторинг
  • 15. Gearman Инсталляция: Качаем Сервер: http://gearman.org/index.php?id=download tar -xvzf gearmand-version.tar.gz cd gearmand ./configure make; make install
  • 16. Инсталляция: Gearman Устанавливаем php extension pecl download gearman-0.7.0 tar -xvf gearman-0.7.0.tgz cd gearman-0.7.0 phpize ./configure make make install
  • 17. Инсталляция: Gearman Добавляем “extension=gearman.so” в php.ini Результат:
  • 18. Gearman Application code Gearman Client API Application Я - Gearman Job Sever (gearmand) Gearman Worker API Application code
  • 19. Gearman Gearman включает в себя три основных компоненты: Client – создает задачи (jobs)для выполнения и отсылает их jobсерверу Job Server (gearmand) – координирует взаимодействие между clients и workers Worker – регистрируется у jobсервера и забирает задачи для выполнения
  • 20. Gearman Принцип работы gearmand gearmand gearmand call(“funcB”) can_do(“funcA”) can_do(“funcA”) call(“funcA”) can_do(“funcB”) client client worker worker
  • 22. Gearman Создание задачи: GearmanClient::do выполняет одну задачу и возвращает результат client.php GearmanClient::doBackground выполняет задачуасинхронно GearmanClient::addTask добавляет задачи в параллель, GearmanClient::runTasks выполняет пул задач(параллельно)
  • 23. Gearman пример: worker.php <?php $worker=new GearmanWorker(); $worker->addServer('127.0.0.1'); $worker->addFunction("reverse","reverse_fn"); while(1){ print"Waiting for job..."; $ret=$worker->work(); if($worker->returnCode()!= GEARMAN_SUCCESS) break; }
  • 24. Gearman пример: <?php function reverse_fn($job){ $workload=$job->workload(); echo"Received job: ".$job->handle().""; echo"Workload: $workload"; $result= strrev($workload); $workload_size=$job->workloadSize(); for($i=0;$i<$workload_size;$i++){ $job->sendStatus($i+1,$workload_size); $job->sendData(substr($workload,$i,1)); sleep(1); } echo"Result: $result"; return$result; } worker.php
  • 25. Gearman пример: <? $client=new GearmanClient(); $client->addServer(); $client->setOptions(GEARMAN_CLIENT_FREE_TASKS); $client->setCompleteCallback("done"); $client->setDataCallback("data"); $task1=$client->addTask("reverse","ABC123"); $task2=$client->addTask("reverse","BC123"); $result=$client->runTasks(); function done($task){ echo"COMPLETE: ".$task->jobHandle().", ". $task->data().""; } function data($task){ echo"DATA: ".$task->data().""; } client.php s
  • 28. Gearman Полезно! telnet localhost 4730 workers 13 127.0.0.1 - : reverse 12 127.0.0.1 - : reverse 11 127.0.0.1 - :
  • 29. Gearman 45+servers, 400K jobs/day 60+servers, 6M jobs/day
  • 30. Job Queue: применение Асинхронные очереди Map/Reduce URL обработка Анализ логов и агрегация Работа с RSS фидами Обработка и анализ логов
  • 31. Job Queue: применение (логи) Apache Node2 access_log client Apache Node1 access_log client Apache Node2 access_log client Gearman job server Worker Log Data Worker Worker Log Data Worker Worker Log Data Worker Gearman job server Client Анализ логов Client tail -f
  • 32. Job Queue: применение (логи) tail -f test | gearman -n -h localhost -f logger имя файла Шлет пакет данных для каждой линии хост имя функции для воркера
  • 33. Job Queue: электронная комерция Market Basket Analysis Анализ комбинаций покупаемых продуктов Время покупки Последовательность выбора
  • 34. Job Queue: электронная комерция Импорт/Экспорт сушностей
  • 35. Job Queue: электронная комерция Анализ кликов
  • 36. Job Queue: электронная комерция Системы отчетов
  • 37. Job Queue Действительно ли применение рассмотренных технолоний способно принести выйгрыш в производительности? Попробуем дать ответ с помощью примера. У нас есть внешний источник данных, которые нужно обработать и сохранить в базе. Причем сохранять данные нужно по одной единице, так как каждая из них требует дополнительную обработку.
  • 39. Job Queue: стандартный подход :IndexController simpleImportAction() create() : Application_Model_DbTable_Products importData()
  • 40. Job Queue: стандартный подход <?php class Application_Model_DbTable_Products extends Zend_Db_Table_Abstract { publicfunction importData() { … while(($data= fgetcsv($handle,10000000,';'))!==false){ $data[1]=$this->processingData($data[1]); $data=array( 'product'=>$data[0], 'sku'=>$data[1], 'insert_time'=>null, ); $this->insert($data); } fclose($handle); } …
  • 41. Job Queue: стандартный подход <?php class Application_Model_DbTable_Products extends Zend_Db_Table_Abstract { ... publicfunction processingData($data) { $data= str_repeat($data,1000); for($i=0;$i<=10;$i++){ $data= str_shuffle($data); } return$data; } ..
  • 42. Job Queue: Gearman :GearmanController gearmanImportAction() create() :GearmanClient gearmand loop [i < JOB_QTY] addTaskBackground() runTasks()
  • 43. Job Queue: Gearman worker : Application_Model_Gearmanworkers_ImportWorker create() addServer() addFunction("import", array(worker, "import"))
  • 44. Job Queue: Gearman worker.php <?php class GearmanController extends Zend_Controller_Action { publicfunction importWorkerAction() { $worker=new Application_Model_Gearmanworkers_ImportWorker(); $worker->addServer(); $worker->addFunction("import",array($worker,"import")); print"Waiting for job..."; while($worker->work()) { if($worker->returnCode()!= GEARMAN_SUCCESS) { echo"return_code: ".$worker->returnCode().""; break; } } } }
  • 45. Job Queue: Gearman client.php <?php class GearmanController extends Zend_Controller_Action { publicfunction gearmanImportAction() { … # Create our client object. $client=new GearmanClient(); # Add default server (localhost). $client->addServer(); # Send reverse job for($i=1;$i<= Application_Model_File::JOB_QTY;$i++){ ${'task'.$i}=$client->addTaskBackground("import","$i"); } $client->runTasks(); … }
  • 46. Job Queue: Zend Server Job Queue :ZendController zendImportAction() create() queue : ZendJobQueue loop [i < JOB_QTY] createHttpJob()
  • 47. Job Queue: Zend Server Job Queue <?php class ZendController extends Zend_Controller_Action { publicfunction zendImportAction() { ... $queue=new ZendJobQueue(); ... for($i=1;$i<= Application_Model_File::JOB_QTY;$i++){ $queue->createHttpJob( 'http://localhost/queue/public/zend/zend-job', array('id'=>$i)); } ... } … }
  • 48. Job Queue: Zend Server Job Queue <?php class ZendController extends Zend_Controller_Action { … publicfunction zendJobAction() { $params= ZendJobQueue::getCurrentJobParams(); $id=$params['id']; # processing and insert products ZendJobQueue::setCurrentJobStatus(ZendJobQueue::OK); exit; } }
  • 49. Job Queue: Statistics JOB_QTY = 1
  • 50. Job Queue: Statistics JOB_QTY = 2
  • 51. Job Queue: Statistics JOB_QTY = 5
  • 52. Job Queue: Statistics PRODUCT_QTY = 100000
  • 53. Job Queue - альтернативы Beanstalkd - http://kr.github.com/beanstalkd/ PHP Client: pheanstalk Dropr - https://github.com/s0enke/dropr/ Apache ActiveMQ - http://activemq.apache.org/ MemcacheQ queuing memcacheDB berkleyDB Redis Couchdb Tokyo Cabinet
  • 54. Job Queue В погоне за производительностью не забывайте о масштабируемости
  • 56. Job Queue Мои контакты: E-mail: gotgelf@gmail.com Skype: ramzes3988