数据结构里面的队列是先进先出的数据结构,在服务器开发中使用队列可以有效的实现任务的异步处理,把耗时的任务放在一个队列中,由消费者去自动处理,比如客户端用户把错题生成pdf文件下载,可以在客户端点击生成的时候把任务放入队列异步处理,然后直接先返回给用户结果,而不必让用户等待。

队列用处

  • 异步处理:用户注册后查找数据库发送邮件推荐商品,把推荐商品放入队列。
  • 系统解耦:上面的过程将用户注册和推荐商品分离开来了。
  • 定时任务: 把考生的试卷提交信息提前放入队列,每天固定某个时间实现自动批改选择题。

beanstalkd工具

beanstalked是一个简单的快速的通用的轻量级内存队列,可以实现百万级任务处理。

特性

  • 优先级:可以设置任务的优先级
  • 延迟: 设置任务多少秒后才允许被消费者使用
  • 持久化:定时刷新数据到文件,服务器挂掉后数据依旧存在
  • 超时会重发:消费者必须在指定时间内完成任务,否则就会重新放入管道
  • 任务预留:消费者先暂时跳过任务不处理
 
任务和管道
 
任务的状态转换

ready:任务已经准备好了,可以给消费者使用。
delay:任务放入管道的时候设置了延迟时间。
reserve:消费者把任务读取出来
buried:任务先放在一边,以后还会用
delete:任务从队列删除

安装

地址:https://github.com/kr/beanstalkd

可以通过源代码安装或者包管理工具(brew,apt-get)安装,安装完成后输入beanstalkd会由相应的命令.

 
image.png

首先使用下面的命令绑定本地地址和端口号

 beanstalkd -l 127.0.0.1 -p 11300 &

beanstalkd的类管理

可以使用pheantalkphp类操作beanstalkdpheantalk是对beanstalkd命令的封装。可以通过该类实现对任务的操作。

https://github.com/pda/pheanstalk

require 'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk('127.0.0.1',);
//查看beanstalk的当前信息命令行的封装
print_r($pheanstalk->stats());
 
 
比如查看某个任务的信息
print_r($pheanstalk->putInTube('mytube','job',1000));
$job = $pheanstalk->watch('mytube')->reserve();
print_r( $pheanstalk->statsJob($job));
 
 

还有其他的操作如下

require 'vendor/autoload.php';

use Pheanstalk\Pheanstalk;

//现在命令行输入  beanstalkd -l 127.0.0.1 -p 11300 & 开启

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

//查看beanstalk的当前信息

// 可以通过命令行对管道进行管理,本php类对管道的管理就是对beanstalkd命令行的封装

print_r($pheanstalk->stats());

// 当前的管道
print_r($pheanstalk->listTubes()); // 查看默认的管道
print_r($pheanstalk->statsTube('default')); //在mytube 里面放入任务 one,使用默认的优先级,延迟重发时间,超时重发时间,
$pheanstalk->useTube('mytube')->put('one'); //从管道取出任务 $job = $pheanstalk->watch('mytube')->reserve();
//根据job的编号获取信息
$job = $pheanstalk->peek(1); $pheanstalk->delete($job);//删除任务 $pheanstalk->watch('mytube')->delete($job);
//会把任务重新放入管道,并把任务设置为ready状态
$pheanstalk->release($job); //把任务放在一边暂时不处理,条件成熟了在读取出来
$pheanstalk->bury($job); $pheanstalk->peekBuried('mytube');// 获取处理bury状态的任务 $pheanstalk->kickJob($job);//会把job转变成ready状态 $pheanstalk->kick(200);//把job编号小于200的变成ready状态 //--- 获取某个状态的任务
$pheanstalk->peekDelayed();
$pheanstalk->peekReady();
$pheanstalk->peekBuried(); $pheanstalk->pauseTube('mytube',10);//阻塞整个管道时间

生成者和消费者

生产者将任务放入队列

require  'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk("127.0.0.1",11300);
$pheanstalk->useTube('mytube')->put('one',1024,10,3);
$pheanstalk->useTube('mytube')->put('two',1023);
$pheanstalk->useTube('mytube')->put('three',1025);
print_r($pheanstalk->stats());

消费者处理任务

