好久沒更新了,推出beanstalkd php後臺隊列系統利器

開頭語:

    最近使用了phalcon的php c語言編寫的框架,在我們項目組由我推進了這個框架的使用,現在基本初步閱讀了下c源碼,同時將phalcon-php-framework-documentation.pdf 熟讀於胸,di router mvc view cache model phql assets等組件已經使用的比較好,前面已經寫了篇blog介紹js壓縮和css壓縮的方法,就是靈活使用了assets管理組件。

主題:

    今天向大家推薦beanstalkd的隊列系統,它其實就是一個簡單的隊列系統,這裏我們主要期望利用它來解決一些長時間的任務處理。

舉例場景:

     比如用戶重置密碼功能的時候 點擊發送重置密碼郵件,或者點擊 生成報告 這樣的 長時間處理的功能。界面不應該將它停留在請求中,而是直接將任務插入隊列系統,然後就可以返回給用戶,告訴他請稍候收取郵件或者沒收到,再發一份。或者生成報告時候 插入隊列後返回界面,然後輪詢報告生成進度 這類的友好處理。

思想來源:

    Do blocking work in the background
    Process a video, send e-mails, compress a file or an image, etc., are slow tasks that must be processed in background jobs. There are a variety of tools that provide queuing or messaging systems that work well with PHP  • Beanstalkd   • Redis    • RabbitMQ    • Resque    • Gearman    • ZeroMQ


設計思路:

      組件1:安裝beanstalkd,它其實就是一個監聽服務,默認11300端口。
      class Queue extends BeansTalk{
          public function __construct()
         {
             parent::__construct(array(
                'host' => 'localhost',
                'port' => '11300'));
          }
        }

        然後就使用單例模式創建該queue,就可以使用putqueue插入隊列,然後後臺起一個輪詢的任務workerfactory

       while ($queue->peekReady() !== false) {
            $job = $queue->reserve();
            echo "report begin\n";
            $message = (object)$job->getBody();
            $Factory = new WorkFactory();
            $reportWorker = $Factory->create($message->type);
            $reportWorker->doWork($message->params);

            echo "\nreport end\n";
        }

           該部分使用了cli模式的phalcon框架  php  /var/www/html/apps/cli/cli.php work main 即可調用workerfactory分發任務

       組件2:daemontools
           daemontools is a collection of tools for managing UNIX services.supervise monitors a service.It starts the service and restarts the service if it dies.

         寫了個shell循環調用 guiwork

          #!/bin/sh
          while true
          do
                     sh /var/www/html/apps/scripts/reportworker.sh 1>/dev/null 2>&1 &
                    sleep 60;
            done

          reportworker.sh 調用php  /var/www/html/apps/cli/cli.php work main

           daemontools supervise監控 guiwork 


總結:

     基本上就是後臺一分鐘循環執行一次shell 執行調用php 查詢queue取任務,然後執行。

在任務完成時間較長的情況下,加入A任務一分鐘還沒完成,下一個一分鐘會另外又有起個worker取到queue裏面的新的job B ,

從而逐漸增加worker 加速處理 直到任務完成的 設計,這樣一方面不會 起太多的進程,另一方面也不會在大量任務插入後處理不了的任務積累。


展望:

     進一步 beanstalkd支持分佈式處理,現階段,我們還是在一臺服務器上執行,等真正用戶量上來後,也方便擴展,將報告的worker直接扔到report專門的處理系統


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章