PHP7 生产环境队列 Beanstalkd 正确使用姿势-PHP7

资源魔 103 0

使用场景

  为何要用呢,有甚么益处?这应该放正在最扫尾说,一件货色你只有理解它是干甚么的,适宜干甚么,能力更好的与本人的名目相连系,用到那里学到那里,学了不必等于没有会,咱们平常就应该多思考一些这样的成绩:本人做个甚么名目性能能跟 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开发自学

抱歉,评论功能暂时关闭!