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

  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位操作系统)
  软件作者:张宴



  HTTPSQS 1.7 版本更新内容:

  下面的内容不只是介绍 HTTPSQS 1.7 更新了哪些东西,更多的介绍在于:如何绕开 Libevent 2.0.x evhttp 使用过程中,无法正常处理包含“|”字符的 URI 参数的问题;提供了一份比 Libevent 官方网站更新的在线文档;Linux 下如何动态编译程序,运行时不用在 /etc/ld.so.conf 文件中添加动态链接库路径。

  1、针对 Libevent 2.0.x 版本 evhttp_parse_query 函数的 BUG。

  网友发邮件,反应了一个 HTTPSQS 的 BUG,见下图,data 的值为NULL。我查找发现,这不是 HTTPSQS 的 BUG,而是 Libevent 2.0.x 版本的 BUG。在 Libevent 1.4.14b 版本中,evhttp_parse_query 函数是能够正常处理包含“|”字符的 URI 的,而在 Libevent 2.0.12 版本中,同样使用 evhttp_parse_query 函数,包含“|”字符的 URI  处理后的结果是 NULL。

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

  对比 Libevent 2.0.12 和 1.4.14b 版本的 evhttp_parse_query 函数代码,发现在 2.0.12 版本中,evhttp_parse_query(const char *uri, struct evkeyvalq *headers) 实际变成了调用 evhttp_parse_query_impl(uri, headers, 1) 函数,该函数内再调用的一个 2.0.x 版本新增的函数 evhttp_uri_parse(const char *source_uri),逻辑处理代码在 evhttp_uri_parse_with_flags(const char *source_uri, unsigned flags) 函数中。evhttp_uri_parse(const char *source_uri) 无法正确解析含有“|”的URL,遇到类似“http://127.0.0.1:1218/?opt=get&name=aaa|bbb”的URL,直接返回NULL,也就是 BUG 所在。

  libevent-2.0.12-stable/http.c
  点击在新窗口中浏览此图片

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

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

  不建议修改第三方库,这个 BUG 还是留给 Libevent 自己去解决吧。使用 Libevent 2.0.x evhttp 作开发的同学,遇到URI参数中包含“|”的问题,注意一下吧。

  我修改了 HTTPSQS 代码,在 HTTPSQS 1.7 版本,采用以下方式来绕开evhttp_uri_parse(const char *source_uri)函数,解决这个问题。其中用到了 Libevent 2.0.x  evhttp_request 结构体中新增的 struct evhttp_uri *uri_elems,以及新增的函数 evhttp_parse_query_str (const char *uri, struct evkeyvalq *headers)。

  Libevent 的官方文档只有 1.4.10-stable2.0.1-alpha 版本的,2.0.1x 很多新增的函数、结构体都没有。

  我这里提供一份最新的 Libevent 在线文档: http://blog.zyan.cc/book/libevent/



  2、静态编译改为动态编译,并指定程序运行时查找的动态链接库路径

  一些网友反映,CentOS 6.0、Fedora 等系统没有默认安装lz、lbz2、lrt、...等静态链接库,出现无法编译HTTPSQS的情况:
gcc -o httpsqs httpsqs.c prename.c -L/usr/local/libevent-2.0.10-stable/lib/ -levent -L/usr/local/tokyocabinet-1.4.47/lib/ -ltokyocabinet -I/usr/local/libevent-2.0.10-stable/include/ -I/usr/local/tokyocabinet-1.4.47/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g --static  
/usr/bin/ld: cannot find -lz  
/usr/bin/ld: cannot find -lbz2  
/usr/bin/ld: cannot find -lrt  
/usr/bin/ld: cannot find -lpthread  
/usr/bin/ld: cannot find -lm  
/usr/bin/ld: cannot find -lc  
/usr/bin/ld: cannot find -lc  
collect2: ld 返回 1  
make: *** [httpsqs] 错误 1


  HTTPSQS 1.7 版本改为动态编译,编译时使用“-Wl,-rpath”参数指定了程序运行时的动态库搜索路径。这样就不需要在 /etc/ld.so.conf 中 添加 HTTPSQS 程序运行时需要的 libevent、tokyocabinet 动态链接库路径了,可以避免与其他软件(例如:Memcached、TT)使用的 libevent、tokyocabinet 动态链接库版本相冲突。详情请见 Makefile 文件:
