业务场景

商城订单生成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使用的更多相关文章

  1. RabbitMQ消息队列帮助类

    调用 //消息队列发消息 MqConfigInfo config = new MqConfigInfo(); config.MQExChange = "DrawingOutput" ...

  2. 【Beanstalkd】Beanstalkd消息队列的安装与使用

    一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...

  3. beanstalkd 消息队列

    概况:Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Faceb ...

  4. 消息队列工具类(MSMQ)

    所要做的是简化msmq的调用代码以及做到可替代性,实现后,调用消息队列代码变为如下所示: QueueService srv = QueueService.Instance(); //检查存储DTO1的 ...

  5. Beanstalkd消息队列的安装与使用

    一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...

  6. beanstalkd 消息队列发邮件

    放入消息 /** * 获取beanstalk实例 * * @staticvar resource|bool $beanstalk * @return resource */ function get_ ...

  7. C# 模拟一个处理消息队列的线程类 Message Queue

    // 模拟一个处理消息队列的类 class MessageHandler { // 消息队列 private Queue<string> messageQue = new Queue< ...

  8. php 使用beanstalk 消息队列

    Beanstalkd 消息队列 一.基本信息Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有 ...

  9. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

随机推荐

  1. HDFS简述

    管理网络中跨多台计算机存储的文件系统称为分布式文件系统,Hadoop自带HDFS(Hadoop Distributed Filesystem)分布式文件系统. 一.HDFS设计 HDFS以流式数据访问 ...

  2. C#使用AppDomain时的异常分析:Object ‘XXXX.rem’ has been disconnected or does not exist at the server.

    在使用C#的应用程序域的时候,碰到这么一个异常: System.Runtime.Remoting.RemotingException: Object ‘/76e7cd41_2cd2_4e89_9c03 ...

  3. Java中的transient关键字

    转载于:[lfsf802](http://blog.csdn.net/lfsf802/article/details/43239663) 关键字介绍 一个对象只要实现了Serilizable接口,这个 ...

  4. 记录一次 “ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序” 的处理过程

    一.今天同事反馈业务化运行的数据中心库发生了oracle无法连接的情况,导致所有业务系统无法正常运作的问题.报:“ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序” 二.收到这 ...

  5. 实时监听input输入内容的N种方法

    现在有一个需求,需要我们实时监听input输入框中的内容,从而带来更好的用户体验,而不是等我们全部输入完毕才告诉我们格式不对首先我们创建一个input输入框 <form name='loginF ...

  6. windows 查看端口占用、关闭端口

    cmd打卡命令窗口 1)netstat -an 查看所有活动连接 2)netstat -aon| findstr “xxxx” 找到指定端口的连接 3)taskkill  /F /PID xxxx 终 ...

  7. [java 2019-04-09] 代码生成word文档中的表格嵌套问题

    public static void createContent3(Date adtStart, Date adtEnd, Map<String, Object> aMap,Map< ...

  8. sql脚本过大,无法打开的解决方法

    打开cmd命令窗口,输入如下命令: sqlcmd -S ipaddress -U user -P password -d dbname -i file 其中,ipaddress是数据库服务器ip,us ...

  9. springboot学习五:IDEA外部tomcat发布

    pom.xml配置 屏蔽自带tomcat <dependency> <groupId>org.springframework.boot</groupId> < ...

  10. jQuery获取各种位置方法

    一.获取窗口的宽高 1.获取流览器显示区域的高度 : $(window).height(); 2.获取流览器显示区域的宽度 : $(window).width(); 3.获取文档流的高度 : $(do ...