設計模式 反應器(Reactor)模式

2021-12-29 21:38:03 字數 1894 閱讀 4657

從學習zeromq說起

「zeromq幾乎所有的i/o操作都是非同步的,主線程不會被阻塞。zeromq會根據使用者呼叫zmq_init函式時傳入的介面引數,建立對應數量的i/o thread。每個i/o thread都有與之繫結的poller,poller採用經典的reactor模式實現,poller根據不同作業系統平台使用不同的網路i/o模型(select、poll、epoll、devpoll、kequeue等)。」

事件處理設計模式

處理併發服務請求,並將請求提交到乙個或者多個服務處理程式

當客戶端請求抵達後,服務處理程式使用多路分配策略,由乙個非阻塞的執行緒來接收所有的請求,然後派發這些請求至相關的工作執行緒進行處理

抽象解釋

1. boss:主要是拉活兒、談專案,一旦boss接到活兒了,就下發給下面的work去處理

2. worker

具體解釋

1. 初始事件分發器(initialization dispatcher)

2. 同步(多路)事件分離器(synchronous event demultiplexer)

3. 系統處理程式(handles)

4. 事件處理器(event handler)

對於高併發系統,常會使用reactor模式,其代替了常用的多執行緒處理方式,節省系統的資源,提高系統的吞吐量。下面用比較直觀的形式來介紹這種模式的使用場景。

以餐廳為例,每乙個人就餐就是乙個事件,顧客會先看下選單,然後點餐,處理這些就餐事件需要服務人員。就像乙個網路服務會有很多的請求,伺服器會收到每個請求,然後指派工作執行緒去處理一樣。

在多執行緒處理方式下:

乙個人來就餐,乙個服務員去服務,然後客人會看選單,點菜。 服務員將選單給後廚。

二個人來就餐,二個服務員去服務……

五個人來就餐,五個服務員去服務……

這類似多執行緒的處理方式,乙個事件到來,就會有乙個執行緒為其服務。很顯然這種方式在人少的情況下會有很好的使用者體驗,每個客人都感覺自己享有了最好的服務。如果這家餐廳一直這樣同一時間最多來5個客人,這家餐廳是可以很好的服務下去的。

由於這家店的服務好,吃飯的人多了起來。同一時間會來10個客人,老闆很開心,但是只有5個服務員,這樣就不能一對一服務了,有些客人就不能馬上享有服務員為其服務了。老闆為了掙錢,不得不又請了5個服務員。現在又好了,每位顧客都享受最好最快的待遇了。

越來越多的人對這家餐廳滿意,客源又多了,同時來吃飯的人到了20人,老闆高興但又高興不起來了,再請服務員吧,佔地方不說,還要開工錢,再請人就掙不到到錢了。

怎麼辦呢?老闆想了想,10個服務員對付20個客人也是能對付過來的,服務員勤快點就好了,伺候完乙個客人馬上伺候另外乙個,還是來得及的。綜合考慮了一下,老闆決定就使用10個服務人員的執行緒池!

但是這樣又有乙個比較嚴重的缺點:如果正在接受服務員服務的客人點菜很慢,其他的客人可能就要等好長時間了。有些脾氣火爆的客人可能就等不了走人了。

這樣,我麼那就引入了reactor模式,那麼,reactor模式是如何處理這個問題呢?

老闆後來發現,客人點菜比較慢,大部服務員都在等著客人點菜,其實幹的活不是太多。老闆之所以能當老闆當然有點不一樣的地方,終於發現了乙個新的方法,那就是:當客人點菜的時候,服務員就可以去招呼其他客人了,等客人點好了菜,直接招呼一聲「服務員」,馬上就有個服務員過去服務。在用了這個新方法後,老闆進行了一次裁員,只留了乙個服務員!這就是用單個執行緒來做多執行緒的事。實際的餐館都是用的reactor模式在服務。

對於客戶端的所有請求,都有乙個專門的執行緒去進行處理,這個執行緒無線迴圈去監聽是否又客戶的請求到來,一旦收到客戶端的請求,就將其分發給響應的處理器進行處理

Reactor模式(反應器模式)

reactor這個詞譯成漢語還真沒有什麼合適的,很多地方叫反應器模式,但更多好像就直接叫reactor模式了,其實我覺著叫應答者模式更好理解一些。通過了解,這個模式更像乙個侍衛,一直在等待你的召喚,或者叫召喚獸。併發系統常使用reactor模式,代替常用的多執行緒的處理方式,節省系統的資源,提高系統...

Reactor反應器模式 epoll

最近在看redis原始碼,主體流程看完了。在網上看到了reactor模式,看了一下,其實我們經常使用這種模式。反應器設計模式 reactor pattern 是一種為處理併發服務請求,並將請求提交到乙個或者多個服務處理程式的事件設計模式。當客戶端請求抵達後,服務處理程式使用多路分配策略,由乙個非阻塞...

基礎 Reactor反應器模式

目錄 一,單執行緒reactor反應器模式 二,多執行緒reactor反應器模式 來由 最傳統的模式中,乙個執行緒,阻塞的完成獨寫任務,效率低下,於是就產生了經典的 connection per thread 模式,當乙個任務觸發的時候就派發給乙個執行緒去處理,也就是乙個執行緒對應乙個socket,...