注:本文Linux環境只跑Beanstalkd,PHP環境還是在Windows
1.介紹:
Beanstalkd 是一個高性能,輕量級的分佈式內存隊列,最初設計意圖是在高併發的網絡請求下,通過異步執行耗時較多的請求,及時返回結果,減少請求的響應延遲。
2.特性:
- 優先級(priority):即支持任務插隊功能,可以根據需要設置任務被消費的優先次序。
- 延遲(delay):可以設置一個時間t,即任務t秒後纔可以被消費者讀取。
- 持久化(persistent data):會定時將任務刷新到beanstalkd日誌文件中,在服務器宕機等意外發生時,也能保持數據不會丟失。
- 預留(buried):設爲預留時,消費者暫時無法取出任務,等某個合適時機再拿出來消費。
- 超時重發(time-to-run):任務必須在指定時間內進行消費,否則就任務消費失敗,會重新進入隊列,給消費者進行消費。
3.安裝:
- Linux下安裝Beanstalkd(目前只支持Linux系統),執行命令:apt-get install beanstalkd 即可安裝,端口一般爲11300,可通過命令:netstat –ntlp查看所有端口的使用情況
- 在laravel中安裝擴張包:composer require pda/pheanstalk如果有以下報錯,
則需修改composer.json文件即可“ext-json”: “^1.7”改爲“ext-json”: “^1.6”
4.使用:
爲了能讓Windows環境下的PHP連接Linux下的beanstalkd,故需先修改beanstalkd的配置,操作如下:
vim /etc/default/beanstalkd
將BEANSTALKD_LISTEN_ADDR = 127.0.0.1改爲BEANSTALKD_LISTEN_ADDR = 0.0.0.0
同時放開BEANSTALKD_EXTRA,放開此參數可以實現持久化,即斷電可重新讀取隊列信息
修改完成後,執行重啓命令:service beanstalkd restart
然後可以查看beanstalkd的狀態:service beanstalkd status
然後修改beanstalkd.socket的配置,將ListenStream=127.0.0.1:11300修改爲ListenStream=0.0.0.0:11300
同樣重啓一下beanstalkd.socket,但需要先關閉beanstalkd,
然後再開啓beanstalkd.socket和beanstalkd
systemctl stop beanstalkd
systemctl start beanstalkd.socket
systemctl start beanstalkd
然後查看beanstalkd.socket的狀態
Job的生命週期
Status |
Description |
ready |
等待被取出並處理 |
reserved |
如果job被worker取出,將被此worker預訂,worker將執行此job |
delayed |
等待一定時間後,狀態變爲ready |
buried |
等待喚醒,通常job處理失敗時 |
生產者將任務放入隊列中
$pheanstalk = Pheanstalk::create('192.168.135.133', 11300);
$pheanstalk->useTube('tube_name')->put('tube',1024,2,60);
通過put()方法將任務插入隊列,第一個參數任務body;第二個參數優先級,0-2^32,值越小優先級越高,默認1024;第三個參數延遲的秒數,在這段時間任務處於延遲的狀態;第四個參數允許執行的最大秒數,如果任務在這段時間內不能被delete、release、bury,那麼任務超時後服務器將release此任務,狀態變爲ready,最小爲1秒。
消費者從隊列中獲取任務進行
$pheanstalk = Pheanstalk::create('192.168.135.133', 11300);
$job = $pheanstalk->watch('tube_name')->ignore('default')->reserve();
$data= $job->getData();
$pheanstalk->delete($job); //任務處理完成後,將該任務刪除
5.查看隊列任務的命令行工具:beanstool
- 安裝:
wget https://github.com/src-d/beanstool/releases/download/v0.2.0/beanstool_v0.2.0_linux_amd64.tar.gz
tar -xvzf beanstool_v0.2.0_linux_amd64.tar.gz
cp beanstool_v0.2.0_linux_amd64/beanstool /usr/local/bin/
- 常用命令
本文參考:https://www.imooc.com/learn/912,https://learnku.com/articles/18687