2011-10-05 16 views
11

在同步模型中,當客戶端連接到服務器時,客戶端和服務器都必須相互同步才能完成某些操作。Web服務器中的前攝器模式和同步模式之間的差異

同時,異步模型允許客戶端和服務器獨立工作。客戶端發送建立連接的請求並執行某些操作。當服務器處理請求時,客戶端可以做其他事情。完成一個操作後,完成事件被放置到事件解複用器的一個隊列中,等待Proactor(例如HTTP Handler)發回請求並調用一個完成處理器(在客戶端上)。這些術語在boost :: asio文件The Proactor Design Pattern: Concurrency Without Threads中使用。

通過這種方式,異步模型可以接受同時連接,而無需爲每個連接創建線程,從而提高整體性能。爲了達到與異步模型相同的效果,第一個模型(同步)必須是多線程的。有關更多詳細信息,請參考:Proactor Pattern(我實際上學習了用於異步模型的proactor模式,在這裏它描述了一個典型的同步I/O Web服務器)。

我對這個問題的理解是否正確?如果是這樣,這意味着異步服務器可以異步接受請求並返回結果(第一個連接請求Web服務器上的服務不需要首先回復)?本質上,異步模型不使用線程(或線程用於單個組件,例如Proactor,Asynchronous Event Multiplexer(boost :: asio document)組件),而不是創建整個客戶端 - 服務器應用程序堆棧,在Proactor Pattern文檔的多線程模型中,第2.2節 - 常規併發模型的常見陷阱和陷阱)。

+0

我不清楚你在問什麼。 –

回答

12

Proactor模型假定將子網任務分解爲子任務,如:解析主機名,接受或連接,讀取或寫入某些信息的一部分,關閉連接並允許您在不同會話中的子任務之間切換。反應器模型將網絡會話過程視爲(幾乎)單一的任務。

絕對優勢攝:

  • 的性能,因爲任務「外包」的推動。例如,您可以向DNS發送解析請求,並等待5分鐘以便迴應無所事事(Reactor) - 或者等待時可以做其他事情(Proactor)。

絕對攝缺點:

  • 性能是由於任務切換,這意味着對於單個會話您執行更多的代碼(攝)比它應該是(電抗器)下降。

但是整體性能通常是在每個時間段的許多「滿意」客戶端上測量的。所以,Proactor vs. Reactor的優勢取決於情況。這裏舉一些例子。

  1. HTTP服務器。客戶希望在他的瀏覽器窗口中看到一些東西。在整個頁面加載前,他無需等待以查看第一段文本。 Proactor是有效的,因爲部分頁面加載比整個頁面加載更快。整個頁面仍然與Reactor模型大致相同。

  2. 低延遲遊戲服務器。客戶希望儘快獲得他的命令​​的完整結果。反應堆是有效的,因爲沒有像部分閱讀或寫作這樣的子任務 - 客戶在閱讀完整回覆之前不會看到任何東西。因此,反應堆不會在子任務之間進行額外的切換,並且在每個時刻都可以確保某個客戶端的命令得到進展,而Proactor會強制所有客戶端彼此間等待不可預知的時間。

在這兩種情況下,多線程可以給你一個線性加速度。

+0

感謝您的回答。以爲它被遺忘了。 – Amumu

+2

這個例子並不真實,這取決於你如何使用它們和應用場景。 Pro-actor與Re-actor之間最大的區別在於,即使這些操作還沒有準備好,您仍然可以進行網絡操作,例如,您可以在沒有數據到達時讀取數據,但是當數據到達時,您讀取的內容將會完成(這就是爲什麼將它命名爲親演員)。在Reactor中,當操作準備就緒時,比如數據到達,messageRecv函數將被調用。對於響應請求的業務邏輯代碼,它們仍然處於執行的單個功能中,與反應堆沒有區別 – jean

相關問題