跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

  • 0

基于HTTP协议的轻量级简单队列服务-HTTPSQS


HACK1949

问题

基于HTTP协议的轻量级简单队列服务-HTTPSQS

5fe8697f5f401.png

行列(Queue)又称先进先出表(First In First Out),即先进入行列的元素,先从行列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。运用音讯行列能够很好地异步处理数据传送和存储,当你频频地向数据库中刺进数据、频频地向搜索引擎提交数据,就可采取音讯行列来异步刺进。别的,还能够将较慢的处理逻辑、有并发数量约束的处理逻辑,通过音讯行列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。

HTTPSQS具有以下特征

  • 非常简略,根据 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支撑HTTP协议的编程言语均可调用。
  • 非常快速,入行列、出行列速度超过10000次/秒。
  • 高并发,支撑上万的并发连接,C10K不成问题。
  • 支撑多行列。
  • 单个行列支撑的最大行列数量高达10亿条。
  • 低内存耗费,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。
  • 能够在不中止服务的情况下快捷地修正单个行列的最大行列数量。
  • 能够实时检查行列状况(入行列方位、出行列方位、未读行列数量、最大行列数量)。
  • 能够检查指定行列ID(行列点)的内容,包含未出、已出的行列内容。
  • 检查行列内容时,支撑多字符集编码。
  • 源代码不超过800行,合适二次开发。

720430-20200911175325712-1767508494.png

HTTPQS1.7压力测验:

选用Apache ab指令进行压力测验,敞开10个线程,放入10万条文本数据(每条512字节)到行列中:
  运用HTTP Keep-Alive时:23018 requests/sec
  封闭HTTP Keep-Alive时:11840 requests/sec

  选用Apache ab指令进行压力测验,敞开10个线程,从行列中取出10万条文本数据(每条512字节):
  运用HTTP Keep-Alive时:25982 requests/sec
  封闭HTTP Keep-Alive时:13294 requests/sec

  详细测验内容:http://code.google.com/p/httpsqs/wiki/BenchmarkTest

  出产环境运用:在金山游戏官网中,新闻、论坛帖子、客服布告、SNS社区等产生的增、删、改操作,文本内容实时写入HTTPSQS行列,全站搜索引擎增量索引准实时(1分钟内)更新的数据源取自HTTPSQS。HTTPSQS 2009年12月18日上线至今,运转稳定,既有来自Web服务器的入行列操作,也有来自指令行脚本的批量入、出行列操作。

HTTPSQS编译装置

HTTPSQS软件包等都是放在了https://code.google.com/archive/p/httpsqs/downloads下,一般情况下无法网站无法打卡,这里供给百度网盘下载链接。

软件包:百度网盘暗码:3uml

留意:HTTPSQS与所需求的依靠包具有强依靠性,必须是指定的版别,不要为了求新装置最新的依靠包,否则在装置httpsqs时会报错

ulimit -SHn 65535  # 切换到资源包目录 cd /usr/local/src
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/
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

HTTPSQS服务器运用文档

httpsqs -h

720430-20200911175349045-1838039731.png

-l监听的IP地址,默许值为 0.0.0.0
-p监听的TCP端口(默许值:1218)
-x数据库目录,目录不存在会自动创立(例如:/opt/httpsqs/data)
-tHTTP请求的超时时刻(默许值:3)
-s同步内存缓冲区内容到磁盘的距离秒数(默许值:5)
-c内存中缓存的最大非叶子节点数(默许值:1024)
-m数据库内存缓存巨细,单位:MB(默许值:100)
-i保存进程PID到文件中(默许值:/tmp/httpsqs.pid)
-a拜访HTTPSQS的验证暗码(例如:mypass123)
-d 以看护进程运转
-h 显示这个帮助

示例:

ulimit -SHn 65535
httpsqs -d -p 1218 -x /data0/queue

请运用指令“killall httpsqs”、“pkill httpsqs”和“kill cat /tmp/httpsqs.pid”来中止httpsqs。

killall httpsqs
pkill httpsqs
kill `cat /tmp/httpsqs.pid`

留意:请不要运用指令“pkill -9 httpsqs”和“kill -9 httpsqs的进程ID”来结束httpsqs,否则,内存中没有保存到磁盘的数据将会丢失。

HTTPSQS客户端运用文档

入行列(将文本音讯放入行列):

HTTP GET协议(以curl指令为例)

curl "http://host:port/?name=your_queue_name&opt=put&data=通过URL编码的文本音讯&auth=mypass123"

示例:

http://172.16.93.128:1218/?name=queue&opt=put&data=hello+world

720430-20200911175406350-72035124.png

假如如行列成功,回来:

