最新消息:

PHP7+beanstalkd 生产环境队列使用

PHP 964浏览 0评论

博主在前面有写过 beanstalkd 基本原理、支持功能、环境搭建、依赖安装的说明。今天刚好有空,讲解一下 PHP7 结合 beanstalkd 在生产环境的队列使用教程。

应用场景:

队列系统的应用场景通常是用于一些耗时,耗资源,耗性能的流程处理。常用的例子就是短信发送,第三方消息接口的订阅,商城秒杀等,这些都可以使用队列系统完成。

Beanstalkd 介绍

Beanstalkd 是一个高性能,轻量级的分布式内存队列系统。由 C 语言实现,典型的类 Memcached 设计,协议和使用方式都极其相似。有 Memcached 使用经验者会觉得 Beanstalkd 似曾相识。

Beanstalkd 最初设计意图时在高并发的网络请求下,通过异步执行耗时较多的请求,提前响应结果,减少请求的响应时延。

配置连通性 和 持久化

ip 设置为 0.0.0.0 允许所有连接,靠配置安全组或防火墙去约束连接,开启 -b 参数(默认没有持久化),内存的队列消息可以落地到硬盘 binlog 实现持久化,断电重启可以重新读取队列消息。

sudo vi /etc/default/beanstalkd

image.png

Beanstalkd 任务状态

delayed 延迟状态 ready 准备状态  reserved 消费者已读取任务,待处理  buried 预留状态  delete 删除状态

Beanstalkd 管理工具

命令行工具: https://github.com/src-d/beanstool

web UI 管理工具:https://github.com/ptrofimov/beanstalk_console

PHP 使用示例

入队

use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk('127.0.0.1', 11300);
$jobData = [
    'site' => 'http://blog.wecot.cn',
    'email' => 'xp.develop@outlook.com',
    'message' => 'hello wecot'
];
$pheanstalk->useTube('email_list_tube')->put(json_encode($jobData));

出队

ini_set('default_socket_timeout', 86400*7);
ini_set('memory_limit', '256M');

use Pheanstalk\Pheanstalk;
$pheanstalk= new Pheanstalk('127.0.0.1', 11300);
while(true){
    $job = $pheanstalk->watch('email_list_tube')->ignore('default')->reserve();
    if($job === false){
    
    }else{
        $data = $job->getData();
        //todo 数据逻辑处理
        
        //处理完成删除 job
        $pheanstalk->delete($job);
    }
}

注意: `default_socket_timeout` 参数一定要加上,PHP 默认是 60s 超时。如果代码中没有此项设置,采用默认 60s 的设置,60s 之内如果没有新的 job 产生,脚本就会报 socket 错误。这里可以根据个人业务进行适当设置。

监控 Beanstalkd 状态

use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk('127.0.0.1', 11300);
$isAlive = $pheanstalk->getConnection()->isServiceListening();
var_dump($isAlive);
//todo 此处可以做一些短信或邮件的报警提示

上面脚本定时执行,即可实现报警监测。

实用的操作命令

查看 beanstalkd 服务内存占用

top -u beanstalkd

后台运行 consumer 脚本

nohub php consumer.php &

查看 consumer 脚本运行时间

ps -A -opid,sime,etime,args | grep consumer.php

手动重启 consumer 脚本

ps auxf | grep ‘consumer.php’ | grep -v  grep | awk ‘{print $2}’ | xargs kill -9
nohub php consumer.php &

小结

1、调试稳定后可以使用 supervisor 进程管理来控制脚本的生命周期

2、涉及网络请求的操作,一定要 try catch 捕捉错误信息,一旦没有catch 到,脚本可能直接崩溃。

转载请注明:微刻 blog.wecot.cn » PHP7+beanstalkd 生产环境队列使用

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址