zoukankan      html  css  js  c++  java
  • 基于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 这个还是很有用的,这个是设置 设置内核可以同时打开的文件描述符的最大值,如果太小的话可能会在运行一段时间后出问题,这个可以根据具体情况来设置。

  • 相关阅读:
    PHP数组
    java中线程池的几种实现方式
    JAVA是是如何处理字符的。
    byte范围及8种常见数据类型
    对Spring 及SpringMVC的理解
    Nginx+Tomcat搭建负载均衡
    nginx + tomcat配置负载均衡
    Java并发编程:Lock
    Java内部类详解
    奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?
  • 原文地址:https://www.cnblogs.com/wayne173/p/3783964.html
Copyright © 2011-2022 走看看