Beanstalkd消息队列 -- php类Pheanstalk使用
业务场景
商城订单生成30分钟后 如果未支付关闭订单
解决办法
可以使用延迟消息队列 这里我们用的是beanstalkd
Beanstalkd介绍
Beanstalk,一个高性能、轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟。
Beanstalkd特性
1、支持优先级(支持任务插队)
2、延迟(实现定时任务)
3、持久化(定时把内存中的数据刷到binlog日志)
4、预留(把任务设置成预留,消费者无法取出任务,等某个合适时机再拿出来处理)
5、任务超时重发(消费者必须在指定时间内处理任务,如果没有则认为任务失败,重新进入队列)
任务job状态
delayed 延迟状态
ready 准备好状态
reserved 消费者把任务读出来,处理时
buried 预留状态
delete 删除状态

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生产者方法
指定需要使用的管道
$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 消费者
<?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消息队列 -- php类Pheanstalk使用的更多相关文章
- RabbitMQ消息队列帮助类
调用 //消息队列发消息 MqConfigInfo config = new MqConfigInfo(); config.MQExChange = "DrawingOutput" ...
- 【Beanstalkd】Beanstalkd消息队列的安装与使用
一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...
- beanstalkd 消息队列
概况:Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Faceb ...
- 消息队列工具类(MSMQ)
所要做的是简化msmq的调用代码以及做到可替代性,实现后,调用消息队列代码变为如下所示: QueueService srv = QueueService.Instance(); //检查存储DTO1的 ...
- Beanstalkd消息队列的安装与使用
一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...
- beanstalkd 消息队列发邮件
放入消息 /** * 获取beanstalk实例 * * @staticvar resource|bool $beanstalk * @return resource */ function get_ ...
- C# 模拟一个处理消息队列的线程类 Message Queue
// 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...
- php 使用beanstalk 消息队列
Beanstalkd 消息队列 一.基本信息Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
随机推荐
- python基础知识16---函数补充
一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因 ...
- Ubuntu 16.04 安装Go 1.9.2
系统环境 Ubuntu: 16.04 Go: 1.9.2 安装步骤 $ curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64. ...
- activity--常见属性总结
15.Activit的几个重要属性总结? 12.onNewIntent()使用Tips?11.launchMode的属性介绍?及其常用的Intent Flag? ==== 15.Activit的几个重 ...
- LeetCode【111. 二叉树的最小深度】
最小深度,看起来很简单,就是左右节点的深度最小值 定义一个函数,计算其深度 class Solution { public int minDepth(TreeNode root) { if(root ...
- oracle修改sequence,查询sequence信息
-- 1.查询sequence当前值. select serviceproviderid.nextval from dual; -- 2.查询sequence最大值SELECT SEQUENCE_NA ...
- 高性能 TCP & HTTP 通信框架 HP-Socket v4.2.1
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- Solr中的group与facet的区别
Solr中的group与facet的区别 如果是简单的使用的话,那么Facet与group都可以用来进行数据的聚合查询,但是他们还是有很大的区别的. 首先上facet跟group的操作: Facet的 ...
- 一次请求中,经过 nginx+uWSGI+flask应用程序搭建服务的执行过程
Flask框架有自带的http server,但是缺点非常明显,并发能力,及时响应非常差,只适合开发时自测使用. 在我接触过的项目中,生产环境使用nginx+uWSGI+flask应用程序进行部署服务 ...
- 我的django2
1.做双系统(不现实启动项就再做一遍) 2.更新源 3.下载软件 看ubuntu篇,一直到mysql安装完. 4. 第一部分 搭建本地虚拟环境 第二部分 编辑 @部署??: 服务器端安装pip3,dj ...
- 0 Python学习计划
每天一小节,坚持水滴石穿. 2019-4-1 景略