基于HTTP协议的轻量级开源简单队列服务:HTTPSQS 笔记
队列服务就是为了提高相应速度,把耗时或者不需要即时处理的流程放到异步处理过程中,HTTPSQS就是这样一个服务。
更详细的可以参考 http://blog.s135.com/httpsqs/,这里记录一些在安装和使用过程中的一些问题和解决办法的笔记。
1、安装tokyocabinet时提示bzlib.h is required
yum list | grep bzip #查找可用的包
yum install bzip2-devel
2、安装tokyocabinet时提示zlib.h is required
yum install zlib-devel
3、在yum操作的时候可能会遇到“This system is not registered with RHN”
更改yum的源,即更换/etc/yum.repos.d /rhel-debuginfo.repo 这个文件。
进入/etc/yum.repos.d/目录,终端中输入wget http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo即可在此目录下得到CentOS- Base.repo文件,这是centos的源文件,
只需将其重命名为rhel-debuginfo.repo即可,以前的文件做个备份。rhel6版本的linux对应的是 rhel-source.repo文件。
4、可能是因为我换了个64位系统,在yum安装的时候报错,主要是版本对不上,有可能是太新的版本,这个时候就要自己手动去安装了。这个我费了老半天劲,后来司马当活马医无意发现的,但是还可能会遇到好多问题,下面是网上的资料
1、tc make file时候,当碰到依赖libbz2.a或者libz.a这两个库的时候会出现编译错误。
诸如:
缺少zlib.h这个文件
//******************************************************************************************************************************//
/usr/bin/ld: /usr/local/lib/libbz2.a(bzlib.o): relocation R_X86_64_32S against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libbz2.a: could not read symbols: Bad value
collect2: ld 返回 1
make: *** [libtokyocabinet.so.8.22.0] 错误 1
//******************************************************************************************************************************//
/usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/libz.a: could not read symbols: Bad value
make: *** [libtokyocabinet.so.8.22.0] 错误 1
//******************************************************************************************************************************//
凡是这两个问题,很重要一个原因是bzip的开发依赖包没有装好,或者没装。
首先要下载这两个安装包
1、bzip2-1.0.4.tar.gz
2、zlib-1.2.3.tar.gz
我上网找过很多解决方法。但是问题依旧,依然编译不过去。
即使用了ubuntu的apt-get install libbz2-dev。。。
网上一般都是修改bzip源码包的Makefile文件。(装个小东西,知识一定要丰富!)
网上的解决方法:
在gcc编译参数中加入-fPIC(对于该参数,我在备注中有解释,适合菜鸟级c语言用户理解)
但是问题,有时后就只刁难你,还是不怎么奏效。
我总结了一下方法:
1、注意顺序问题:(这三个东西一环扣一环,真麻烦)
如果发现 libbz2.a: could not read symbols: Bad value
就应该把/usr/local/lib中的libbz2.a删掉
进入解压缩的zlib-1.2.3目录,用make clean命令清理一下。
同样,/usr/local/lib/libz.a: could not read symbols
操作同上,删掉libz.a,把bzip2-1.0.4目录的编译文件清理一下。
如果找不到这两个文件的位置,可以在终端敲上:
find -name libbz2.a
....
2.修改zlib-1.2.3的Makefile文件
把gcc的编译参数加上 -fPIC
原文:CFLAGS=-O3 -DUSE_MMAP
修改为:CFLAGS=-O3 -DUSE_MMAP -fPIC
如果还是过不去,劝你硬来CC=gcc 直接后面跟上-fPIC让他们全部独立编译
重申:如果你之前编译过了,一定要用make clean清掉,否则还是徒劳。。
最后make 还有 make install
3.修改bzip2-1.0.4的Makefile文件
CC=gcc -fPIC 《===这个就是我发飙的结果,全部让他 -fPIC
AR=ar
RANLIB=ranlib
LDFLAGS=
BIGFILES=-D_FILE_OFFSET_BITS=64
CFLAGS=-fPIC -Wall -Winline -O2 -g $(BIGFILES) 《===当然这里也可以加上
同样,bzip2有一个Makefile-libbz2_so的文件,编译时会调用,当然你也可以单个编译:
make -f Makefile-libbz2_so
make clean <------------保守建议,还是clean一下
make
make install
具体bzip2的安装方法可以参照:
http://lamp.linux.gov.cn/Linux/LFS-6.2/chapter06/bzip2.html
最后重新安装tc
我用的是最新版本:tokyocabinet-1.4.31.tar.gz
估计应该修复了一些bug。
make clean
make
当输出:
#================================================================
# Ready to install.
#================================================================
一切ok,装吧 make install
备注:
fPIC参数解释:
-fpic
原文:Position independant code, needed for shared libraries.
我的理解:独立编译代码,需要共享苦支持(菜鸟级译法)
-fPIC
Position independant code, needed for shared libraries.
I am a bit in the dark what exactly the difference between -fpic and -fPIC is. It seems that -fPIC works always while -fpic produces smaller object files.
我的理解:这两个参数的不同在于,下面这个是总会执行,上面小写的只提供更小的对象文件编译。
-----------------------------------------------------------------------------------------------------------------------------
make tokyocabinet 的时候可能会出现下面的错误
./libtokyocabinet.so: undefined reference to `BZ2_bzCompress'
./libtokyocabinet.so: undefined reference to `BZ2_bzDecompress'
./libtokyocabinet.so: undefined reference to `BZ2_bzDecompressEnd'
./libtokyocabinet.so: undefined reference to `BZ2_bzDecompressInit'
./libtokyocabinet.so: undefined reference to `BZ2_bzCompressEnd'
collect2: ld 返回 1
make: *** [tcutest] 错误 1
解决方法:
/configure --help
./configure --with-bzip=BZIP_PATH
./configure --with-bzip=DIR/include;DIR/lib
./configure --disable-bzip
wget http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
tar -zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make install prefix=/usr/local
./configure --enable-off64 --prefix=/usr/local/tokyocabinet-1.4.47 --with-bzip=/usr/local/include;/usr/local/lib
make
make install
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 -d -p 1218 -x /data0/queue -a mypass 启动.
其中 “/data0/queue” 就是这个队列库文件所在的位置,“mypass”就是密码,请求时都要使用这个密码的
可以用 curl "http://127.0.0.1:1218/?name=queue0&opt=status&auth=mypass123" 查看下状态。
注意:这里的queue0就是队列的名字,似乎是自动建立的,不需要手动建,目前还没有查询有哪些队列的途径,所以你自己建立了那些队列要自己记住啊,而且这些队列是共用“/data0/queue/httpsqs.db”这个库文件的,而且这个文件初始化为近400M的,我自己的看了下我的是385M。原文是这样说“初始化数据库文件400多M,主要是针对1亿条以上的队列记录进行了结构优化。多个队列占用空间是共用的,如果创建20个、甚至几百、几千个队列,还是400M空间。初始化之后的httpsqs.db文件大小增长跟队列数无关,只跟存储的数据量相关,存储的数据占用多少空间,httpsqs.db文件就占用多少空间。”
例如:curl "http://127.0.0.1:1218/?name=queue0&opt=put&data=经过URL编码的文本消息&auth=mypass"
用 ps aux | grep httpsqs 后会发现有两个httpsqs进程。一个是[httpsqs: master process] 一个是httpsqs: worker process],它采用的是master/worker设计模式。这个之后再学习。
好了之后就是使用了。1.7后有php的例子文件,其实自己写个模拟http请求的方法也不难,甚至直接用 file_get_content 函数都行。
另外 ulimit -SHn 65535 这个还是很有用的,这个是设置 设置内核可以同时打开的文件描述符的最大值,如果太小的话可能会在运行一段时间后出问题,这个可以根据具体情况来设置。
基于HTTP协议的轻量级开源简单队列服务:HTTPSQS 笔记的更多相关文章
- 转:基于HTTP协议的轻量级开源简单队列服务:HTTPSQS
[文章作者:张宴 本文版本:v1.7.1 最后修改:2011.11.04 转载请注明原文链接:http://blog.zyan.cc/httpsqs/] HTTPSQS(HTTP Simple Que ...
- 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[转]
HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key ...
- 基于TCP 协议的socket 简单通信
DNS 服务器:域名解析 socket 套接字 : socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...
- Nginx 外的另一选择,轻量级开源 Web 服务器 Tengine 发布新版本
新版发布 近日,轻量级开源 Web 服务器 Tengine 发布了2.3.0版本,新增如下特性: ngx_http_proxy_connect_module,该模块让 Tengine 可以用于正向代理 ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- 网络编程之TCP三次握手与四次挥手、基于TCP协议的套接字编程
目录 TCP三次握手和四次挥手 背景描述 常用的熟知端口号 TCP概述 TCP连接的建立(三次握手) TCP四次挥手 如果已建立连接,客户端突然断开,会怎么办呢? 基于TCP协议的套接字编程 什么是S ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- .net平台 基于 XMPP协议的即时消息服务端简单实现
.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...
- (转)基于即时通信和LBS技术的位置感知服务(二):XMPP协议总结以及开源解决方案
在<基于即时通信和LBS技术的位置感知服务(一):提出问题及解决方案>一文中,提到尝试使用XMPP协议来实现即时通信.本文将对XMPP协议框架以及相关的C/S架构进行介绍,协议的底层实现不 ...
随机推荐
- linux之basename
NAME top basename, dirname - parse pathname components SYNOPSIS top #include <libgen.h> char * ...
- GetLastError 错误码大全(转载)
转载自:GetLastError GetLastError GetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置.函数 并无必要设置上一 ...
- ldap temp
#http://www.openldap.org/software/man.cgi?query=slapcat&apropos=0&sektion=0&manpath=Open ...
- lua工具库penlight--04路径和目录
使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl ...
- [shell]system和execlp简单示例
shell脚本:hello.sh #!/bin/bash echo "i am in shell script" echo "param 1 is $1" ec ...
- c经典算法
1. 河内之塔 说明 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时 北越的首都,即现在的胡志明市:1883年法国数学家 Ed ...
- JQuery操作表单相关使用总结
select下拉列表onChange事件之JQuery实现: JQuery: $(document).ready(function () { $("#selectMenu").bi ...
- 解决cookie跨域访问.2
v一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入 ...
- VC++ 窗口拆分CSplitterWnd
前言 当前许多优秀的软件都采用“多视”技术. 所谓“多视”,是指在同一个框架窗口里同时显示多个视图. 通过运用这种技术,可以在框架的有限控件内同时提供用户更大的信息量,并且使得用户界面 ...
- A mail sent to Google chromium.org Groups for Help
Hi, I've ported Chromium M39 to 4.4 using WebView. The main modifications are: I changed AwContents: ...