业务场景商城订单生成30分钟后 如果未支付关闭订单 解决办法可以使用延迟消息队列 这里我们用的是beanstalkd Beanstalkd介绍Beanstalk,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟。 Beanstalkd特性1、支持优先级(支持任务插队) 任务job状态delayed 延迟状态
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仓库地址https://github.com/pda/pheanstalk连接Beanstalkd<?php require __DIR__ . '/vendor/autoload.php'; use Pheanstalk\Pheanstalk; /** * 实例化beanstalk * 参数依次为:ip地址 端口号默认11300 连接超时时间 是否长连接 */ $pheanstalk = new Pheanstalk('127.0.0.1', 11300, 3, false); ?> producer.php 生产者<?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生产者方法指定需要使用的管道
向管道插入数据
或者:
--------------------------------------------------------------------------------------------------------------------- consumer.php 消费者<?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(); Beanstalkd消费者方法监听管道
去除不需要监听的管道
以堵塞的方式监听管道
列出所有已经监听的管道
watch reserve 方法
删除当前任务
将当前任务重新放入管道
为任务续命(当处理任务的时间小于当前任务执行时间时)
将任务预留
将预留任务释放(变为reday状态)
批量将预留任务释放
读取当前准备就绪的任务(ready)
读取当前处于延迟状态的任务(delayed)
对管道设置延迟
取消对管道的延迟
|
|