队列服务就是为了提高相应速度,把耗时或者不需要即时处理的流程放到异步处理过程中,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 这个还是很有用的,这个是设置 设置内核可以同时打开的文件描述符的最大值,如果太小的话可能会在运行一段时间后出问题,这个可以根据具体情况来设置。

05-01 00:22