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

Like this? Share it with your network

Share

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

on

  • 2,469 views

 

Statistics

Views

Total Views
2,469
Views on SlideShare
1,694
Embed Views
775

Actions

Likes
3
Downloads
0
Comments
0

2 Embeds 775

http://www.zfconf.ru 773
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 (Александр Готгельф) Presentation Transcript

  • 1. Александр Готгельф
    Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue
  • 2. 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
    Так что же такое очередь сообщений?
  • 6. Очередь сообщений
    Масштабируемость
    Производительность
  • 7. Zend Server Job Queue
    we
    Web Servers
    Job Queue Протокол
    Я Job Queue Daemon
    Backend Severs
    http Request
  • 8. Zend Server Job Queue
  • 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
  • 21. Gearman
  • 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...n";
    $ret=$worker->work();
    if($worker->returnCode()!= GEARMAN_SUCCESS)
    break;
    }
  • 24. 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
  • 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()."n";
    }
    function data($task){
    echo"DATA: ".$task->data()."n";
    }
    client.php
    s
  • 26. Gearman
    Наблюдаем результат:
  • 27. Gearman
    Использование:
  • 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
    Действительно ли применение рассмотренных технолоний способно принести выйгрыш в производительности?
    Попробуем дать ответ с помощью примера. У нас есть внешний источник данных, которые нужно обработать и сохранить в базе. Причем сохранять данные нужно по одной единице, так как каждая из них требует дополнительную обработку.
  • 38. Job Queue: Statistics
  • 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...n";
    while($worker->work())
    {
    if($worker->returnCode()!= GEARMAN_SUCCESS)
    {
    echo"return_code: ".$worker->returnCode()."n";
    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
    В погоне за производительностью не забывайте о масштабируемости
  • 55. Job Queue
  • 56. Job Queue
    Мои контакты:
    E-mail: gotgelf@gmail.com
    Skype: ramzes3988