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

  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(队列点)的内容,包括未出、已出的队列内容。
  ● 查看队列内容时,支持多字符集编码。
  ● 源代码不超过700行,适合二次开发。



  HTTPSQS 1.2 版本增加的功能:

  1、服务器端:

  ● PUT入队列、GET出时,1.2版本在Header头增加了一行Pos,输出当前队列“写入点”或“读取点”。假设从队列取出一条消息,这条消息的队列读取点Pos为7,将这条消息插入数据库失败了,那么,就可以在失败Pos日志文件中记录这个队列点。过段时间后,只要该Pos点的数据未被覆盖,通过“http://127.0.0.1:1218/?charset=utf-8&name=your_queue_name&opt=view&pos=7”则可以再次取出该条消息,做失败原因分析或进一步处理。

  ● PUT入队列时,如果“队列写入点”追上“队列读取点”,会返回“HTTPSQS_PUT_END”,提示队列已满,而不是像1.1版本那样直接覆盖未读数据。

  2、客户端:

  ● 增加了Perl版本的客户端。感谢网友tonny0830为HTTPSQS开发了Perl客户端。

  ● PHP客户端Class增加了函数$httpsqs->gets($host, $port, $charset, $name)、$httpsqs->pgets($host, $port, $charset, $name),详细使用说明请见:http://blog.zyan.cc/httpsqs/



  HTTPSQS 1.1 版本如何升级到 HTTPSQS 1.2 版本:

  ●服务器端版本完全兼容:编译安装 HTTPSQS 1.2,替换 HTTPSQS 1.1,然后“kill httpsqs的进程ID”,按原来的启动参数启动 HTTPSQS 即可,数据完全兼容。

  ●客户端版本完全兼容:HTTPSQS 1.1 版本的PHP客户端,仍可以直接操作 HTTPSQS 1.2。两个版本的PHP客户端函数使用方式、参数相同,1.2 版本的PHP客户端与 1.1 版本相比,增加了gets()和pgets()函数,用于从一个队列中取出文本信息和当前队列读取点Pos。



  HTTPSQS 1.2 的生产环境典型应用案例架构:

  点击在新窗口中浏览此图片



  HTTPSQS 1.2 版本的详细使用说明,请访问:http://blog.zyan.cc/httpsqs/






技术大类 » Cache与存储 | 评论(46) | 引用(0) | 阅读(65871)
oop
2010-3-18 23:28
sf
ritto
2010-3-19 08:06
好文章,顶
键盘人生 Homepage
2010-3-19 08:43
有空的时候来研究下
showsky Email Homepage
2010-3-19 09:21
不错!!
spring
2010-3-19 09:54
请教你画图用的是什么软件?  谢谢!
张宴 回复于 2010-3-19 11:58
Edraw Max 4.0
arthur_kang
2010-3-19 14:26
感谢分享 正需要这种现成的应用  TT确实作为基础结构可以扩展蛮多的应用
张宴 回复于 2010-3-19 19:30
确实。TC作为Key-Value的基础类库,可以扩充很多应用。
arthur_kang
2010-3-19 16:25
最好再能指定pos的范围进行批量读出;pos可选按时间倒序,即pos=1始终为最新的
怪物宝
2010-3-20 01:43
太好了,网站快完工了,正在试这个
dabanba Email Homepage
2010-3-22 12:03
学习实验中~
gavin2u
2010-3-27 07:53
好文啊

请问文中的架构图是什么软件画的?谢谢
瀦。尛兎 Email Homepage
2010-4-4 17:46
学习了,技术含量太高了,不是很明白
peterhan
2010-4-6 14:14
架构图是用什么软件画的啊?
xyqshow Email
2010-4-7 23:29
看了一下源码,发现每次入队列和出队列的时候都是先获取队列的写入点和队列的读取点,我就想当在获取写入或读取点时如果有并发同时获取到了,有没有可能导致入队列失败? 呵呵,不知我这么想对不对。。
张宴 回复于 2010-4-8 11:45
HTTPSQS基于Libevent、EPOLL的单进程单线程事件驱动模型,不会存在一个事件被多个线程同时得到的情况,是在无锁的情况下完成整个过程。10000万个并发请求,是一个个窜行顺序处理完的(速度很快),跟Memcached机制类似,因此获取“写入点”或“读取点”两个事件,总有先后顺序,不存在并发同时获取到的情况。
dodgepudding Email
2010-4-8 13:35
看了一下源码,为什么自己写urldecode函数而不用libevent内建的evhttp_decode_uri,是内建的效率比较低吗?
dekar
2010-4-16 16:11
请问 具体 能做什么呢
rodericliu
2010-5-19 22:49
请问为什么httpsqs可执行文件的权限要定在4755,为什么要setuid?
tyler
2010-5-27 15:03
请问这个队列处理,与redis自带的list数据结构,使用起来有什么优势或者不同吗?谢谢
qi
2010-6-10 16:13
我想知道如果这样处理,php守护程序会不会执行超时呢?
zior Homepage
2010-7-19 10:46
架构图是用什么软件画的啊?急需绘制类似图形。 盼回复。zior.liu@gmail.comzior.org
小强
2010-10-13 21:02
请问那么漂亮的图用什么工具画的?
分页: 1/3 第一页 1 2 3 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]