Your SlideShare is downloading. ×
0
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue (Александр Готгельф)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

2,166

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,166
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×