多線程併發-SEDA架構

http://surlymo.iteye.com/blog/2001529?utm_source=tuicool&utm_medium=referral

一、傳統併發模型的缺點

基於線程的併發


特點:
每任務一線程
直線式的編程
使用資源昂高,
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的線程池來分擔高併發請求並保持吞吐量和響應時間的平衡。簡單來說,我看中的是服務器模型的清晰劃分以及反應控制。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章