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