HTTPSQS_PUT_OK

假如如行列失利,回来:

HTTPSQS_PUT_ERROR

假如行列已满,回来:

HTTPSQS_PUT_END

从HTTPSQS 1.2版别开端,在回来给客户端的HTTP Header头中增加了一行“Pos: xxx”,输出当时行列的读取方位点,例如:

720430-20200911175419666-466625414.png

HTTP POST协议(以curl指令为例)

curl -d "通过URL编码的文本音讯" "http://host:port/?name=your_queue_name&opt=put&auth=mypass123"

出行列(从行列中取出文本音讯)

HTTP GET协议(以curl指令为例)

curl "http://host:port/?charset=utf-8&name=your_queue_name&opt=get&auth=mypass123"
curl "http://host:port/?charset=gb2312&name=your_queue_name&opt=get&auth=mypass123"

以浏览器为例

720430-20200911175431965-76820535.png

回来音讯行列的内容给客户端。

假如没有未取出的音讯行列,则回来:

HTTPSQS_GET_END

从HTTPSQS 1.2版别开端,在回来给客户端的HTTP Header头中增加了一行“Pos: xxx”,输出当时行列的读取方位点,例如:

720430-20200911175444446-2139193213.png

参数charset说明(例如:/?charset=utf-8):
  指定HTTP输出Header头的字符编码,即:
  Content-Type: text/plain; charset=utf-8

  任何在IANA注册的字符编码均可运用,但是,并不是所有的浏览器都能解析全部的字符编码。关于中文,常用的字符编码有:utf-8、gb2312、gbk、gb18030、big5等。

检查行列状况(一般方法,便于浏览器检查)

HTTP GET 协议(以curl指令为例)

curl "http://host:port/?name=your_queue_name&opt=status&auth=mypass123"

示例

720430-20200911175514968-43035868.png

假如“行列写入点值”大于“最大行列数量值”,将重置“行列写入点”为1,即又从1开端存储新的行列内容,掩盖本来行列方位点的内容:

HTTP Simple Queue Service v1.7
------------------------------
Queue Name: queue
Maximum number of queues: 1000000
Put position of queue (2st lap): 4562
Get position of queue (1st lap): 900045
Number of unread queue: 104517

检查行列状况(JSON方法,便于程序处理回来内容)

从HTTPSQS 1.3版别开端支撑此功用。

HTTP GET 协议(以curl指令为例):

curl "http://host:port/?name=your_queue_name&opt=status_json&auth=mypass123"

回来(示例):

{"name":"xoyo","maxqueue":1000000,"putpos":45,"putlap":1,"getpos":6,"getlap":1,"unread":39}

假如“行列写入点值”大于“最大行列数量值”,将重置“行列写入点”为1,即又从1开端存储新的行列内容,掩盖本来行列方位点的内容:

{"name":"xoyo","maxqueue":1000000,"putpos":4562,"putlap":2,"getpos":900045,"getlap":1,"unread":104517}

检查指定行列方位点的内容

跟一般的行列体系不同的是,HTTPSQS 能够检查指定行列ID(行列点)的内容,包含未出、已出的行列内容。能够方便地观测进入行列的内容是否正确。

别的,假定有一个发送手机短信的行列,由客户端看护进程从行列中取出信息,并调用“短信网关接口”发送短信。但是,假如某段时刻“短信网关接口”有毛病,而这段时刻行列方位点300~900的信息现已出行列,但是发送短信失利,我们还能够在方位点300~900被掩盖前,检查到这些方位点的内容,作相应的处理。

HTTP GET 协议(以curl指令为例):

curl "http://host:port/?charset=utf-8&name=your_queue_name&opt=view&pos=5&auth=mypass123"
curl "http://host:port/?charset=gb2312&name=your_queue_name&opt=view&pos=19&auth=mypass123"

pos >=1 而且 <= 1000000000

回来指定行列方位点的内容。

重置指定行列

HTTP GET 协议(以curl指令为例):

curl "http://host:port/?name=your_queue_name&opt=reset&auth=mypass123"

假如重置成功,回来:

HTTPSQS_RESET_OK

假如重置失利,回来:

HTTPSQS_RESET_ERROR

更改指定行列的最大行列数量

默许的最大行列长度(100万条):1000000

HTTP GET 协议(以curl指令为例)

curl "http://host:port/?name=your_queue_name&opt=maxqueue&num=1000000000&auth=mypass123"

num >=10 而且 <= 1000000000

假如更改最大行列数量成功,则回来:

HTTPSQS_MAXQUEUE_OK

