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