CN101282300B - 一种基于非阻塞机制的http报文处理方法 - Google Patents
一种基于非阻塞机制的http报文处理方法 Download PDFInfo
- Publication number
- CN101282300B CN101282300B CN2008101012439A CN200810101243A CN101282300B CN 101282300 B CN101282300 B CN 101282300B CN 2008101012439 A CN2008101012439 A CN 2008101012439A CN 200810101243 A CN200810101243 A CN 200810101243A CN 101282300 B CN101282300 B CN 101282300B
- Authority
- CN
- China
- Prior art keywords
- message
- data buffering
- data
- thread
- http
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Computer And Data Communications (AREA)
Abstract
一种基于非阻塞机制的HTTP报文处理方法,包括以下步骤:A)当读事件触发,读取HTTP报文,将其存放于数据缓冲中;B)判断该报文是否需要解析报文头,是则转C),否则转D);C)判断报文头是否已经完整到达,是则解析报文头,否则转A);D)判断报文体是否已经完整到达,是则解析报文体,否则转A);E)解析完毕,将数据缓冲回收至数据缓冲池。本发明糅合了多线程和事件驱动两者的优点,在HTTP报文的处理过程中,实现了真正的非阻塞机制,使得HTTP报文在解析过程中达到零拷贝和一次遍历,大大的提高了HTTP报文的处理效率。
Description
技术领域
本发明涉及一种基于非阻塞机制的HTTP报文处理方法,主要是用于HTTP服务器***。
背景技术
大型的HTTP服务器必须能够以不可预期的规模来处理并发请求。并发的网络请求和大规模的网络负载,要求实现一个并发性能高、可伸缩性强的服务器***。
目前,构建一个高性能的HTTP服务器***,最为普遍的方式有两种:基于多线程的实现方式和基于事件驱动的实现方式。基于多线程的实现方式,虽然能够解决阻塞所导致的等待、有效的利用***的并发性、缩短用户响应时间,但是线程是一种重要的***资源,分配的线程越多,***的开销也就越大。对于一个给定的***,它能支持的线程有一个阈值,超过这个阈值,其性能就会有大幅度的降低。一个解决的办法就是采用线程池,这样就能有效的节省线程创建、切换和回收的***开销,然而,如果面对大规模的网络负载,显然,超过线程数量的请求只能等待,而且***花在线程调度上的时间会大于网络操作的时间。
基于事件驱动的实现方式,有效的利用了Reactor模式和非阻塞IO,当各种IO事件一旦准备就绪,就触发应用程序接收并做相应处理,处理完毕立即返回,应用程序不再等待IO请求,这样就可以用单一线程来模拟多线程并发。这种方法,被称之为传统的非阻塞方法。它虽然避免了由于阻塞而导致的线程创建、切换和回收的***开销,但是没有能够利用SMP(Symmetrical Multi-Processing)***多处理器的并发能力。同时,由于一个线程需要处理所有请求,从而增加了单点失效的可能性,也相应的提高了编程的复杂度。
一个有效的办法是结合多线程和事件驱动两者的优势,设计出一种混合的模型。这方面,Matt Welsh在它的高并发网络框架SandStorm及其应用Haboob服务器中早有体现。但是他并没有充分利用非阻塞的特点,尽量做到零拷贝和一次遍历,从一定意义上讲,它只是基于非阻塞IO的混合式HTTP服务器。
发明内容
本发明的目的是:提供一种基于非阻塞机制的HTTP报文处理方法,该方法规定了HTTP服务器中如何以非阻塞的方式处理HTTP报文,从而达到零拷贝和一次遍历的效果,以大大提高HTTP报文的处理效率。
为实现上述目的,本发明采取以下技术方案:其前提是建立起基于非阻塞机制的HTTP服务器的线程模型,如图1所示,该服务器的线程模型包括四个组件,即select线程,负责侦听各种非阻塞IO事件的发生并负责和客户端建立连接;线程池,它由多个工作线程组成,每个工作线程包含有一个事件队列,每一个事件队列存放多种类型的事件即任务,即在实现上糅合了多线程和事件驱动两者的优点;连接——线程映射表,其key值为连接,其value值为线程,根据该映射表,从而使得一个连接的所有任务在一个线程中执行,从而避免了因为不同步所导致的错误;数据缓冲池,是存放报文的数据结构,它由两个数据缓冲链组成,其一为busy链,表示正在使用的数据缓冲的集合,其二为free链,表示已经存在但当时未被使用的缓冲集合。因此,数据缓冲池由多个数据缓冲组成,每一个数据缓冲在某一个时刻只保存一个连接的报文,当读取分配数据缓冲的过程报文处理完毕,该缓冲池回收相应的数据缓冲,避免了下次再分配和销毁的开销。在此线程模型基础上,一个数据报文的处理过程包括以下步骤:
A、当读事件触发,读取HTTP报文,将其存放于数据缓冲中;
B、判断该报文是否需要解析报文头,是则转C,否则转D;
C、判断报文头是否已经完整到达,是则解析报文头,否则转A;
D、判断报文体是否已经完整到达,是则解析报文体,否则转A;
E、解析完毕,将数据缓冲回收至数据缓冲池。
本发明与现有技术相比的优点在于:本发明通过线程池和事件队列,糅合了多线程和事件驱动两者的优点,通过连接——线程的映射表,保证了一个连接的报文读取、报文解析、报文响应在一个线程中完成,从而为非阻塞的HTTP报文处理方法奠定了基础。另外,数据缓冲描述符即指向数据缓冲的指针、解析进度标示、m-position、p-position以及f-position的定义,使得HTTP报文在解析的过程中,尽量做到零拷贝和一次遍历,实现了真正的非阻塞机制,大大的提高了HTTP报文的处理效率。
附图说明
图1为本发明基于非阻塞机制的HTTP服务器线程模型。
图2为本发明HTTP报文的非阻塞处理方法;
具体实施方式
本发明公开的非阻塞机制,不仅仅是指在请求的建立、数据的读取以及响应的发送过程中不再等待IO请求的完成而是直接返回此即非阻塞IO,还包括在数据的解析过程中的非阻塞方法即异步解析算法。
本发明公开的基于非阻塞机制的HTTP报文处理方法,是基于图1所示的基于非阻塞机制的HTTP服务器的线程模型,即HTTP服务器如何以非阻塞机制来处理HTTP报文的过程。select线程和传统的listener线程不一样,它不仅用来侦听各种非阻塞IO事件的发生诸如accept、read、write等,同时它还负责和客户端建立连接即处理accept事件以及部分的write事件。和Haboob一样,本发明融合了基于事件驱动的非阻塞IO和多线程的优势,设计出了一种复合的模型,所不同的是,本发明的每一个线程都有一个事件队列,而这个事件队列中可以存放多种类型的事件。当它接受到read事件时,将其***到工作线程的事件队列,由工作线程来读取数据,数据读取完毕,如果当前工作线程还未切换,接着解析数据,否则生成解析事件,***到事件队列中。当一个请求解析完毕,工作线程开始构造其响应报文并发送,在发送的过程中,如果数据无法一次发送完,那么则需要向select线程注册写事件,由select线程完成剩下的发送工作。因此,工作线程所维护的事件队列可以有read、parse、response三种类型的事件。这样,一个连接的处理过程,被分为不同的事件来进行,这样的事件定义为任务。因此,本发明可以用一个线程来并发处理多个连接,而一个连接的所有任务则在事件队列中以不相邻的方式进行。为了提高并发性,本发明依旧采用了线程池,线程的调度必须根据连接——线程的映射表,以确保一个连接的上述三种类型的事件在一个线程中完成,从而避免了因为不同步所导致的错误。
由于非阻塞IO的原因,服务器端一次收到的报文有可能不是一个完整地HTTP报文,为了尽量避免数据的多次拷贝和多次遍历的***开销,本发明用大小动态变化的数据缓冲来保存读取到的数据,该数据缓冲来源于数据缓冲区,同时定义三个位置和一个解析进度标识,三个位置即m-position,p-position和f-position,分别记录已经有效解析的位置,当前正在解析的位置和当前报文片断的结束位置。如图2所示,本发明公开的基于非阻塞机制HTTP报文处理方法,具体包括以下步骤:
1、当读事件触发,读取HTTP报文,将其存放于数据缓冲中;
2、判断该报文是否需要解析报文头,是则转3,否则转4;
3、判断报文头是否已经完整到达,是则解析报文头,否则转1;
4、判断报文体是否已经完整到达,是则解析报文体,否则转1;
5、解析完毕,将数据缓冲回收至数据缓冲池;
以下进一步详细说明。
1.在上述第1步中,当读事件触发时,select线程获取读事件,由工作线程完成报文数据的读取,并保存至缓冲中。
数据缓冲的分配方法如下:
a.若free链中存在着缓冲节点,则从free链中删除队尾节点,同时在busy链的队尾添加一个节点。
b.若free链中不存在缓冲节点,则从当前内存中获取一个数据缓冲,并在busy链的队尾添加一个节点。
数据缓冲的使用方法如下:
a.当一个连接的报文片断第一次到达时,分配一个初始大小的数据缓冲,并初始化m-position、p-position和f-position位置为0;
c.若当前缓冲足够容纳该报文片断,将数据读入数据缓冲中,附在从f-position开始的缓冲区内,读取完毕修改当前报文片断的结束位置为f-position;
d.若当前缓冲不够容纳该报文片断,则分配另外一个数据缓冲形成缓冲链,以存放剩下的报文片断,转b;
e.数据解析完毕,将数据缓冲链回收至数据缓冲池中。
判断当前请求报文的处理进度,并调用与之相对应的报文处理方法。
2.根据解析进度标示判断该HTTP报文是否需要解析报文头,若解析进度标示显示报文头还未解析完毕则转步骤3,若解析进度标示显示报文头已经解析完毕,则转步骤4;
3、报文头的处理方法
如果当前报文的处理进度显示还未处理报文头,则报文头的处理过程如下:
a.如果报文中含有“/r/n/r/n”,则报文头读取完整,则进行下一步;
b.从缓冲中读取报文;
c.如果当前字符为空格,则将m-position和p-position之间的报文取出,将其保存在解析结果中,最后将m-position修改为p-position并返回b);
d.如果m-position<=p-position,而且p-position<=f-position,重复进行b、c操作,直到报文头中的请求行解析完毕;
e.如果当前字符为“:”,则将m-position和p-position之间的报文取出,将其保存至name中,同时将m-position修改为p-position并返回b;
f.如果当前字符为“/r/n”,则将m-position和p-position之间的报文取出,将其保存至value中,同时将(name,value)属性对保存至header中,最后将m-position修改为p-position并返回b;其中步骤e和f所涉及的name为保存报文头属性名字段的变量,value为保存报文头属性值字段的变量,而header为name和value的映射表;
g.重复执行b、e、f操作,直到当前字符的下一个位置为“/r/n”即报文头解析完毕,修改解析进度标示;
HTTP报文处理程序判断当前请求报文的处理进度,并调用与之相对应的报文处理方法。
4、报文体的处理方法
如果当前报文的处理进度显示还未处理报文体,则报文体的处理过程如下:
a.初始化p-position为m-position;
b.如果f-position和p-position之间的报文片断小于Content-length所指示的长度,则报文头不完整,程序返回,否则进行下一步;
c.将p-position和f-position之间的报文取出,保存至解析结果中,解析完毕,修改解析进度标示。
5、解析完毕,将数据缓冲回收至数据缓冲池。即删除busy链中的相应节点,并在free链中的队尾添加一个节点。因此,当下次有报文读取,需要数据缓冲时,可直接从free链中获取,避免了多次从内存分配的***开销,同时也避免了内存回收的***开销。
Claims (3)
1.一种基于非阻塞机制的HTTP报文处理方法,其特征在于:前提是建立起基于非阻塞机制的HTTP服务器的线程模型,该服务器的线程模型包括四个组件,select线程,负责侦听各种非阻塞IO事件的发生并负责和客户端建立连接;线程池,它由多个工作线程组成,每个工作线程包含有一个事件队列,每一个事件队列存放多种类型的事件即任务;连接——线程映射表,其key值为连接,其value值为线程,根据该映射表,使得一个连接的所有任务在一个线程中执行;数据缓冲池,是存放报文的数据结构,它由两个数据缓冲链组成,其一为busy链,表示正在使用的数据缓冲的集合,其二为free链,表示已经存在但当时未被使用的数据缓冲集合,因此,数据缓冲池由多个数据缓冲组成,每一个数据缓冲在某一个时刻只保存一个连接的报文,当读取分配数据缓冲的过程报文处理完毕,该缓冲池回收相应的数据缓冲,避免了下次再分配和销毁的开销;在此线程模型基础上,一个数据报文的处理过程包括以下步骤:
(1)当读事件触发时,select线程获取读事件,由工作线程完成HTTP报文的读取,并保存至数据缓冲中;
(2)判断该HTTP报文是否需要解析报文头,是则转步骤(3),否则转步骤(4);
(3)判断该HTTP报文头是否已经完整到达,是则解析报文头,否则转步骤(1);
(4)判断该HTTP报文体是否已经完整到达,是则解析报文体,否则转步骤(1);
(5)解析完毕,将数据缓冲回收至数据缓冲池。
2.根据权利要求1所述的一种基于非阻塞机制的HTTP报文处理方法,其特征在于:所述步骤(1)的数据缓冲的使用方法如下:
a.当一个连接的报文片断第一次到达时,分配一个初始大小的数据缓冲,并初始化m-position、p-position和f-position位置为0,其中m-position,p-position和f-position分别记录已经有效解析的位置、当前正在解析的位置和当前报文片断的结束位置;
b.若当前缓冲足够容纳该报文片断,将数据读入数据缓冲中,附在从f-position开始的缓冲区内,读取完毕修改当前报文片断的结束位置为f-position;
c.若当前缓冲不够容纳该报文片断,则分配另外一个数据缓冲形成缓冲链,以存放剩下的报文片断,转步骤b;
d.报文解析完毕,将数据缓冲链回收至数据缓冲池中。
3.根据权利要求1所述的一种基于非阻塞机制的HTTP报文处理方法,其特征在于:所述步骤(3)中报文头的处理过程如下:
a.如果报文中含有“/r/n/r/n”,则报文头读取完整,则进行下一步;
b.从缓冲中读取报文;
c.如果当前字符为空格,则将m-position和p-position之间的报文取出,将其保存在解析结果中,最后将m-position修改为p-position并返回b;其中m-position,p-position和f-position分别记录已经有效解析的位置、当前正在解析的位置和当前报文片断的结束位置;
d.如果m-position<=p-position,而且p-position<=f-position,重复进行步骤b、c操作,直到报文头中的请求行解析完毕;
e.如果当前字符为“:”,则将m-position和p-position之间的报文取出,将其保存至name中,同时将m-position修改为p-position并返回b;
f.如果当前字符为“/r/n”,则将m-position和p-position之间的报文取出,将其保存至value中,同时将name和value属性对保存至header中,最后将m-position修改为p-position并返回b;其中步骤e和f所涉及的name为保存报文头属性名字段的变量,value为保存报文头属性值字段的变量,而header为name和value的映射表;
g.重复执行b、e、f操作,直到当前字符的下一个位置为“/r/n”即报文头解析完毕,修改解析进度标示。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101012439A CN101282300B (zh) | 2008-03-03 | 2008-03-03 | 一种基于非阻塞机制的http报文处理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2008101012439A CN101282300B (zh) | 2008-03-03 | 2008-03-03 | 一种基于非阻塞机制的http报文处理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101282300A CN101282300A (zh) | 2008-10-08 |
CN101282300B true CN101282300B (zh) | 2010-12-08 |
Family
ID=40014583
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008101012439A Expired - Fee Related CN101282300B (zh) | 2008-03-03 | 2008-03-03 | 一种基于非阻塞机制的http报文处理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101282300B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101714991B (zh) * | 2009-10-30 | 2012-06-20 | 清华大学 | 心跳机制的实现方法 |
CN102075583A (zh) * | 2011-01-30 | 2011-05-25 | 杭州华三通信技术有限公司 | 一种http请求报文处理方法及其设备 |
CN103327128A (zh) * | 2013-07-23 | 2013-09-25 | 百度在线网络技术(北京)有限公司 | 用于MapReduce的中间数据传输方法及*** |
CN103513990B (zh) * | 2013-10-11 | 2017-01-25 | 科大讯飞股份有限公司 | 一种用于分布式处理的高性能通用网络框架的设计方法 |
CN104796395A (zh) * | 2014-06-11 | 2015-07-22 | 合肥星服信息科技有限责任公司 | 一种瞬间大规模网络连接的处理方法 |
CN104506490A (zh) * | 2014-11-27 | 2015-04-08 | 北京极科极客科技有限公司 | 一种路由器内核下的代理方法及装置 |
CN105991676B (zh) * | 2015-01-30 | 2019-04-09 | 阿里巴巴集团控股有限公司 | 数据的获取方法和装置 |
CN108631947B (zh) * | 2018-05-21 | 2021-06-25 | 南京大学 | 一种基于纠删码的rdma网络数据传输方法 |
CN112003767A (zh) * | 2020-08-14 | 2020-11-27 | 上海许继电气有限公司 | 一种模拟报文发送方法 |
CN114827035A (zh) * | 2022-05-05 | 2022-07-29 | 浪潮通信信息***有限公司 | 一种网元通信方法、装置及计算机介质 |
CN116962512B (zh) * | 2023-09-20 | 2024-01-05 | 北京信安世纪科技股份有限公司 | 报文处理方法、设备、存储介质和装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1440167A (zh) * | 2003-03-28 | 2003-09-03 | 北京港湾网络有限公司 | 宽带通信数据传输方法 |
CN1997030A (zh) * | 2006-12-13 | 2007-07-11 | 武汉虹旭信息技术有限责任公司 | 用于http数据还原的方法 |
-
2008
- 2008-03-03 CN CN2008101012439A patent/CN101282300B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1440167A (zh) * | 2003-03-28 | 2003-09-03 | 北京港湾网络有限公司 | 宽带通信数据传输方法 |
CN1997030A (zh) * | 2006-12-13 | 2007-07-11 | 武汉虹旭信息技术有限责任公司 | 用于http数据还原的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101282300A (zh) | 2008-10-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101282300B (zh) | 一种基于非阻塞机制的http报文处理方法 | |
DE60030767T2 (de) | Datenzuweisung zu threads in einem multi-threaded netzwerkprozessor | |
DE69606648T2 (de) | Verfahren und vorrichtung zur ablauffolgen von multiprozessoren mit starker affinität | |
Larson et al. | Memory allocation for long-running server applications | |
DE68927375T2 (de) | Arbitrierung von Übertragungsanforderungen in einem Multiprozessor-Rechnersystem | |
DE60006270T2 (de) | Parallele prozessorarchitektur | |
DE112012003961T5 (de) | Gleichzeitige Verarbeitung von eingereihten Nachrichten | |
CN110908788A (zh) | 基于Spark Streaming的数据处理方法、装置、计算机设备及存储介质 | |
CN102662725B (zh) | 一种事件驱动的高并发流程虚拟机实现方法 | |
DE102012210895A1 (de) | Vorhersage der ungeordneten Parallelverarbeitung der Befehle von Threads in einem Multithread-Prozessor | |
US20110145312A1 (en) | Server architecture for multi-core systems | |
CN106454354B (zh) | 一种avs2并行编码处理***及方法 | |
CN108268468B (zh) | 一种大数据的分析方法及*** | |
CN109857565A (zh) | 数据处理方法、装置、计算机设备及存储介质 | |
CN111416858B (zh) | 一种媒体资源的处理平台、方法、装置和服务器 | |
Hruby et al. | On Sockets and System Calls: Minimizing Context Switches for the Socket {API} | |
Liu et al. | Optimizing shuffle in wide-area data analytics | |
Li et al. | {MilliSort} and {MilliQuery}:{Large-Scale}{Data-Intensive} Computing in Milliseconds | |
CN113342839A (zh) | 数据处理方法、装置、终端设备和存储介质 | |
CN112613276A (zh) | 一种流式文档解析的并行执行方法及*** | |
CA2382728A1 (en) | Efficient event waiting | |
CN112486996B (zh) | 面向对象的内存数据存储*** | |
Denis | Scalability of the NewMadeleine communication library for large numbers of MPI point-to-point requests | |
DE102023105563A1 (de) | Arrays kooperativer gruppen | |
CN111131243B (zh) | Dpi***策略处理方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20101208 Termination date: 20140303 |