基于http协议的轻量级开源简单队列服务

系统服务   httpsqs  

[文章作者:张宴 本文版本:v1.7.1 最后修改:2011.11.04 转载请注明原文链接:http://blog.zyan.cc/httpsqs/]

本文有修改

简介

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

  项目网址:http://code.google.com/p/httpsqs/   使用文档:http://blog.zyan.cc/httpsqs/   使用环境:Linux(同时支持32位、64位操作系统,推荐使用64位操作系统)   软件作者:张宴

  队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取消息队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。

  HTTPSQS 具有以下特征:

  ● 非常简单,基于 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支持HTTP协议的编程语言均可调用。
  ● 非常快速,入队列、出队列速度超过10000次/秒。
  ● 高并发,支持上万的并发连接,C10K不成问题。
  ● 支持多队列。
  ● 单个队列支持的最大队列数量高达10亿条。
  ● 低内存消耗,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。
  ● 可以在不停止服务的情况下便捷地修改单个队列的最大队列数量。
  ● 可以实时查看队列状态(入队列位置、出队列位置、未读队列数量、最大队列数量)。
  ● 可以查看指定队列ID(队列点)的内容,包括未出、已出的队列内容。
  ● 查看队列内容时,支持多字符集编码。
  ● 源代码不超过800行,适合二次开发。

HTTPSQS 压力测试

  采用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

  详细测试内容:http://code.google.com/p/httpsqs/wiki/BenchmarkTest

  生产环境应用:在金山游戏官网中,新闻、论坛帖子、客服公告、SNS社区等发生的增、删、改操作,文本内容实时写入HTTPSQS队列,全站搜索引擎增量索引准实时(1分钟内)更新的数据源取自HTTPSQS。HTTPSQS 2009年12月18日上线至今,运行稳定,既有来自Web服务器的入队列操作,也有来自命令行脚本的批量入、出队列操作。

HTTPSQS 编译安装
ulimit -SHn 65535  
tar zxf libevent-2.0.22-stable.tar.gz  
./configure  --prefix=/usr/local/libs
make && make install  
ldconfig -v  

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/libs
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64 --prefix=/usr/local/libs
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/  
#由于更改了库的安装路径所以修改Makefile第二行为==>
vim Makefile  
CFLAGS=-Wl,-rpath,/usr/local/libs/lib/:/usr/local/libs/lib/ -L/usr/local/libs/lib/ -levent -L/usr/local/libs/lib/ -ltokyocabinet -I/usr/local/libs/include/ -I/usr/local/libs/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g  
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 显示这个帮助
启动

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

停止

killall httpsqs
pkill httpsqs
kill $(cat /tmp/httpsqs.pid)