更改的最大行列数量必须大于当时的“行列写入点”。别的,当“行列写入点”小于“行列读取点”时(即PUT坐落圆环的第二圈,而GET坐落圆环的第一圈时),本操作将被撤销,然后回来给客户端以下信息:

HTTPSQS_MAXQUEUE_CANCEL

不中止服务的情况下,修正守时改写内存缓冲区内容到磁盘的距离时刻

从HTTPSQS 1.3版别开端支撑此功用。

默许距离时刻:5秒 或 httpsqs -s参数设置的值。

HTTP GET 协议(以curl指令为例):

curl "http://host:port/?name=your_queue_name&opt=synctime&num=10&auth=mypass123"

num >=1 and <= 1000000000

假如修正距离时刻成功,则回来:

HTTPSQS_SYNCTIME_OK

假如 num 不在 1 ~ 1000000000 之间,本操作将被撤销,然后回来给客户端以下信息:

HTTPSQS_SYNCTIME_CANCEL

暗码校验失利

从HTTPSQS 1.5版别开端支撑此功用。

假如暗码校验失利(/?auth=xxx),将回来以下信息:

HTTPSQS_AUTH_FAILED

大局过错

假如产生大局过错(即指令、参数过错等),将回来以下信息:

HTTPSQS_ERROR

PHP客户端说明文档

(1) PHP客户端扩展(第三方供给,详情请拜访:http://code.google.com/p/php-httpsqs-client/)

(2) PHP客户端Class文件(官方供给:适用于HTTPSQS1.7以上版别,推荐运用,源码包也在上面的百度网盘里)

require_once 'httpsqs_client.php';
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset); /* 
1. 将文本信息放入一个行列(留意:假如要放入行列的PHP变量是一个数组,需求事先运用序列化、json_encode等函数转换成文本)
    假如入行列成功,回来布尔值:true 
    假如入行列失利,回来布尔值:false 
*/ $result = $httpsqs->put($queue_name, $queue_data); /* 
2. 从一个行列中取出文本信息
    回来该行列的内容
    假如没有未被取出的行列,则回来文本信息:HTTPSQS_GET_END
    假如产生过错,回来布尔值:false 
*/ $result = $httpsqs->get($queue_name); /* 
3. 从一个行列中取出文本信息和当时行列读取点Pos
    回来数组示例:array("pos" => 7, "data" => "text message")
    假如没有未被取出的行列,则回来数组:array("pos" => 0, "data" => "HTTPSQS_GET_END")
    假如产生过错,回来布尔值:false
*/ $result = $httpsqs->gets($queue_name); /* 
4. 检查行列状况(一般方法)
*/ $result = $httpsqs->status($queue_name); /* 
5. 检查行列状况(JSON方法)
    回来示例:{"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
*/ $result = $httpsqs->status_json($queue_name); /* 
6. 检查指定行列方位点的内容
    回来指定行列方位点的内容。
*/ $result = $httpsqs->view($queue_name, $queue_pos); /* 
7. 重置指定行列
    假如重置行列成功,回来布尔值:true 
    假如重置行列失利,回来布尔值:false 
*/ $result = $httpsqs->reset($queue_name); /* 
8. 更改指定行列的最大行列数量
   假如更改成功,回来布尔值:true
   假如更改操作被撤销,回来布尔值:false
*/ $result = $httpsqs->maxqueue($queue_name, $num); /*
9. 修正守时改写内存缓冲区内容到磁盘的距离时刻
   假如更改成功,回来布尔值:true
   假如更改操作被撤销,回来布尔值:false
*/ $result = $httpsqs->synctime($num);

HTTPSQS出产环境典型运用案例架构

720430-20200911175607708-516011204.png

一个选用PHP编写的HTTPSQS客户端简略看护进程框架如下:

环境,假定PHP装置途径为/usr/local/webserver/php,运用PHP编写一个文件/opt/httpsqs_client_daemon.php:

require_once dirname(__FILE__)."/httpsqs_client.php";     
$httpsqs = new httpsqs($host, $port, $auth, $charset); while(true) {  
  $result = $httpsqs->gets($name);  
  $pos = $result["pos"]; //当时行列音讯的读取方位点  $data = $result["data"]; //当时行列音讯的内容  if ($data != "HTTPSQS_GET_END" && $data != "HTTPSQS_ERROR") {  
    ...去做运用操作...  
  } else {  
    sleep(1); //暂停1秒钟后,再次循环  }  
}

在Linux下,推送到后台履行即可:

nohup /usr/local/webserver/php/bin/php /opt/httpsqs_client_daemon.php 2>&1 > /dev/null &
链接帖子
意见的链接
分享到其他网站

这个问题有0个答案

推荐的帖子

此问题没有答案

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...