使用场景
为何要用呢,有甚么益处?这应该放正在最扫尾说,一件货色你只有理解它是干甚么的,适宜干甚么,能力更好的与本人的名目相连系,用到那里学到那里,学了不必等于没有会,咱们平常就应该多思考一些这样的成绩:本人做个甚么名目性能能跟 xx 技巧相连系呢?这个 xx 技巧放正在这类营业场景上行没有行呢?而没有是 “学了这个 xx 技巧无能嘛呢,公司如今也不用这个的呀,学了也没用啊”,带着这样心境去学习 xx 技巧,一定很苦楚。
行列步队各人都晓得是将一些耗时的操作先没有去做,先埋点,再异步行止理,这样对一些发邮件发短信之类的耗时操作,用户是觉得没有到的,由于埋点完结,操作也就完结了,生产行列步队都是正在效劳器上做的。次要使用正在短信或邮件告诉,拜访第三方接口定阅音讯,商城的一些秒杀流动,均可以连系行列步队来实现。
Beanstalkd 引见
Beanstalkd 是一个高功能,轻量级的散布式内存行列步队,C 代码,典型的类 Memcached 设计,协定以及应用形式都是一样的格调,以是应用过 memcached 的用户会感觉 Beanstalkd 素昧平生。
beanstalkd 的最后设计用意是正在高并发的网络申请下,经过异步执行耗时较多的申请,实时前往后果,缩小申请的呼应提早。
Ubuntu 装置
sudo apt-get install beanstalkd
设置装备摆设文件
vim /etc/default/beanstalkd
查看状态
service beanstalkd status # 饬令回显 # root@:/www/server/php/72/etc# service beanstalkd status ● beanstalkd.service - Simple, fast work queue Loaded: loaded (/lib/systemd/system/beanstalkd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2018-10-16 10:42:28 CST; 6 days ago Docs: man:beanstalkd(1) Main PID: 7033 (beanstalkd) Tasks: 1 (limit: 4634) CGroup: /system.slice/beanstalkd.service └─7033 /usr/bin/beanstalkd -l 0.0.0.0 -p 11300 -b /var/lib/beanstalkd Oct 16 10:42:28 ip-10-93-2-137 systemd[1]: Started Simple, fast work queue.
设置装备摆设连通性 + 耐久化
ip 用 0.0.0.0 容许一切衔接,靠设置装备摆设平安组或防火墙去束缚衔接,铺开 -b 参数 (默许不耐久化),内存的行列步队音讯能够落地到硬盘 binlog 完成耐久化,断电可从新读取行列步队音讯。
vim /etc/default/beanstalkd BEANSTALKD_LISTEN_ADDR=0.0.0.0 BEANSTALKD_LISTEN_PORT=11300 BEANSTALKD_EXTRA="-b /var/lib/beanstalkd"
beanstalkd 义务状态
状态 | 正文 |
---|---|
delayed | 提早状态 |
ready | 预备好状态 |
reserved | 生产者把义务读进去,解决时 |
buried | 预留状态 |
delete | 删除了状态 |
治理对象
亲测了不少网上能找到的 beanstalkd 对象,这两款是我最中意的了,一个饬令行,一个 web 的。
饬令行:https://github.com/src-d/beanstool
web 界面:https://github.com/ptrofimov/beanstalk_console
编程言语客户端
PHP 客户端
https://packagist.org/packages/pda/pheanstalk
composer require pda/pheanstalk
写入 job
<?php //创立行列步队音讯 require_once('./vendor/autoload.php'); use Pheanstalk\Pheanstalk; $pheanstalk = new Pheanstalk('127.0.0.1',11300); $tubeName = 'email_list'; $jobData = [ 'email' => '123456@163.com', 'message' => 'Hello World !!', 'dtime' => date('Y-m-d H:i:s'), ]; $pheanstalk->useTube( $tubeName)->put( json_encode( $jobData ) );
生产 job
<?php ini_set('default_socket_timeout', 86400*7); ini_set( 'memory_limit', '256M' ); // 生产行列步队音讯 require_once('./vendor/autoload.php'); use Pheanstalk\Pheanstalk; $pheanstalk = new Pheanstalk('127.0.0.1',11300); $tubeName = 'email_list'; while ( true ) { // 猎取行列步队信息, reserve 梗阻猎取 $job = $pheanstalk->watch( $tubeName )->ignore( 'default' )->reserve(); if ( $job !== false ) { $data = $job->getData(); /* TODO 逻辑操作 */ /* 解决实现,删除了 job */ $pheanstalk->delete( $job ); } }
default_socket_timeout 这个参数是肯定要加的,php 默许普通是 60s,如果您不正在代码外面设置,采纳默许的话(60s),60s 以内假如不 job 孕育发生,剧本就会报 socket 谬误,我写的是 7 天超时,您能够依据营业去调整,记住肯定要设置装备摆设,网上不少搜的 consumer 剧本都不设置装备摆设这个,基本不克不及投入消费环境应用,这是我亲身理论的后果。
对于 while true 能否死轮回,很明白通知你是死轮回,然而没有会不断耗功能的那样执行上来,它会正在 reserve 这里梗阻没有动,直到有音讯孕育发生才会往下走,以是年夜可释怀应用,我的名目代码外面是应用了办法挪用办法本身去完成轮回的。
就是这样的代码,供参考:
public function watchJob() { $job = $this->pheanstalk->watch( config( 'tube' ) )->ignore( 'default' )->reserve(); if ( $job !== false ) { $job_data = $job->getData(); $this->subscribe( $job_data ); $this->pheanstalk->delete( $job ); /* 持续 Watch 下一个 job */ $this->watchJob(); } else { $this->log->error( 'reserve false', 'reserve false' ); } }
监控 beanstalkd 状态
<?php //监控效劳状态 require_once('./vendor/autoload.php'); use Pheanstalk\Pheanstalk; $pheanstalk = new Pheanstalk('127.0.0.1',11300); $isAlive = $pheanstalk->getConnection()->isServiceListening(); var_dump( $isAlive );
能够合营 email 做一个报警邮件,剧本每一分钟去执行,判别状态是 false,就给治理员发送邮件报警。
一些相干饬令
查看 beanstalkd 效劳内存占用
top -u beanstalkd
后盾运转 consumer 剧本
nohup php 谷歌home_subscribe.php &
查看 consumer 剧本运转工夫
ps -A -opid,stime,etime,args | grep consumer.php
手工重启 consumer 剧本
ps auxf|grep '谷歌home_subscribe.php'|grep -v grep|awk '{print $2}'|xargs kill -9 nohup php 谷歌home_subscribe.php &
一些总结
php 要把谬误日记关上,不便搜集 consumer 剧本 crash 的 log,剧本跑出一些致命的 error 肯定要实时修复,由于一旦有错就会挂掉,这会影响你剧本的可用性,前期稳固之后能够上 supervisor 这类过程治理顺序来管控剧本生命周期。
一些网络申请操作,肯定要 try catch 到一切谬误,一旦不 catch 到,剧本就崩。我用的是 Guzzle 去做的网络申请,上面是我 catch 的一些谬误,代码片断供参考。
try { /* TODO: 逻辑操作 */ } catch ( ClientException $e ) { $results['mid'] = $this->mid; $results['code'] = $e->getResponse()->getStatusCode(); $results['reason'] = $e->getResponse()->getReasonPhrase(); $this->log->error( 'properties-changed ClientException', $results ); } catch ( ServerException $e ) { $results['mid'] = $this->mid; $results['code'] = $e->getResponse()->getStatusCode(); $results['reason'] = $e->getResponse()->getReasonPhrase(); $this->log->error( 'properties-changed ServerException', $results ); } catch ( ConnectException $e ) { $results['mid'] = $this->mid; $this->log->error( 'properties-changed ConnectException', $results ); }
job 生产之后肯定要删除了掉,假如长期没有删除了,php 客户端会有 false 前往,是由于有 DEADLINE_SOON 这个超时谬误孕育发生,以是解决完义务,肯定要记患上删除了,这一点跟 kafka 纷歧样,beanstalkd 需求开发者本人去删除了 job。
保举教程:《PHP教程》
以上就是PHP7 消费环境行列步队 Beanstalkd 正确应用姿态的具体内容,更多请存眷资源魔其它相干文章!
标签: php Beanstalkd php7开发教程 php7开发资料 php7开发自学
抱歉,评论功能暂时关闭!