莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          SEDA架構筆記

          Posted on 2010-06-20 23:53 dennis 閱讀(7293) 評論(6)  編輯  收藏 所屬分類: 模式與架構java


          一、傳統并發模型的缺點


          基于線程的并發


          特點:
          每任務一線程
          直線式的編程
          使用資源昂高,
          context切換代價高,競爭鎖昂貴
          太多線程可能導致吞吐量下降,響應時間暴漲。

          基于事件的并發模型



          特點:
          單線程處理事件
          每個并發流實現為一個有限狀態機
          應用直接控制并發
          負載增加的時候,吞吐量飽和
          響應時間線性增長


          二、SEDA架構




          特點:
          (1)服務通過queue分解成stage:
             每個stage代表FSM的一個狀態集合
             Queue引入了控制邊界
          (2)使用線程池驅動stage的運行:
             將事件處理同線程的創建和調度分離
             Stage可以順序或者并行執行
             Stage可能在內部阻塞,給阻塞的stage分配較少的線程

          1、Stage-可靠構建的基礎



          (1)應用邏輯封裝到Event Handler
             接收到許多事件,處理這些事件,然后派發事件加入其他Stage的queue
             對queue和threads沒有直接控制
             Event queue吸納過量的負載,有限的線程池維持并發
          (2)Stage控制器
            負責資源的分配和調度
            控制派發給Event Handler的事件的數量和順序
            Event Handler可能在內部丟棄、過濾、重排序事件。

          2、應用=Stage網絡

             (1)有限隊列
                  入隊可能失敗,如果隊列拒絕新項的話
                  阻塞在滿溢的隊列上來實現吸納壓力
                  通過丟棄事件來降低負載
             (2) 隊列將Stage的執行分解
                  引入了顯式的控制邊界
                  提供了隔離、模塊化、獨立的負載管理
             (3)方便調試和profile
                  事件的投遞可顯
                  時間流可跟蹤
                  通過監測queue的長度發現系統瓶頸

          3、動態資源控制器

          (1)、線程池管理器

          目標: 決定Stage合理的并發程度
          操作:
          觀察queue長度,如果超過閥值就添加線程
          移除空閑線程



          (2)、批量管理器
          目的:低響應時間和高吞吐量的調度
          操作:
          Batching因子:Stage一次處理的消息數量
          小的batching因子:低響應時間
          大的batching因子:高吞吐量

          嘗試找到具有穩定吞吐量的最小的batching因子
          觀察stage的事件流出率
          當吞吐量高的時候降低batching因子,低的時候增加


          三、小結
             SEDA主要還是為了解決傳統并發模型的缺點,通過將服務器的處理劃分各個Stage,利用queue連接起來形成一個pipeline的處理鏈,并且在Stage中利用控制器進行資源的調控。資源的調度依據運行時的狀態監視的數據來進行,從而形成一種反應控制的機制,而stage的劃分也簡化了編程,并且通過queue和每個stage的線程池來分擔高并發請求并保持吞吐量和響應時間的平衡。簡單來說,我看中的是服務器模型的清晰劃分以及反應控制。



            

          評論

          # re: SEDA架構筆記[未登錄]  回復  更多評論   

          2010-06-21 14:14 by 牛牛
          3、動態資源控制器

          (1)、線程池管理器
          目標: 決定Stage合理的并發程度
          操作:
          觀察queue長度,如果超過閥值就添加線程
          移除空閑線程

          這里有個問題?如果queue長度超過閥值,但同時stage線程內部又阻塞,那怎么處理呢?

          # re: SEDA架構筆記[未登錄]  回復  更多評論   

          2010-06-21 19:51 by 匿名
          @牛牛
          可以通過排隊的方法解決

          # re: SEDA架構筆記[未登錄]  回復  更多評論   

          2010-06-22 02:00 by dennis
          @牛牛
          queue可以阻塞,也可以丟棄放入的消息,取決于你選擇的策略

          # re: SEDA架構筆記  回復  更多評論   

          2010-06-22 22:33 by 下里巴人
          這種基于事件的并發模型是可以很好的提高吞吐量跟響應時間,在業界已經有使用了嗎?哪些公司有這樣的模型運用了呢?能否推薦下這方面的具體資料

          # re: SEDA架構筆記  回復  更多評論   

          2010-08-11 17:27 by lucharse
          @下里巴人
          cassandra 用得就是 SEDA模型

          # re: SEDA架構筆記  回復  更多評論   

          2013-06-05 11:45 by 范小瑞
          大哥,圖片看不到啊,真心想看看。
          主站蜘蛛池模板: 铅山县| 宜春市| 拜城县| 赫章县| 壶关县| 泊头市| 巴中市| 建宁县| 垦利县| 龙南县| 西和县| 岢岚县| 张家港市| 咸丰县| 绥江县| 瑞丽市| 自贡市| 蒲江县| 乐安县| 迁西县| 西吉县| 元氏县| 余庆县| 涪陵区| 长宁区| 平利县| 方城县| 沙雅县| 焦作市| 大姚县| 山西省| 南澳县| 敦煌市| 高淳县| 榆林市| 苗栗县| 塘沽区| 玉田县| 河曲县| 永泰县| 闽侯县|