基于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架构进行介绍,协议的底层实现不 ...
随机推荐
- jquery文件导入问题
开发前台web,导入jquery文件的时候最好用 <script type="text/javascript" src="path"></sc ...
- asp.net 正在加载/处理(兼容IE Chrome)
正在加载分两种 一种是页面初始化效果,也就是数据读取前,这个时候需要用ajax先显示读取中数据,当ajax回调的时候,读取页面数据 一种是界面读取中效果,就是用div显示,当OnPreRenderCo ...
- Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...
- CI 多表关联查询
方法一:$this->db->query("sql 语句"); 直接写sql语句 方法二: #多表关联查询 $data=$this->db->fr ...
- 第二百六十七节,Tornado框架-分页封装模块
Tornado框架-分页封装模块 框架引擎 #!/usr/bin/env python #coding:utf-8 import tornado.ioloop import tornado.web # ...
- ie中自动识别单屏与双屏(js)
<!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...
- php计算数组相同值出现次数的代码(array_count_values)
php计算数组相同值出现次数,可以使用php自带函数array_count_values : 说明 array array_count_values ( array $input )array_cou ...
- PHP实现手机号码中间四位用星号(*)隐藏的自定义函数分享
php屏蔽电话号码中间四位: Method 1: function hidtel($phone){ $IsWhat = preg_match('/(0[0-9]{2,3}[\-]?[2-9][0-9] ...
- HBaseclientAPI基本操作
Java类与HBase数据模型 HBaseConfiguration 包名 : org.apache.hadoop.hbase.HBaseConfiguration 作用:对HBase进行配置. 使用 ...
- Effective C++ 条款26
尽可能延后变量定义式的出现时间 我们知道定义一个对象的时候有一个不争的事实,那就是分配内存.假设是我们自己定义的对象.程序运行过程中会调用类的构造函数和析构函数. 我们打个例如,假设天下雨了,你带把雨 ...