# Makefile for httpsqs
CC=gcc
CFLAGS=-Wl,-rpath,/usr/local/libevent-2.0.12-stable/lib/:/usr/local/tokyocabinet-1.4.47/lib/ -L/usr/local/libevent-2.0.12-stable/lib/ -levent -L/usr/local/tokyocabinet-1.4.47/lib/ -ltokyocabinet -I/usr/local/libevent-2.0.12-stable/include/ -I/usr/local/tokyocabinet-1.4.47/include/ -lz -lbz2 -lrt -lpthread -lm -lc -O2 -g

httpsqs: httpsqs.c
  $(CC) -o httpsqs httpsqs.c prename.c $(CFLAGS)
  @echo ""
  @echo "httpsqs build complete."
  @echo ""  

clean: httpsqs
  rm -f httpsqs

install: httpsqs
  install $(INSTALL_FLAGS) -m 4755 -o root httpsqs $(DESTDIR)/usr/bin


  用 ldd 命令查看一下 HTTPSQS 使用的动态链接库:
[root@ibm1 httpsqs-1.7]# ldd ./httpsqs
        linux-vdso.so.1 =>  (0x00007fff0ebff000)
        libevent-2.0.so.5 => /usr/local/libevent-2.0.12-stable/lib/libevent-2.0.so.5 (0x00007f5157979000)
        libtokyocabinet.so.9 => /usr/local/tokyocabinet-1.4.47/lib/libtokyocabinet.so.9 (0x00007f51576f6000)
        libz.so.1 => /lib64/libz.so.1 (0x00000038a1400000)
        libbz2.so.1 => /lib64/libbz2.so.1 (0x00000038a8800000)
        librt.so.1 => /lib64/librt.so.1 (0x00000038a2000000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00000038a1000000)
        libm.so.6 => /lib64/libm.so.6 (0x00000038a1800000)
        libc.so.6 => /lib64/libc.so.6 (0x00000038a0c00000)
        /lib64/ld-linux-x86-64.so.2 (0x00000038a0400000)

  发现,libevent 和 libtokyocabinet 使用的是我们指定 lib 路径中的动态链接库。



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





技术大类 » Cache与存储 | 评论(97) | 引用(0) | 阅读(75761)
无派 Email
2011-7-27 23:53
我最近也在用libevent写一些项目。 很有参考价值,谢谢。
硅谷教育博客 Email Homepage
2011-7-28 10:07
菜鸟很难看懂的,我晕死,在这里给博主推荐一个不错的东东,中国第一部程序员题材的银幕电影《让爱飞》,观看地址:http://t.cn/alwuli
带头大哥 Homepage
2011-7-28 12:29
正在使用HTTPSQS 的飘过,原来bug,折腾了好多天,张哥及时啊.....
郑州 Email Homepage
2011-7-28 16:10
程序看不懂,惭愧  我的博客 www.xiaowenbin.com
二手房交易流程 Email Homepage
2011-8-2 14:39
额...我得研究一下!
梦芭莎优惠券 Email Homepage
2011-8-4 02:31
很喜欢你的blog,偶尔来学点技术  My blog  http://www.pyouxi.com
小作家 Homepage
2011-8-12 10:38
看不懂  不过还是要支持张兄
loki Email
2011-8-17 11:59
遇到一个问题,在ssd硬盘上killall httpsqs会报错。*** glibc detected *** [httpsqs: worker process] ~bin/httpsqs -l 10.151.130.150 -p 8081 -x /data5/msg_bus_data -t 30 -s 5 -d: double free or corruption (!prev): 0x00000000006471c0 ***看了下core文件,错误是并不在httpsqs中哈:)#0  0x00000000004be6b5 in raise ()#1  0x0000000000475350 in abort ()#2  0x000000000047de6b in __libc_message ()#3  0x0000000000482711 in malloc_printerr ()#4  0x0000000000483cda in free ()#5  0x0000000000443266 in tcbdbdel (bdb=0x646ee0) at tcbdb.c:192不知道张哥遇到过没,有没什么应对办法?
scott
2011-8-19 09:25
多台服务器分布式部署的情况下有没有考虑?
好乐买 Homepage
2011-9-5 00:28
不错学习了 真的很好              好乐买优惠券
wendal Homepage
2011-9-6 13:05
发现一个小bug

