2010-06-30 75 views
2

由於您使用的是事件循環而不是線程,因此實際服務器的外觀如何?(全功能)長輪詢服務器如何抽象地工作

我知道它使用事件循環,但是如何分離請求?並且,如何防止服務器運行速度非常緩慢(因爲我認爲它一次只能推一件東西,因爲它是無螺紋的)?

某種僞代碼會很好。

原諒我的無知;當然,如果有某個地方可以用非基本的方式解釋它「這足夠好,直到你有1000名遊客的方式」,我很高興知道這一點。

+1

你能澄清你的問題嗎?你在問長輪詢或事件驅動架構嗎?你問關於網絡服務器還是網絡應用程序?無論如何,也許這個:http://www.kegel.com/c10k.html可能會派上用場。 – ninjalj 2010-06-30 23:07:49

回答

5

長輪詢服務器的實現細節因平臺而異,因此您的假設可能不正確。

我使用.NET爲our website實現了一個COMET服務器。我利用HttpListener做所有的無聊http的東西和Microsoft CCR來處理所有的異步IO。它使用線程池來爲請求提供服務,當它們進來時,它不是每個客戶端的線程,但它不是單線程的,通常需要幾十個線程隨着用戶數量的增加而保持流暢。這種方法意味着我們可以輕鬆擴展到多個CPU內核。 CCR的異步枚舉模式確實有助於保持異步邏輯的美觀和整潔,並且一年後我可以很容易地讀取代碼。

此方法已被證明具有極高的可擴展性。我測試了多達20000個客戶端,於是我們受到網絡IO的約束。它處理所有我們的客戶(他們「永久」連接,每30秒重新連接一次),服務器負載爲1-2%。絕對值得重新考慮你的假設,即你必須選擇一個事件循環體系結構而不是多個線程。中間地帶對我來說工作得非常好,而且處理IO邊界任務的.NET asynchronous programming model確實使您遠離需要的微管理線程。實際上,當要處理I​​O數據時,會從池中借用一個線程來執行該處理,然後返回到池以準備處理其他請求。 All the complicated IOCP stuff被抽象出來。