一種基於非阻塞機制的http報文處理方法
2023-08-03 02:26:36 3
專利名稱:一種基於非阻塞機制的http報文處理方法
技術領域:
本發明涉及一種基於非阻塞機制的HTTP報文處理方法,主要是用於HTTP伺服器系統。
背景技術:
大型的HTTP伺服器必須能夠以不可預期的規模來處理並發請求。並發的網絡請求和 大規模的網絡負載,要求實現一個並發性能高、可伸縮性強的伺服器系統。目前,構建一個高性能的HTTP伺服器系統,最為普遍的方式有兩種基於多線程的 實現方式和基於事件驅動的實現方式。基於多線程的實現方式,雖然能夠解決阻塞所導致 的等待、有效的利用系統的並發性、縮短用戶響應時間,但是線程是一種重要的系統資源, 分配的線程越多,系統的開銷也就越大。對於一個給定的系統,它能支持的線程有一個閾 值,超過這個閾值,其性能就會有大幅度的降低。 一個解決的辦法就是採用線程池,這樣 就能有效的節省線程創建、切換和回收的系統開銷,然而,如果面對大規模的網絡負載, 顯然,超過線程數量的請求只能等待,而且系統花在線程調度上的時間會大於網絡操作的 時間。基於事件驅動的實現方式,有效的利用了 Reactor模式和非阻塞10,當各種IO事件一 旦準備就緒,就觸發應用程式接收並做相應處理,處理完畢立即返回,應用程式不再等待 10請求,這樣就可以用單一線程來模擬多線程並發。這種方法,被稱之為傳統的非阻塞方 法。它雖然避免了由於阻塞而導致的線程創建、切換和回收的系統開銷,但是沒有能夠利 用SMP (Symmetrical Multi-Processing)系統多處理器的並發能力。同時,由於一個線程需 要處理所有請求,從而增加了單點失效的可能性,也相應的提高了編程的複雜度。一個有效的辦法是結合多線程和事件驅動兩者的優勢,設計出一種混合的模型。這方 面,Matt Welsh在它的高並發網絡框架Sandstorm及其應用Haboob伺服器中早有體現。但 是他並沒有充分利用非阻塞的特點,儘量做到零拷貝和一次遍歷,從一定意義上講,它只 是基於非阻塞10的混合式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線程不一樣,它不僅用來偵聽各種非阻塞10事件的發生 諸如accept、 read、 write等,同時它還負責和客戶端建立連接即處理accept事件以及部分 的write事件。和Haboob—樣,本發明融合了基於事件驅動的非阻塞10和多線程的優勢, 設計出了一種複合的模型,所不同的是,本發明的每一個線程都有一個事件隊列,而這個 事件隊列中可以存放多種類型的事件。當它接受到read事件時,將其插入到工作線程的事 件隊列,由工作線程來讀取數據,數據讀取完畢,如果當前工作線程還未切換,接著解析 數據,否則生成解析事件,插入到事件隊列中。當一個請求解析完畢,工作線程開始構造 其響應報文並發送,在發送的過程中,如果數據無法一次發送完,那麼則需要向select線程 註冊寫事件,由select線程完成剩下的發送工作。因此,工作線程所維護的事件隊列可以有 read、 parse、 response三種類型的事件。這樣, 一個連接的處理過程,被分為不同的事件來 進行,這樣的事件定義為任務。因此,本發明可以用一個線程來並發處理多個連接,而一 個連接的所有任務則在事件隊列中以不相鄰的方式進行。為了提高並發性,本發明依舊採 用了線程池,線程的調度必須根據連接——線程的映射表,以確保一個連接的上述三種類 型的事件在一個線程中完成,從而避免了因為不同步所導致的錯誤。由於非阻塞IO的原因,伺服器端一次收到的報文有可能不是一個完整地HTTP報文, 為了儘量避免數據的多次拷貝和多次遍歷的系統開銷,本發明用大小動態變化的數據緩衝 來保存讀取到的數據,該數據緩衝來源於數據緩衝區,同時定義三個位置和一個解析進度 標識,三個位置即m-position, p-position和f-position,分別記錄已經有效解析的位置,當前 正在解析的位置和當前報文片斷的結束位置。如圖2所示,本發明公開的基於非阻塞機制 HTTP報文處理方法,具體包括以下步驟1、 當讀事件觸發,讀取HTTP報文,將其存放於數據緩衝中;2、 判斷該報文是否需要解析報文頭,是則轉3,否則轉4;3、 判斷報文頭是否已經完整到達,是則解析報文頭,否則轉h4、 判斷報文體是否已經完整到達,是則解析報文體,否則轉l;5、 解析完畢,將數據緩衝回收至數據緩衝池; 以下進一步詳細說明。1.在上述第l步中,當讀事件觸發時,select線程獲取讀事件,由工作線程完成報文 數據的讀取,並保存至緩衝中。數據緩衝的分配方法如下a. 若free鏈中存在著緩衝節點,則從free鏈中刪除隊尾節點,同時在busy鏈的隊尾添 加一個節點。b. 若free鏈中不存在緩衝節點,則從當前內存中獲取一個數據緩衝,並在busy鏈的 隊尾添加一個節點。數據緩衝的使用方法如下-a.當一個連接的報文片斷第一次到達時,分配一個初始大小的數據緩衝,並初始化 tn-position、 p-position禾卩f-position位置為0;c. 若當前緩衝足夠容納該報文片斷,將數據讀入數據緩衝中,附在從f-position開始 的緩衝區內,讀取完畢修改當前報文片斷的結束位置為f-positkm;d. 若當前緩衝不夠容納該報文片斷,則分配另外一個數據緩衝形成緩衝鏈,以存放剩 下的報文片斷,轉b;e. 數據解析完畢,將數據緩衝鏈回收至數據緩衝池中。 判斷當前請求報文的處理進度,並調用與之相對應的報文處理方法。2. 根據解析進度標示判斷該HTTP報文是否需要解析報文頭,若解析進度標示顯示報 文頭還未解析完畢則轉步驟3,若解析進度標示顯示報文頭已經解析完畢,則轉步驟4;3、 報文頭的處理方法如果當前報文的處理進度顯示還未處理報文頭,則報文頭的處理過程如下a. 如果報文中含有"/r/n/r/n",則報文頭讀取完整,則進行下一步;b. 從緩衝中讀取報文;c. 如果當前字符為空格,貝ij將m-position和p-position之間的報文取出,將其保存在 解析結果中,最後將m-position修改為p-position並返回b);d. 如果m-position<= p-position,而且p-position<=f-position,重複進4亍b、 c操作'直到報文頭中的請求行解析完畢;e. 如果當前字符為"",則將m-position和p-position之間的報文取出,將其保存至 name中,同時將m-position修改為p-poshion並返回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鏈 中獲取,避免了多次從內存分配的系統開銷,同時也避免了內存回收的系統開銷。
權利要求
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分另'J記錄已經有效解析的位置、當前正在解析的位置和當前報文片斷的結束位置;b. 若當前緩衝足夠容納該報文片斷,將數據讀入數據緩衝中,附在從f-position開始的緩 衝區內,讀取完畢修改當前報文片斷的結束位置為f-positiomc. 若當前緩衝不夠容納該報文片斷,則分配另外一個數據糹愛衝形成緩衝鏈,以存放剩下的報文片斷,轉步驟b;d. 報文解析完畢,將數據緩衝鏈回收至數據緩衝池中。
3、 根據權利要求1所述的一種基於非阻塞機制的HTTP報文處理方法,其特徵在於所述步驟(3)中報文頭的處理過程如下a. 如果報文中含有"/r/n7r/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為保存報文頭屬性名欄位的變量,vakie為保存報文頭屬性值字 段的變量,而header為name和value的映射表;g. 重複執行b、 e、 f操作,直到當前字符的下一個位置為"/r/n"即報文頭解析完畢,修改 解析進度標示。
4、根據權利要求1所述的一種基於非阻塞機制的HTTP報文處理方法,其特徵在於所述 步驟(4)中報文體的處理過程如下a. 初始化p-position為m-position;b. 如果f-position和p-position之間的報文片斷小於Content-length (HTTP協議中指示報 文體長度的報文頭屬性)所指示的長度,則報文頭不完整,則返回,否則進行下一步;c. 將p-position和f-position之間的報文取出,保存至解析結果中,解析完畢,修改解析 進度標示。
全文摘要
一種基於非阻塞機制的HTTP報文處理方法,包括以下步驟A)當讀事件觸發,讀取HTTP報文,將其存放於數據緩衝中;B)判斷該報文是否需要解析報文頭,是則轉C),否則轉D);C)判斷報文頭是否已經完整到達,是則解析報文頭,否則轉A);D)判斷報文體是否已經完整到達,是則解析報文體,否則轉A);E)解析完畢,將數據緩衝回收至數據緩衝池。本發明糅合了多線程和事件驅動兩者的優點,在HTTP報文的處理過程中,實現了真正的非阻塞機制,使得HTTP報文在解析過程中達到零拷貝和一次遍歷,大大的提高了HTTP報文的處理效率。
文檔編號H04L12/56GK101282300SQ20081010124
公開日2008年10月8日 申請日期2008年3月3日 優先權日2008年3月3日
發明者建 劉, 張德才, 李竹青, 霍遠國, 軍 韓, 馬殿富 申請人:北京航空航天大學