业务场景

商城订单生成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. python笔记(三)---文件读写、修改文件内容、处理json、函数

    文件读写(一) #r 只读,打开文件不存在的话,会报错 #w 只写,会清空原来文件的内容 #a 追加写,不会请求,打开的文件不存在的话,也会帮你新建的一个文件 print(f.read()) #获取到 ...

  2. windows下获取文件描述

    一 背景 前几天, 在公司写的获取文件描述的一段小程序出现了点小问题, 对于一般文件是正常的, 对于win10 C:\Program Files\WindowsApps目录下的通用程序,就是死活获取不 ...

  3. jail-break-rule

    switchOmega plugin for firefox and chrome https://raw.githubusercontent.com/gfwlist/gfwlist/master/g ...

  4. iOS移动开发CoreDate讲解

    ----欢迎------- 在移动端开发,数据持久化保存是基本要素,没钱在2014年之后退出了coredate,本持久化基于oc作为开发,方便程序人员操作.与SQL数据库,MySQL相比,优点颇多. ...

  5. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  6. 自制按钮图标的两种方法: image sprite和svg字体文件

    用image sprite和svg字体文件这两种方法,都能够极大地减少小图形文件的数量, 从而减少服务器请求和带宽需求.提高网页的响应速度. 一.建立SVG字体文件 iconmoon 是一个在线工具, ...

  7. eclipse详细安装教程与环境变量设置

    地址:https://blog.csdn.net/q651742112/article/details/73477400 源地址:https://www.cnblogs.com/yeminglong/ ...

  8. Java Design Patterr

    Factory: ●简介: 工厂模式同单例模式一样,也是Java中最常用的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式.能够根据要求调用者提供的信息为接口指定不同的实现类,降低耦合. ...

  9. python3 正则匹配[^abc]和(?!abc)的区别(把多个字符作为一个整体匹配排除)

    目的:把数字后面不为abc的字符串找出来 如1ab符合要求,2abc不符合要求 str = '1ab' out = re.match(r'\d+(?!abc)',str) str1 = '1abc' ...

  10. Jmeter之数据库性能测试

    公司的**产品急待上线,但查询订单操作响应很慢,为了准确定位问题,特对几个大数据查询语句进行性能测试. 环境介绍:数据库用的MYSQL,采用分布式布置,本次单压测一台数据库服务器,查询待支付订单.待消 ...