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

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

on

  • 2,355 views

 

Statistics

Views

Total Views
2,355
Views on SlideShare
1,582
Embed Views
773

Actions

Likes
3
Downloads
0
Comments
0

2 Embeds 773

http://www.zfconf.ru 771
http://main.zfconf.deb 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Александр Готгельф
      Разделение труда: Организация многозадачной, распределенной системы в 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...n";
      $ret=$worker->work();
      if($worker->returnCode()!= GEARMAN_SUCCESS)
      break;
      }
    • Gearman
      пример:
      <?php
      function reverse_fn($job){
      $workload=$job->workload();
      echo"Received job: ".$job->handle()."n";
      echo"Workload: $workloadn";
      $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: $resultn";
      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()."n";
      }
      function data($task){
      echo"DATA: ".$task->data()."n";
      }
      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...n";
      while($worker->work())
      {
      if($worker->returnCode()!= GEARMAN_SUCCESS)
      {
      echo"return_code: ".$worker->returnCode()."n";
      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