beanstalkd

介紹:

Beanstalkd,一個(gè)高性能、輕量級(jí)的分布式內(nèi)存隊(duì)列系統(tǒng)叛买,最初設(shè)計(jì)的目的是想通過后臺(tái)異步執(zhí)行耗時(shí)的任務(wù)來降低高容量Web應(yīng)用系統(tǒng)的頁面訪問延遲,支持過有9.5 million用戶的Facebook Causes應(yīng)用到忽。后來開源,現(xiàn)在有PostRank大規(guī)模部署和使用清寇,每天處理百萬級(jí)任務(wù)喘漏。Beanstalkd是典型的類Memcached設(shè)計(jì),協(xié)議和使用方式都是同樣的風(fēng)格华烟,所以使用過memcached的用戶會(huì)覺得Beanstalkd似曾相識(shí)翩迈。

安裝

官網(wǎng)

https://kr.github.io/beanstalkd/

安裝

centos

yum install beanstalkd --enablerepo=epel

源碼:

tar -zxvf /usr/bin/beanstalkd/beanstalkd-1.10.tar.gz

cd beanstalkd

make install PERFIX=/usr/bin/beanstalkd

參考:http://kr.github.io/beanstalkd/download.html

啟動(dòng)

/usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -b /var/lib/beanstalkd/binlog -F &

beanstalkd參數(shù):

/usr/bin/beanstalkd -h
Use: /usr/bin/beanstalkd [OPTIONS]

Options:
-b 開啟binlog,斷電后重啟會(huì)自動(dòng)恢復(fù)任務(wù)盔夜。
-f MS fsync最多每MS毫秒
-F從不fsync(默認(rèn))
-l ADDR偵聽地址(默認(rèn)為0.0.0.0)
-p端口偵聽端口(默認(rèn)為11300)
-u USER成為用戶和組
-z BYTES設(shè)置最大作業(yè)大懈核恰(以字節(jié)為單位)(默認(rèn)值為65535)
-s BYTES設(shè)置每個(gè)wal文件的大小(默認(rèn)為10485760) (將被舍入到512字節(jié)的倍數(shù))
-c壓縮binlog(默認(rèn))
- n 不要壓縮binlog
-v顯示版本信息
-V增加冗長(zhǎng)度
-h顯示這個(gè)幫助

4喂链、配置文件

/etc/sysconfig/beanstalkd

概念:

核心概念

  • job:一個(gè)需要異步處理的任務(wù)返十,是 Beanstalkd 中的基本單元,需要放在一個(gè) tube 中椭微。
  • tube:一個(gè)有名的任務(wù)隊(duì)列洞坑,用來存儲(chǔ)統(tǒng)一類型的 job,是 producer 和 consumer 操作的對(duì)象蝇率。
  • producer:Job 的生產(chǎn)者迟杂,通過 put 命令來將一個(gè) job 放到一個(gè) tube 中。
  • consumer:Job的消費(fèi)者本慕,通過 reserve/release/bury/delete 命令來獲取 job 或改變 job 的狀態(tài)排拷。

job 的生命周期

Paste_Image.png