如果执行 killall httpsqs的话,偶尔会出现
*** glibc detected *** [httpsqs: worker process] /home/wendal/app/httpsqs/httpsqs -d -m 10 -x /home/wendal/app/data/httpsqs -p 8203: double free or corruption (!prev): 0x0a1a1fa8 ***
======= Backtrace: =========
[0x8116b8e]
[0x811afa9]
[0x80c9605]
[0x920400]
[0x804d172]
[0x804e0da]
[0x804e0f2]
[0x8048d86]
[0x810803f]
[0x8048201]
======= Memory map: ========
00920000-00921000 r-xp 00000000 00:00 0          [vdso]
08048000-081ca000 r-xp 00000000 08:02 28181456   /home/wendal/app/httpsqs/httpsqs
081ca000-081cd000 rw-p 00181000 08:02 28181456   /home/wendal/app/httpsqs/httpsqs
081cd000-081d1000 rw-p 00000000 00:00 0
0a1a0000-0a1c2000 rw-p 00000000 00:00 0          [heap]
9ef0c000-9ef0d000 ---p 00000000 00:00 0
9ef0d000-9f70d000 rw-p 00000000 00:00 0
b7600000-b7621000 rw-p 00000000 00:00 0
b7621000-b7700000 ---p 00000000 00:00 0
bf91e000-bf93f000 rw-p 00000000 00:00 0          [stack]

使用的版本是1.6

我自己分析的原因是因为worker进程同时收到2个结束信号,调用kill_signal_worker时出错
/* 子进程信号处理 */
static void kill_signal_worker(const int sig) {
  /* 同步内存数据到磁盘,并关闭数据库 */
  tcbdbsync(httpsqs_db_tcbdb);
  tcbdbclose(httpsqs_db_tcbdb);
  tcbdbdel(httpsqs_db_tcbdb); //这里也许已经被执行,导致出错
  
         exit(0);
}
樱桃木地柜 Email Homepage
2011-9-15 10:02
哇哦,都是牛人,我还得慢慢学啊
最新电视剧 Email Homepage
2011-9-16 17:53
路人转到这来了 有空也来我的www.1314ys.net 看看啊
王治
2011-9-19 16:59
很好的资料!
pe培训 Email Homepage
2011-9-20 15:51
新版发布,支持一下
十月传奇 Email Homepage
2011-9-23 16:21
学习技术!
清华大学外企高管研修 Email Homepage
2011-9-29 16:00
针对 Libevent 2.0.x 版本 evhttp_parse_query 函数的 BUG。
银川婚纱摄影工作室 Homepage
2011-10-5 14:56
这技术很好学习了
blonde extensions Email Homepage
2011-10-8 12:53
技术不错,偷偷学了
好友
2011-10-9 13:38
楼主你好, 我用HTTPSQS , 添加含有字符'+'的字符串, 则取出来的时候,字符'+' , 都会被替换成空格。不知道你有没有发现这个问题,或者其他人有没有遇到这个问题。
分页: 1/5 第一页 1 2 3 4 5 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]