輕量級隊列beanstalkd


一.基本
Beanstalkd,一個高性能、輕量級的分布式內存隊列系統,最初設計的目的是想通過后台異步執行耗時的任務來降低高容量Web應用系統的頁面訪問延遲,支持過有9.5 million用戶的Facebook Causes應用。后來開源,現在有PostRank大規模部署和使用,每天處理百萬級任務。Beanstalkd是典型的類Memcached設計,協議和使用方式都是同樣的風格,所以使用過memcached的用戶會覺得Beanstalkd似曾相識。


二.服務端
1.https://github.com/kr/beanstalkd/downloads
下載最新版1.8

2.下載后解壓,直接進入目錄執行,make install --prefix=/usr/local/bin/

3.啟動服務端
/usr/local/bin/beanstalkd -l 0.0.0.0 -p 11300 -z 67108864 -b /var/lib/beanstalkd -F &

-b /var/lib/beanstalkd
表示在此目錄下建立binlog日志,便於啟動的時候恢復未處理完的數據

作為服務啟動需要借助supervisor(點擊查看)


三.php客戶端
1.下載https://github.com/davidpersson/queue/tree/master/libs/beanstalk/src/Socket下的Beanstalk.php文件


2.發送任務:

<?php
//發送任務
require_once 'Beanstalk.php';
//實例化beanstalk
$beanstalk = new Socket_Beanstalk(array(
'persistent' => false, //是否長連接
'host' => '127.0.0.1',
'port' => 11300, //端口號默認11300
'timeout' => 3 //連接超時時間
));
if (!$beanstalk->connect()) {
exit(current($beanstalk->errors()));
}
//選擇使用的tube
$beanstalk->useTube('test');
//往tube中增加數據
$put = $beanstalk->put(
23, // 任務的優先級.
0, // 不等待直接放到ready隊列中.
60, // 處理任務的時間.
'hello, beanstalk' // 任務內容
);
if (!$put) {
exit('commit job fail');
}
$beanstalk->disconnect();

  


3.處理任務

<?php
require_once 'src/Socket/Beanstalk.php';
//實例化beanstalk
$beanstalk = new Socket_Beanstalk(array(
'persistent' => false, //是否長連接
'host' => '127.0.0.1',
'port' => 11300, //端口號默認11300
'timeout' => 3 //連接超時時間
));
if (!$beanstalk->connect()) {
exit(current($beanstalk->errors()));
}
//查看beanstalkd狀態
//var_dump($beanstalk->stats());
//查看有多少個tube
//var_dump($beanstalk->listTubes());
$beanstalk->useTube('test');
//設置要監聽的tube
$beanstalk->watch('test');
//取消對默認tube的監聽,可以省略
$beanstalk->ignore('default');
//查看監聽的tube列表
//var_dump($beanstalk->listTubesWatched());
//查看test的tube當前的狀態
//var_dump($beanstalk->statsTube('test'));
while (true) {
//獲取任務,此為阻塞獲取,直到獲取有用的任務為止
$job = $beanstalk->reserve(); //返回格式array('id' => 123, 'body' => 'hello, beanstalk')
if( $job ){
$res = $job['body'];
do($res);//處理任務
$beanstalk->delete( $job['id'] );
usleep(100000);
}else{
sleep(1);
}

sleep(1);
}
$beanstalk->disconnect();

  


四.不足之處
無法刪除tube,只要曾經設置過tube,就一直存在,即便挨個刪除job也不行,不知道是不是我的方法不對.

五.注意
beanstalk的reserve方法為阻塞獲取,如果在將其放入web中,則會造成一直阻塞,導致客戶端失去響應,需要重啟web server.所以不要在web中獲取任務或處理任務.

六.beanstalk管理工具
beanstalk管理工具暫未涉及.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM