php pheanstalk,Beanstalkd消息队列 -- php类Pheanstalk使用

业务场景

商城订单生成30分钟后 如果未支付关闭订单

解决办法

可以使用延迟消息队列   这里我们用的是beanstalkd

Beanstalkd介绍

Beanstalk,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟。

Beanstalkd特性

1、支持优先级(支持任务插队)

2、延迟(实现定时任务)

3、持久化(定时把内存中的数据刷到binlog日志)

4、预留(把任务设置成预留,消费者无法取出任务,等某个合适时机再拿出来处理)

5、任务超时重发(消费者必须在指定时间内处理任务,如果没有则认为任务失败,重新进入队列)

任务job状态

delayed 延迟状态

ready 准备好状态

reserved 消费者把任务读出来,处理时

buried 预留状态

delete 删除状态

5ea70aea3c3f2c7ef8774171cf19d072.png

Beanstalkd安装

yum -y install beanstalkd

Beanstalkd守护进程启动

nohup beanstalkd -l 0.0.0.0 -p 11300 -b /home/software/binstalkd/binlogs &

1. -b表示开启binlog,断电后重启自动恢复任务

2.  /home/software/binstalkd/binlogs是我们已经创建好的一个文件目录 这里面主要放一些持久化的日志

Pheanstalk安装

composer require pda/pheanstalk

PheanstalkGit仓库地址

连接Beanstalkd

require __DIR__ . '/vendor/autoload.php';

use Pheanstalk\Pheanstalk;

/**

* 实例化beanstalk

* 参数依次为:ip地址 端口号默认11300 连接超时时间 是否长连接

*/

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

?>

producer.php 生产者

// Hopefully you're using Composer autoloading.

require_once __DIR__.'/vendor/autoload.php';

use Pheanstalk\Pheanstalk;

/**

* 实例化beanstalk

* 参数依次为:ip地址 端口号默认11300 连接超时时间 是否长连接

*/

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

//向tubeName管道中添加任务,返回任务ID

//put()方法有四个参数

//第一个任务的数据

//第二个任务的优先级,值越小,越先处理 (默认为0  no delay)

//第三个任务的延迟 单位:秒 (most urgent: 0, least urgent: 4294967295)

//第四个任务的ttr超时时间 单位:秒

$arr['name'] = 'mark';

$jobData = json_encode($arr);

$pheanstalk ->useTube('tubeName') ->put($jobData,1024,5);

Beanstalkd生产者方法

指定需要使用的管道

$tube = $pheanstalk->useTube('default');

向管道插入数据

$tube = $pheanstalk->useTube('default');

$put = $tube->put(

'hello, beanstalk', // 任务内容

1024, // 任务的优先级

10, // 不等待直接放到ready队列中

60 // 处理任务的时间

);

或者:

$pheanstalk->putInTube('default', 'test1', 1024, 10, 60);

---------------------------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

consumer.php 消费者

// Hopefully you're using Composer autoloading.

require_once __DIR__.'/vendor/autoload.php';

use Pheanstalk\Pheanstalk;

/**

* 实例化beanstalk

* 参数依次为:ip地址 端口号默认11300 连接超时时间 是否长连接

*/

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

//监听tubeName管道,忽略default管道

$job = $pheanstalk ->watch('tubeName') ->ignore('default') ->reserve();

echo $job->getData();

//删除当前任务

$pheanstalk->delete($job);

Beanstalkd消费者方法

监听管道

$tube = $pheanstalk->watch('user');

去除不需要监听的管道

$tube = $pheanstalk->watch('user')->ignore('default');

以堵塞的方式监听管道

$job = $pheanstalk->watch('user')->reserve(4); //堵塞时间为4秒

列出所有已经监听的管道

$pheanstalk->listTubesWatched();

watch + reserve 方法

$pheanstalk->reserveFromTube('default')

删除当前任务

$job = $pheanstalk->watch('default')->reserve();

$pheanstalk->delete($job);

将当前任务重新放入管道

$job = $pheanstalk->watch('default')->reserve();

$pheanstalk->release($job);

为任务续命(当处理任务的时间小于当前任务执行时间时)

$job = $pheanstalk->watch('default')->reserve();

$pheanstalk->touch($job);

//TODO

将任务预留

$job = $pheanstalk->watch('default')->reserve();

$pheanstalk->bury($job);

将预留任务释放(变为reday状态)

$job = $pheanstalk->peekBuried('default');

$pheanstalk->kickJob($job);

批量将预留任务释放

$pheanstalk->userTube('default')->kick(999); //将id小于999的预留任务全部释放

读取当前准备就绪的任务(ready)

$job = $pheanstalk->peekReady('default');

读取当前处于延迟状态的任务(delayed)

$job = $pheanstalk->peekDelayed('default');

对管道设置延迟

$pheanstalk->pauseTube('default', 100); //设置100秒延迟

取消对管道的延迟

$pheanstalk->resumeTube('default');

标签:Beanstalkd,default,watch,任务,job,pheanstalk,php,Pheanstalk

来源: https://www.cnblogs.com/foreversun/p/10554018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值