<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    放翁(文初)的一畝三分地

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      210 隨筆 :: 1 文章 :: 320 評論 :: 0 Trackbacks
     

    Author:放翁(文初)

    Date: 2010/11/23

    Email:fangweng@taobao.com

    mblog: http://t.sina.com.cn/fangweng

    blog: http://blog.csdn.net/cenwenchu79/

            問題的誕生與思考:

    一.   依賴之苦

    做過不少業務系統,最痛苦,最無奈的就是性能和穩定性依賴與外部系統處理能力和可用時間。而TOP是典型的Proxy模式,它自身的性能在傳統的Web容器處理模式下依賴與后端服務處理能力。

                               

               TOPWeb容器線程連接有限的情況下,最差的處理能力就是min(A,B,C),也就是一個時刻的處理都是在處理最慢的系統的請求。因此產生這么幾個問題:a.通過壓力測試評估TOP自身的處理能力,并且來預估所需要的服務器容量將變得很不可靠。 b.可能由于某一個后端服務的不正常導致正常服務也無法通過TOP被外部訪問到,使得局部不可用演變成為整體不可用。

             延展考慮,由于容器端線程不支持根據業務情況分配,因此無法實現靜態或者動態的線程資源按業務重要性或者服務健康狀況做調整,這樣對于一個集成了眾多重要程度不同,能力參差不齊的服務平臺來說很難最有效的將合理的資源傾向于重要且健康的服務。

    二.   輪詢之苦

    首先,耗時的業務處理,例如對于歷史訂單的數據查詢,后臺操作會消耗較多時間,而傳統請求是阻塞式的,因此超時設置成了一個難題,設置太大,傳統容器的連接資源有限,設置短了無法滿足業務需求,為今之計只能夠將一個請求拆成兩個請求,一個是發起處理的通知請求,后面是輪詢獲取結果的請求。

    其次,在業務系統設計中,或多或少的會有基于狀態變更事件來觸發事件處理的場景,淘寶的業務體系更是如此。買家和賣家分別是淘寶的兩個角色,相互之間的操作貫穿于整個交易主流程(下單,付款,發貨,確認收貨),兩個角色之間是通過交易這個虛擬對象的狀態遷移來實現交互的,而狀態遷移的動作是由任何一方無預見性的實施的,因此做工具的應用需要能夠接受到狀態變化事件通知,當前只能通過應用輪詢獲取數據來實現。

    輪詢一方面使得開發者軟件設計復雜度高,自身系統消耗大(時間間隔設置,容錯機制等等),另一方面使得TOP服務器壓力增大,無效請求浪費系統資源。

    三.   容器資源之苦

    有人會說輪詢這件事情干嗎不直接將數據推送過去,告知這些ISV,反正他們也都是B/S結構,服務器提供回調地址就可以了。的卻這是最常見的Notify的模式,淘寶內部也有一個Notify的中間件。但是在現在的網絡狀況下,主動推送數據到ISV的服務器上基本不靠譜,對方響應速度的快慢直接影響到我們投遞這些數據需要多少服務器,投遞的策略如何?(如何處理失敗的投遞消息,重試機制如何),從這里可見容器連接池之苦。另一方面從第一個苦描述中可以看到,其實如果容器資源足夠多,那么就可以無限制放大入口,也就不會受之于后端的依賴系統處理能力,但今天大家看看自己傳統的Web應用服務器(jboss,tomcatapache,nginx)連接池配置的數字就知道這是不靠譜的。

    技術背景概述:

             管道化子任務切分:
     
                                                




               我外婆以前是做白鐵加工的,做一個鍋子基本需要這些步驟,每個步驟都需要一些工具,傳統最簡單的做法就是一個人做到底,然后工具都擺在身邊。(這也就是我們現在傳統容器的模式,從請求進入到整個業務處理結束),要提高效率的做法如下:

    1.       增加人手,依然采用一人處理到底的模式。在人和工具無限量的情況下是最簡單和行之有效的方式。

    2.       切割流程,最大化資源利用率,每個子任務所需的資源不同,因此在完成子任務后就將資源共享給其他人而不是占用所有資源到整個流程結束。這種優化帶來的最明顯的效果:

    a)         輕量級子任務完成所需要消耗的資源最小化。(例如第一階段處理消耗時間很短,那么錘子和鉗子的需求量將會最?。?/span>

    b)           重量級子任務能夠得到更多的資源和線程來處理。如果第一階段和第二階段本身資源消耗是相互影響的,比如第一階段資源分配消耗內存,第二階段資源分配也消耗內存,那么第一階段的資源占用少了以后,自然可以給第二階段資源分配提供了便利,其次如果總資源有限,第一階段也在等待資源的ready,那么此時的線程將會等待在第一階段的資源分配上,此時線程空消耗,但如果降低了第一階段的消耗,線程滿負荷運作,則線程完成第一階段所有任務后可以支援第二階段的工作。

    3.       當子任務可以“降級”的情況下,分解任務,根據資源狀況來并行處理,并且適當的“丟棄”非關鍵子任務可以提高效率,增加穩定性。

    總體上來說,可以把原本一個任務拆成管道形式的子任務(管道化也就是每個子任務的上一個任務的輸出是當前子任務的輸入),然后根據子任務的情況來選擇是否交由不同的線程并行化執行。(這個判斷很簡單,子任務是否是有限資源且較輕量化的,子任務的資源占用多少是否會影響到其他任務的資源分配情況,如果這兩點都不成立,則保持簡單處理模式即可,最多可以將某一些子任務“降級”)

    管道化的作用:1.將任務各個階段梳理清楚。(降低子任務之間的耦合度,為并行或異步處理提供基礎)。2.最大化資源利用率,便于流程整體優化。

    事件驅動模式:

             事件驅動模式其實在設計中被大規模使用,思路概括起來就是:對象脫離線程,狀態脫離事務?;氐降谝粋€做鍋子三個流程的實例說明,也許在第二階段,某人拿起了一個已經完成第一階段的半成品在等待第二階段的資源Ready,這時候如果他放下這個半成品,先去做已經可以做工作的第一或者第三階段的半成品,然后等到另一個人做完后釋放第二階段資源時通知他時,他在去安排做第二階段的工作,那么效率會更高。

             那么可以發現,管道化是從釋放資源被占用的角度去提升整體工作效率,而事件驅動模式是從分離工作實施者和工作資源的角度去提升工作實施者的工作效率。一個是工作者是有限而寶貴資源,一個是子任務在完成過程中所需資源是寶貴資源。

             由此看來,事件驅動模式與管道模式不同,應該是不需要有評判標準都可以實施的一種優化策略。其實不然,事件驅動模式也有自己的弱點:1.設計復雜。(過于松耦合的結構,使得原本事務中有順序的操作需要更多的檢查,容錯和調度)2.性能可能會受到影響。(線程上下文的切換,中間結果的拷貝)3.延時問題產生。對于事件的產生一種是主動推送,一種是輪詢,輪詢就牽涉到時間片大小的問題,在性能和及時性權衡的情況下最后得出合理的設置,但是對于整個事務來說一定是消耗了。

             上面描述的兩個概念在后面的Web請求異步化處理及訂閱模式中都會用到,同時在支持Servlet3Comet Streaming(Comet push)的容器整體架構上都會被用到,優劣上面做了簡單的描述,后面從業務架構到系統架構都會有最實在的設計說明。

    業務架構設計:

             基于上述問題,通過兩步走來解決。首先采用支持打破傳統http request生命周期管理的Web容器(很多人說可以自己寫,其實Web容器寫起來并不是最麻煩的,如何做好兼容和照顧好每一個細節才是漫長發展的道路)。其次在容器新的線程生命周期管理基礎上封裝業務框架,為開發者屏蔽底層異步化和事件驅動模式帶來的復雜流程管理內容。

                                                       

    待續...

    posted on 2010-11-24 01:26 岑文初 閱讀(3368) 評論(4)  編輯  收藏

    評論

    # re: 基于管道化和事件驅動模型的Web請求處理(一) 2010-11-24 10:03 君楚
    我認為這叫做“流水線”更合適。就像生產福特汽車一樣。pipeline一般另有定義的。  回復  更多評論
      

    # re: 基于管道化和事件驅動模型的Web請求處理(一) 2010-11-24 10:30 岑文初
    @君楚
    起初用詞的時候就是自己考慮了一下,不過你看看wikipedia的解釋,我覺得尚可 http://en.wikipedia.org/wiki/Instruction_pipeline  回復  更多評論
      

    # re: 基于管道化和事件驅動模型的Web請求處理(一) 2010-11-24 18:21 BucketLI
    我們的產品我也把它拆成了一個個handler,再組成一條流水線. 基于事件流轉+pipeline 組合感覺比較合適異步的處理流程,比如網絡通信. 而在同步處理流程里面,用pipeline來拆分任務就足夠了. 但是有一個問題在于各個handler之間傳遞著一個類似總線的數據對象,我一直比較糾結在整個流程里面從始至終都維持一些數據是否有必要?  回復  更多評論
      

    # re: 基于管道化和事件驅動模型的Web請求處理(一) 2010-11-25 08:48 岑文初
    今天的后續文章會談一下這點@BucketLI
      回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久亚洲AV无码西西人体| 日本免费一本天堂在线| 国产AV无码专区亚洲AV毛网站| 美女视频黄频a免费| 免费人成网站在线高清| 亚洲av日韩精品久久久久久a| 久久精品a一国产成人免费网站| 亚洲不卡在线观看| 免费无码精品黄AV电影| 亚洲欧美国产精品专区久久| 免费高清小黄站在线观看| 青草久久精品亚洲综合专区| 国产精品久免费的黄网站| 免费手机在线看片| 亚洲精品无码专区久久久| 久久福利青草精品资源站免费| 亚洲国产精品国自产拍电影| 黄色网址免费观看| 亚洲国产成人久久精品大牛影视| jizzjizz亚洲| 精品无码国产污污污免费网站 | 人妻无码一区二区三区免费| 中文字幕亚洲精品| 成人人免费夜夜视频观看| 亚洲成a∨人片在无码2023 | 国产黄色片免费看| 亚洲国产二区三区久久| 国产va免费精品观看精品| 美女被爆羞羞网站在免费观看| 亚洲自偷自偷偷色无码中文| 最好看最新的中文字幕免费| 亚洲精品无码久久久久久| 亚洲综合av永久无码精品一区二区| 久热中文字幕在线精品免费| 直接进入免费看黄的网站| 亚洲av中文无码乱人伦在线咪咕| 免费电视剧在线观看| 国产成人无码免费看片软件| 亚洲精品在线播放视频| 亚洲国产精品自在拍在线播放| 亚洲免费闲人蜜桃|