2013-01-02 26 views
8

http://www.erlang.org/doc/man/gen_tcp.html#accept-1Erlang中的接受器池和負載均衡?

值得一提的是,接受呼叫不必發出從插座所有者過程 。使用版本5.5.3及更高版本的 仿真器,可以從不同的進程發出多個同時接受調用,這允許處理傳入連接的接受器進程池 。

(Q1)這是否意味着我們可以有Unicorn風格的負載均衡在二郎山?

(Q2)如果是這樣,是否有任何現有的服務器或庫使用此功能?

(Q3)獨角獸的工作假設請求處理是快速。在相同的假設下,Erlang中的接受者和工作者結合起來可以獲得更好的表現嗎?

對於那些不熟悉Unicorn的人來說,它是一個傳統的UNIX prefork web服務器。工作進程之間的負載平衡由OS內核完成。所有工作人員共享一組通用的偵聽套接字,並對其進行非阻塞accept()。內核將決定哪個工作進程給套接字,並且如果沒有任何東西可以接受,工作人員將會休眠()。 對於單個偵聽器套接字,我相信當工作進程阻塞accept()並且OS內核決定「比賽」的結果時是相同的。

回答

4

我也在Erlang的郵件列表中發佈了這個問題。 正如Daniel Goertzen, 指出的那樣,Erlang中有受體庫文庫,如ranchswarm

  • 牧場從獨角獸的工作方式不同在這樣一種方式,它不僅「接受」,在許多過程,然後通過套接字一些工作進程。

  • 方式swarm作品與麒麟相同,意思是 受體和工作者結合在一起。 (感謝盧瓦克Hoguin用於指出) 但是他們有點不同,因爲羣可以接受 平行於接受的套接字的處理的新的套接字,接受套接字被處理後而獨角獸 只接受

我更喜歡swarm風格,因爲它對於快速和慢速的 請求都很理想,而Unicorn需要快速請求。

而是試圖達到服務客戶緩慢高效,麒麟 依賴於緩存反向代理,以有效地慢 客戶打交道。

獨角獸不適合所有應用程序。獨角獸針對CPU /內存/磁盤密集型的 應用程序進行了優化,並且花費很少時間在外部資源(例如數據庫服務器或外部的 API)上等待 。

對於Comet/reverse-HTTP/push應用程序,獨角獸效率非常低 其中HTTP連接花費大量空閒時間。

+0

一個猜測可能是牧場方法和羣體方法在實踐中一樣。舉個例子:牛仔使用牧場和牛仔的速度非常快。 –

+0

@IGIVECRAPANSWERS同意。順便說一下,有沒有關於牛仔等的最新基準? –

+1

我不知道。我的猜測是你需要測量你自己的工作量。對於我所擁有的工作量來說,問題在牛仔甚至讓它進入甚至是一個瓶頸之前就已經在環節的其他地方了。 –