KalonQue文档

1.关于KalonQue

    KalonQue一款完全基于PHP语言开发的队列软件产品。

队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。

通过KalonQue可以将复杂的业务同步转异步以及异步转同步:

 1.当业务由同步转为异步的时候,业务会拥有更高的处理效率,响应速度更快。

 2.当业务由异步转为同步的时候,可以在高并发高负载情况下使服务器维持在一个比较稳定的负载范围之内,不会因资源不足而崩溃。

    

2.KalonQue应用场景

   KalonQue一般应用在高负载高并发的http环境。

   场景:例如在一次web请求中,有n个业务操作。一般情况在LAMP环境下,这n个业务操作只能串行的处理。随着业务规模增长,n的值越来越大,响应本次请求的时间越来越长,用户体验越来越差,最终可能达到用户无法忍受的地步。

   解决:对n个业务操作我们可以进行简单的分类:

             1.实时性要求比较高的操作,我们称为前端操作

             2.实时性要求相对较低的操作,我们称为后端操作

             具体如何区分这两类操作,需要凭借开发者自己的经验和感觉,例如在博客系统中发博文的请求中,博文入库肯定是前段操作,这个操作需要在当前请求中立刻完成;记录用户发博文的日志记录我们可以认为是后端操作,因为此操作如果不在本次请求中完成也不会整个发博文请求造成影响。

             现在假设我们在前面n个业务操作中,分出了k个前段操作和m个后端操作。现在对于前面场景中提到的web请求做一次优化,请求会分为两个部分,第一个部分是k个前端操作,这些操作还是和之前一样串行完成,第二部分是m个后端操作,把这m个后端操作需要的原始数据以http(或则别的方式)发送到独立的队列服务器上,数据插入队列后立即返回,这m个后端操作最终会由队列服务器上的一个或则多个队列进程来处理。  由于将m个后端操作需要的原始数据发送到队列服务器的速度相当快,因此我们可以认为前面的web请求只需要执行k个前端操作,这样服务响应速度可以大幅提高。

    分析:从此场景我们可以看到前面提到并行和串行的相互转换过程:

      串行转并行:一次请求原本是串行处理n个操作,现在可以将n个操作中的k个前端操作和m个后端操作并行处理了,提高了服务效率。

      并行转串行:web前端在高并发的情况下,会对队列机有大量的入队列请求,但是最终队列处理的时候是从队头取数据逐条串行处理,这样即使在高并发高负载的情况下,队列机也不会崩溃。

   

     下图为此场景下服务整体结构图:

  

   

3.KalonQue运行环境

1.KalonQue运行在unix类操作系统

2.PHP解释器版本大于等于5,并且需要安装cli sapi(即PHP的命令行模式,默认安装) 

3.PHP解释器除了基本的扩展之外,还需要安装pcntl和posix扩展

 

4.KalonQue安装

    KalonQue是基于PHP语言开发,因此自身不需要编译和安装,但是需要安装PHP语言解释器才能使用KalonQue。可以到PHP官网 http://www.php.net/ 上下载最新的 PHP安装包编译安装。 下载号KalonQue软件包之后,解压拷贝到相关代码目录,具体可以按照如下步骤部署:

 1.例如将解压后的代码目录复制并重命名到 /usr/local/queue/Kalonque

 2.复制配置文件到Kalonque代码目录同级目录

    cp /usr/local/queue/Kalonque/conf/kalonque_config.php  /usr/local/queue/kalonque_config.php

 3.复制队列业务目录到Kalonque代码目录同级目录

    cp /usr/local/queue/Kalonque/business  /usr/local/queue/business -R

 

然后我们就可以开始使用KalonQue:

输入命令:   php /usr/local/queue/Kalonque/bin/kalonque.php -h

 

5.KalonQue工作方式

    KalonQue实质上是一个队列业务的运行载体,用户需要按照一定的规范来编写队列业务类,然后通过KalonQue来启动和停止队列业务进程。

    KalonQue提供了start(启动),stop(停止),restart(重启),invoke(唤醒),add(插入)等一系列指令来控制队列业务进程。 

    5.1 核心模块:

    1.Controller    控制器                 控制整个队列进程活动流程

    2.Business     队列业务逻辑     主要的队列业务逻辑,一般由用户自己编写业务类从基本业务类继承

    3.Store             队列数据存储     队列数据存取方式

    4.Monitor          队列进程监控      当有数据入队列的时候需要唤醒队列进程开始处理数据

    5.Plugin            队列插件              插件可以在不改变系统本身的情况下添加一些新的功能和特性

    5.2 队列启动:

    假设有一个名字为test的队列业务逻辑:

    1.Kalonque的start命令启动test队列后台守护进程

    2.记录守护进程的pid在一个特定的文件中

    3.初始化队列数据存储模块

    4.初始化队列进程监控模块

    5.控制器进入请求主循环,通过队列监控模块进程将保持睡眠或则阻塞状态

    6.监控唤醒队列进程,开始执行循环体,将出队列的原数据提交给test队列业务的处理部分,完成之后回到5

    

    5.3 队列停止:

    1.Kalonque的stop命令停止test队列后台守护进程

    2.读取test队列启动的时候保存在特定文件中的pid

    3.发送终止信号给test队列进程

    注意:队列停止分为普通模式和强制模式,当队列正在处理数据的时候,如果强制终止可能会让正在处理的数据丢失,普通模式能够等到队列处理完当前数据之后再停止。

 

    5.4 队列插入:

    1.Kalonque的add命令给test队列进行入队列操作,队列数据用-d xxxx参数指定数据内容

    2.通过队列存储将数据插入对立尾部

    3.通过Kalonque的invoke命令让队列监控唤醒队列进程

    4.队列进程唤醒之后进入循环体,从队头读数据处理

    5.队列再次进入睡眠或则阻塞状态,等待被监控唤醒

 

