1. 程式人生 > >好久沒更新了,推出beanstalkd php後臺佇列系統利器

好久沒更新了,推出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專門的處理系統