23 June 2015

HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储。


HTTPSQS 编译安装:

ulimit -SHn 65535

wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz
tar zxvf libevent-2.0.12-stable.tar.gz
cd libevent-2.0.12-stable/
./configure --prefix=/usr/local/libevent-2.0.12-stable/
make
make install
cd ../

wget http://httpsqs.googlecode.com/files/tokyocabinet-1.4.47.tar.gz
tar zxvf tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47/
./configure --prefix=/usr/local/tokyocabinet-1.4.47/
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64 --prefix=/usr/local/tokyocabinet-1.4.47/
make
make install
cd ../

wget http://httpsqs.googlecode.com/files/httpsqs-1.7.tar.gz
tar zxvf httpsqs-1.7.tar.gz
cd httpsqs-1.7/
make
make install
cd ../

HTTPSQS 服务器使用文档:

使用httpsqs -h 命令进行查看。

-l <ip_addr> 监听的IP地址,默认值为 0.0.0.0
-p <num> 监听的TCP端口(默认值:1218)
-x <path> 数据库目录,目录不存在会自动创建(例如:/opt/httpsqs/data)
-t <second> HTTP请求的超时时间(默认值:3)
-s <second> 同步内存缓冲区内容到磁盘的间隔秒数(默认值:5)
-c <num> 内存中缓存的最大非叶子节点数(默认值:1024)
-m <size> 数据库内存缓存大小,单位:MB(默认值:100)
-i <file> 保存进程PID到文件中(默认值:/tmp/httpsqs.pid)
-a <auth> 访问HTTPSQS的验证密码(例如:mypass123)
-d 以守护进程运行
-h 显示这个帮助

服务器开启httpsqs服务:

ulimit -SHn 65535
httpsqs -d -p 1218 -x /data0/queue

停止httpsqs服务:

请使用命令“killall httpsqs”、“pkill httpsqs”和“kill cat /tmp/httpsqs.pid”来停止httpsqs。

注意:请不要使用命令“pkill -9 httpsqs”和“kill -9 httpsqs的进程ID”来结束httpsqs,否则,内存中尚未保存到磁盘的数据将会丢失。


HTTPSQS 客户端

PHP 客户端说明文档:

PHP 客户端扩展 :github/httpsqs

用法 demo:

<?php  
include_once("httpsqs_client.php");   
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset);   
   
/*  
1. 将文本信息放入一个队列(注意:如果要放入队列的PHP变量是一个数组,需要事先使用序列化、json_encode等函数转换成文本) 
    如果入队列成功,返回布尔值:true  
    如果入队列失败,返回布尔值:false  
*/   
$result = $httpsqs->put($queue_name, $queue_data);   
   
/*  
2. 从一个队列中取出文本信息 
    返回该队列的内容 
    如果没有未被取出的队列,则返回文本信息:HTTPSQS_GET_END 
    如果发生错误,返回布尔值:false  
*/   
$result = $httpsqs->get($queue_name);   
  
/*  
3. 从一个队列中取出文本信息和当前队列读取点Pos 
    返回数组示例:array("pos" => 7, "data" => "text message") 
    如果没有未被取出的队列,则返回数组:array("pos" => 0, "data" => "HTTPSQS_GET_END") 
    如果发生错误,返回布尔值:false 
*/   
$result = $httpsqs->gets($queue_name);  
  
/*  
4. 查看队列状态(普通方式) 
*/   
$result = $httpsqs->status($queue_name);  
  
/*  
5. 查看队列状态(JSON方式) 
    返回示例:{"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10} 
*/   
$result = $httpsqs->status_json($queue_name);  
   
/*  
6. 查看指定队列位置点的内容 
    返回指定队列位置点的内容。 
*/   
$result = $httpsqs->view($queue_name, $queue_pos);  
   
/*  
7. 重置指定队列 
    如果重置队列成功,返回布尔值:true  
    如果重置队列失败,返回布尔值:false  
*/   
$result = $httpsqs->reset($queue_name);  
   
/*  
8. 更改指定队列的最大队列数量 
   如果更改成功,返回布尔值:true 
   如果更改操作被取消,返回布尔值:false 
*/   
$result = $httpsqs->maxqueue($queue_name, $num);  
  
/* 
9. 修改定时刷新内存缓冲区内容到磁盘的间隔时间 
   如果更改成功,返回布尔值:true 
   如果更改操作被取消,返回布尔值:false 
*/  
$result = $httpsqs->synctime($num);  
?>  

采用PHP编写的HTTPSQS客户端简单守护进程:

环境,假设PHP安装路径为/usr/local/webserver/php,使用PHP编写一个文件/opt/httpsqs_client_daemon.php:

<?php  
include_once dirname(__FILE__)."/httpsqs_client.php";     
$httpsqs = new httpsqs($host, $port, $auth, $charset);  
while(true) {  
  $result = $httpsqs->gets($name);  
  $pos = $result["pos"]; //当前队列消息的读取位置点  
  $data = $result["data"]; //当前队列消息的内容  
  if ($data != "HTTPSQS_GET_END" && $data != "HTTPSQS_ERROR") {  
    ...去做应用操作...  
  } else {  
    sleep(1);   //暂停1秒钟后,再次循环  
  }  
}  
?>

HTTPSQS 1.7 压力测试:

采用Apache ab命令进行压力测试,开启10个线程,放入10万条文本数据(每条512字节)到队列中:
  使用HTTP Keep-Alive时:23018 requests/sec
  关闭HTTP Keep-Alive时:11840 requests/sec

采用Apache ab命令进行压力测试,开启10个线程,从队列中取出10万条文本数据(每条512字节):
  使用HTTP Keep-Alive时:25982 requests/sec
  关闭HTTP Keep-Alive时:13294 requests/sec

文章内容转自张宴的技术博客,了解更多内容请访问:轻量级消息队列服务HTTPSQS