當(dāng)producer直接put一個(gè)job時(shí),job就處于READY狀態(tài)锅尘,等待consumer來處理监氢,如果選擇延遲put,job就先到DELAYED狀態(tài),等待時(shí)間過后才遷移到READY狀態(tài)忙菠。consumer獲取了當(dāng)前READY的job后何鸡,該job的狀態(tài)就遷移到RESERVED,這樣其他的consumer就不能再操作該job牛欢。當(dāng)consumer完成該job后,可以選擇delete, release或者bury操作淆游;delete之后,job從系統(tǒng)消亡犹菱,之后不能再獲取腊脱;release操作可以重新把該job狀態(tài)遷移回READY(也可以延遲該狀態(tài)遷移操作),使其他的consumer可以繼續(xù)獲取和執(zhí)行該job陕凹;有意思的是bury操作悍抑,可以把該job休眠,等到需要的時(shí)候搜骡,再將休眠的job kick回READY狀態(tài)佑女,也可以delete BURIED狀態(tài)的job记靡。正是有這些有趣的操作和狀態(tài),才可以基于此做出很多意思的應(yīng)用团驱,比如要實(shí)現(xiàn)一個(gè)循環(huán)隊(duì)列摸吠,就可以將RESERVED狀態(tài)的job休眠掉嚎花,等沒有READY狀態(tài)的job時(shí)再將BURIED狀態(tài)的job一次性kick回READY狀態(tài)。

  • READY - 需要立即處理的任務(wù)贩幻,當(dāng)延時(shí) (DELAYED) 任務(wù)到期后會(huì)自動(dòng)成為當(dāng)前任務(wù);
  • DELAYED - 延遲執(zhí)行的任務(wù), 當(dāng)消費(fèi)者處理任務(wù)后, 可以用將消息再次放回 DELAYED 隊(duì)列延遲執(zhí)行族壳;
  • RESERVED - 已經(jīng)被消費(fèi)者獲取, 正在執(zhí)行的任務(wù)趣些。Beanstalkd 負(fù)責(zé)檢查任務(wù)是否在 TTR(time-to-run) 內(nèi)完成;
  • BURIED - 保留的任務(wù): 任務(wù)不會(huì)被執(zhí)行,也不會(huì)消失锦亦,除非有人把它 "踢" 回隊(duì)列令境;
  • DELETED - 消息被徹底刪除。Beanstalkd 不再維持這些消息抛蚁。

一些特性

優(yōu)先級(jí)

任務(wù) (job) 可以有 0~2^32 個(gè)優(yōu)先級(jí), 0 代表最高優(yōu)先級(jí)惕橙,默認(rèn)優(yōu)先級(jí)為1024。

持久化

可以通過binlog將job及其狀態(tài)記錄到文件里面弥鹦,在Beanstalkd下次啟動(dòng)時(shí)可以通過讀取binlog來恢復(fù)之前的job及狀態(tài)。

分布式容錯(cuò)

分布式設(shè)計(jì)和Memcached類似朦促,beanstalkd各個(gè)server之間并不知道彼此的存在苍鲜,都是通過client來實(shí)現(xiàn)分布式以及根據(jù)tube名稱去特定server獲取job。

超時(shí)控制

為了防止某個(gè)consumer長(zhǎng)時(shí)間占用任務(wù)但不能處理的情況洒疚,Beanstalkd為reserve操作設(shè)置了timeout時(shí)間坯屿,如果該consumer不能在指定時(shí)間內(nèi)完成job,job將被遷移回READY狀態(tài)领跛,供其他consumer執(zhí)行。

客戶端操作

項(xiàng)目地址:https://github.com/pda/pheanstalk/

1吠昭、向隊(duì)列中添加job

<?php

//創(chuàng)建隊(duì)列消息

require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);

$tubeName='user_eamil_message_list';

$jobData=array(
    'uid' => time(),
    'email' => 'wukong@qq.com',
    'message' => 'Hello World !!',
    'dtime' => date('Y-m-d H:i:s'),
);

$pheanstalk ->useTube( $tubeName) ->put( json_encode( $jobData));

echo json_encode($jobData).PHP_EOL;
echo 'Success ~~'.PHP_EOL;

2矢棚、從隊(duì)列中取出job

<?php


//消費(fèi)隊(duì)列消息

require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);

$tubeName='user_eamil_message_list';

while(true){
    //獲取隊(duì)列信息,reserve 阻塞獲取
    $job = $pheanstalk ->watch($tubeName) ->ignore('default') ->reserve();
    $data=$job->getData();

    //執(zhí)行相關(guān)邏輯代碼
    $ret = file_put_contents('./send_mail.log',$data,FILE_APPEND | LOCK_EX);
    if( $ret ){
        echo '執(zhí)行成功'.PHP_EOL.$data.PHP_EOL;
        $pheanstalk->delete($job);
    }

    //暫停(不可能是百分百的準(zhǔn)確,跟系統(tǒng)的調(diào)度蘑拯、CPU時(shí)鐘周期等有一定關(guān)系)
    usleep(500000);
}

echo 'Success ~~'.PHP_EOL;