6.一个简单的队列业务:Test

    下面我们将给出一个最简单的队列业务例子:

  

6.1 创建队列业务类Test.php:

创建 Test.php:

<?php 
require_once  KALONQUE_BASE_PATH . '/Business/Default.php';

class KalonQueBusinessTest extends KalonQueBusinessDefault
{	
    public function _main()
    {
    	sleep(1);
        echo  __CLASS__ . " loaded data: " . $this->_DATA_LOAD . "\n";
    }
}
?>

将Test.php移动到前面我们设置的队列业务目录/usr/local/queue/business中,注意文件名不能更改,文件名Test.php必须和其中的类KalonQueBusinessTest的后缀Test保持一致。

 

6.2 启动队列test:

通过start操作启动Test队列业务:

 

看到这样的提示,就表示test队列业务已经启动成功。

队列业务名:test   守护进程pid:20492   启动时间: 2011-07-19 11:11:04

用ps命令查看进程是否在运行:

可以看到进程确实在后台运行。

 

6.3 数据入队列:

通过add操作将数据入队列:

 php /usr/local/queue/Kalonque/bin/kalonque.php add test -d 'this is the first  data'

 php /usr/local/queue/Kalonque/bin/kalonque.php add test -d 'this is the second data'

这样就将数据'this is the first  data'和'this is the second data' 两条数据插入test队列尾部了

 

6.4 唤醒队列:

通过invode操作将队列进程唤醒:

可以看到队列唤醒之后,Test.php中的_main()方法执行了两次,打印出了前面入队列的两条数据。

 

6.5 Test.php队列业务类说明:

require_once  KALONQUE_BASE_PATH . '/Business/Default.php';

这个是包含KalonQue核心代码中的默认队列业务类KalonQueBusinessDefault,这里已经定义好了所需要的方法。

KalonQueBusinessTest从KalonQueBusinessDefault继承而来,并且实现了主方法_main()。 _main()实际上是一个钩子方法,当队列被唤醒,并且队列非空的时候,此方法会被调用来执行用户的业务逻辑。

在_main()方法中使用了$this->_DATA_LOAD,此成员变量会由KalonQue自动初始化为当前出队列的数据,在_main()第一次调用的时候,$this->_DATA_LOAD 为 this is the first data,在_main()第二次调用的时候,$this->_DATA_LOAD 为 this is the second data。

 

7.通过HTTP服务进行数据入队列

队列服务通常会部署在独立的服务器上,因此需要提供一个服务接口可以接受数据入队列请求,通常情况下是以apache(或则别的web server)和PHP的组合来提供HTTP服务接口。下面给出一个服务例子:

创建kalonque_cgi.php文件:

<?php 
//包含Kalonque基础配置文件,这个会初始化一些非常重要的宏和变量
define("KALONQUE_PATH" , "/usr/local/queue/KalonQue");
require_once KALONQUE_PATH . '/conf/kalonque_base.php ';

//定义接口返回码
define('CODE_SUCCESS', 0);
define('CODE_FAILED',  1);

$business = $_GET['name'];
$item     = $_GET['data'];
if (empty($business) || empty($item)) {
	show(CODE_FAILED, 'params error');
}

try {
    //创建控制器
    require_once KALONQUE_BASE_PATH . '/Controller/Default.php';
    $controller = new KalonQueControllerDefault($KALONQUE_CONF);
    
    //设置队列业务名
    $controller->setBusiness($business);
    
    //插入数据到队尾
    $controller->addStoreItem($item);
    
    //监控唤醒队列进程
    $controller->updateMonitor();
} catch (Exception $e) {
    show(CODE_FAILED, $e->getMessage());    
}

show(CODE_SUCCESS);

function show($code, $msg = '')
{
	echo $code . ' ' . $msg;
	exit;
}
?>


假设部署队列的服务器域名为 queueserver.com,将kalonque_cgi.php放到APACHE的web根目录下,于是可以通过以下方式访问:

  http://queueserver.com/kalonque_cgi.php 

如果希望给test队列添加一条数据,客户端(例如web前端机)可以通过以下HTTP请求完成。

 http://queueserver.com/kalonque_cgi.php ?name=test&data=this_is_data_from_cgi

在kalonque_cgi.php中主要做了以下工作:

1.加载KalonQue基础配置文件

2.提取CGI参数,主要包括队列名和入队列数据

3.新建一个KalonQue控制器实例

4.控制器根据CGI参数设置队列名

5.控制器根据CGI参数设置要入队列的数据

6.控制器通过监控唤醒队列进程

7.返回结果

 

 下载地址暂不提供。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值