发布于2022年11月4日2年前 基于HTTP协议的轻量级简单队列服务-HTTPSQS 行列(Queue)又称先进先出表(First In First Out),即先进入行列的元素,先从行列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。运用音讯行列能够很好地异步处理数据传送和存储,当你频频地向数据库中刺进数据、频频地向搜索引擎提交数据,就可采取音讯行列来异步刺进。别的,还能够将较慢的处理逻辑、有并发数量约束的处理逻辑,通过音讯行列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。HTTPSQS具有以下特征非常简略,根据 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支撑HTTP协议的编程言语均可调用。非常快速,入行列、出行列速度超过10000次/秒。高并发,支撑上万的并发连接,C10K不成问题。支撑多行列。单个行列支撑的最大行列数量高达10亿条。低内存耗费,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。能够在不中止服务的情况下快捷地修正单个行列的最大行列数量。能够实时检查行列状况(入行列方位、出行列方位、未读行列数量、最大行列数量)。能够检查指定行列ID(行列点)的内容,包含未出、已出的行列内容。检查行列内容时,支撑多字符集编码。源代码不超过800行,合适二次开发。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 installHTTPSQS服务器运用文档httpsqs -h-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假如如行列成功,回来:HTTPSQS_PUT_OK假如如行列失利,回来:HTTPSQS_PUT_ERROR假如行列已满,回来:HTTPSQS_PUT_END从HTTPSQS 1.2版别开端,在回来给客户端的HTTP Header头中增加了一行“Pos: xxx”,输出当时行列的读取方位点,例如: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"以浏览器为例回来音讯行列的内容给客户端。假如没有未取出的音讯行列,则回来:HTTPSQS_GET_END从HTTPSQS 1.2版别开端,在回来给客户端的HTTP Header头中增加了一行“Pos: xxx”,输出当时行列的读取方位点,例如:参数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"示例假如“行列写入点值”大于“最大行列数量值”,将重置“行列写入点”为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万条):1000000HTTP 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_ERRORPHP客户端说明文档(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出产环境典型运用案例架构一个选用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 &
创建帐户或登录后发表意见