3、檢查服務(wù)狀態(tài)

<?php

//監(jiān)控服務(wù)狀態(tài)
require_once('./vendor/autoload.php');

use Pheanstalk\Pheanstalk;

$pheanstalk = new Pheanstalk('127.0.0.1',11300);
$isAlive = $pheanstalk->getConnection()->isServiceListening(); 

var_dump($isAlive);

/**

可以開發(fā)監(jiān)控面板弯蚜,監(jiān)控?cái)?shù)據(jù)的剃法,有多少tube,多少隊(duì)列贷洲,多少延遲等等


//查看beanstalkd狀態(tài)
//var_dump($pheanstalk->stats());

//查看有多少個(gè)tube
//var_dump($pheanstalk->listTubes());

//設(shè)置要監(jiān)聽的tube
$pheanstalk->watch('test');

//取消對(duì)默認(rèn)tube的監(jiān)聽,可以省略
$pheanstalk->ignore('default');

//查看監(jiān)聽的tube列表
//var_dump($pheanstalk->listTubesWatched());

//查看test的tube當(dāng)前的狀態(tài)
//var_dump($pheanstalk->statsTube('test'));

*/

測(cè)試:

生產(chǎn)消息:

$ php  producer.php 
{"uid":1499569740,"email":"wukong@qq.com","message":"Hello World !!","dtime":"2017-07-09 11:09:00"}
Success ~~

php  producer.php 
{"uid":1499569742,"email":"wukong@qq.com","message":"Hello World !!","dtime":"2017-07-09 11:09:02"}
Success ~~

 php  producer.php 
{"uid":1499569744,"email":"wukong@qq.com","message":"Hello World !!","dtime":"2017-07-09 11:09:04"}
Success ~~

消費(fèi)消息:

$ php consumer.php 
執(zhí)行成功
{"uid":1499569740,"email":"wukong@qq.com","message":"Hello World !!","dtime":"2017-07-09 11:09:00"}
執(zhí)行成功
{"uid":1499569742,"email":"wukong@qq.com","message":"Hello World !!","dtime":"2017-07-09 11:09:02"}
執(zhí)行成功
{"uid":1499569744,"email":"wukong@qq.com","message":"Hello World !!","dtime":"2017-07-09 11:09:04"}

PHP監(jiān)控

https://github.com/kr/beanstalkd/wiki/Tools
https://github.com/ptrofimov/beanstalk_console
https://github.com/jimbojsb/bstools

參考:
https://segmentfault.com/a/1190000002784775
http://www.reibang.com/p/413676e1696f

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趣斤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玉凯,更是在濱河造成了極大的恐慌联贩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盲厌,死亡現(xiàn)場(chǎng)離奇詭異祸泪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)没隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門右蒲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陷嘴,你說我怎么就攤上這事翰撑“⊙耄” “怎么了涨醋?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乓土。 經(jīng)常有香客問我溯警,道長(zhǎng),這世上最難降的妖魔是什么梯轻? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任喳挑,我火速辦了婚禮,結(jié)果婚禮上伊诵,老公的妹妹穿的比我還像新娘。我一直安慰自己搂橙,他們只是感情好笛坦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜗帜,像睡著了一般资厉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴偿,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天窄刘,我揣著相機(jī)與錄音,去河邊找鬼娩践。 笑死烹骨,一個(gè)胖子當(dāng)著我的面吹牛材泄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峦树,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旦事,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了谷遂?” 一聲冷哼從身側(cè)響起卖鲤,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掠廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沉颂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铸屉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了切端。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昌屉,死狀恐怖茵瀑,靈堂內(nèi)的尸體忽然破棺而出间驮,到底是詐尸還是另有隱情马昨,我是刑警寧澤扛施,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布疙渣,位于F島的核電站抱虐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恳邀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一刷钢、第九天 我趴在偏房一處隱蔽的房頂上張望乳附。 院中可真熱鬧,春花似錦赋除、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玖媚,卻和暖如春婚脱,著一層夾襖步出監(jiān)牢的瞬間今魔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工涡贱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惹想,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓激挪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親宛篇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容