require  'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
//终端等待表示没有生产者产生数据
$pheanstalk = new Pheanstalk("127.0.0.1",11300);
//reserve可以设置阻塞时间,不设置会一直等待,watch 可以同时监听两个管道,
$job = $pheanstalk->watch('mytube')->watch('default')->reserve(); // reserver是获取ready的job
$pheanstalk->ignore('default');//忽略管道
//处理代码
if ($job->getData() == 'one') {
sleep(2);// 超时重回队列3秒,睡眠两秒,delete之前的代码还能执行1秒,如果想在加
$pheanstalk->watch('mytube')->touch($job);//续命
}

具体对队列和任务的操作可以结合实际逻辑和设置任务和管道的状态。

参考:https://www.jianshu.com/p/82c4c6fee450

beanstalkd队列的更多相关文章

  1. 【转】Beanstalkd 队列简易使用

    Beanstalkd一个高性能分布式内存队列系统   之前在微博上调查过大家正在使用的分布式内存队列系统,反馈有Memcacheq,Fqueue, RabbitMQ, Beanstalkd以及link ...

  2. 安装beanstalkd队列问题——No package beanstalkd available

    CentOS7.4安装beanstalkd 时无可用源 No package beanstalkd availableError:Nothing to do 可从以下获取:wget /etc/yum. ...

  3. yii2.0 中的队列

    a yii2 extension to make simple to use queue. yii2-queue让队列的使用在yii2中变得更轻松,她为各种队列组件的使用提供了一个标准的接口,您只需要 ...

  4. Beanstalkd一个高性能分布式内存队列系统

    高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...

  5. beanstalkd 消息队列

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

  6. 轻量级队列beanstalkd

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

  7. 高性能分布式内存队列系统beanstalkd(转)

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

  8. 使用Beanstalkd实现队列

    Beanstalkd可以想象成缓存当中的memcahe或者redise,将我们的队列任务放到内存中进行管理. 运行环境是在linux中,反正我的windows中没运行成功.../(ㄒoㄒ)/~~ 首先 ...

  9. Beanstalkd 一个高性能分布式内存队列系统

    需要一个分布式内存队列,能支持这些特性:任务不重不漏的分发给消费者(最基础的).分布式多点部署.任务持久化.批量处理.错误重试..... 转载:http://rdc.taobao.com/blog/c ...

随机推荐

  1. Could not find a version that satisfies the requirement win32api (from versions: ) No matching distribution found for win32api

    pip install win32api pip install pywin32 都会提示错误,如下: Could not find a version that satisfies the requ ...

  2. Failed to read candidate component class

    今天编程时遇到了Failed to read candidate component class 这个异常,查了好久终于发现了是因为jdk的版本不对,所以报了这个错.

  3. 【JavaWeb】JSP常用内置对象

    session //a页面 <% request.getSession().setAttribute("key","session");%> < ...

  4. 测试者出的APP测试面试题

    测试者出的APP测试面试题 一.开场问题:(自由发挥) 1.请自我介绍一下: 2.为什么离开上一个公司呢? 3.做测试多久了?以前做过哪些项目?你们以前测试的流程是怎样的?用过哪些测试工具? 4.你觉 ...

  5. UIScrollView的API

    @property(nonatomic, weak) id<UIScrollViewDelegate> delegate; 滚动视图对象的委托. @property(nonatomic) ...

  6. 装有Ubuntu的硬盘插入到电脑中无法进入

    前言 前段时间,由于自己作死,将BIOS的CPU电压设置解锁,导致BIOS芯片烧坏.在将电脑返厂维修后,我把装有Ubuntu18.04系统的固态硬盘插入到电脑中,但是电脑无法进入grub,采取任何方法 ...

  7. char、pchar、string互相转换

    1.string转换成pchar 可以使用pchar进行强制类型转换,也可以使用StrPCopy函数 var s:string; p,p1:PChar; begin s:='Hello Delphi' ...

  8. JavaScript高级特征之面向对象笔记

    Javascript面向对象 函数 * Arguments对象: * Arguments对象是数组对象 * Arguments对象的length属性可以获取参数的个数 * 利用Arguments对象模 ...

  9. frp 配置

    前言 对于没有公网 IP 的内网用户来说,远程管理或在外网访问内网机器上的服务是一个问题. 今天给大家介绍一款好用内网穿透工具 FRP,FRP 全名:Fast Reverse Proxy.FRP 是一 ...

  10. CVPR 2019 行人检测新思路:

    CVPR 2019 行人检测新思路:高级语义特征检测取得精度新突破 原创: CV君 我爱计算机视觉 今天 点击我爱计算机视觉置顶或标星,更快获取CVML新技术 今天跟大家分享一篇昨天新出的CVPR 2 ...