2010-11-08 64 views
1

嗨 我在Erlang中實現了一個類似IM服務器的應用程序。我爲連接到服務器的每個客戶端使用了一個代理進程,代理進程負責將消息發送到消息網關,消息網關又將消息發送到另一個代理進程。看來,erlang進程間消息傳遞是作爲tcp連接實現的。所以每個代理進程都會有一個連接到網關。這是否意味着由於端口號的限制,單臺機器上的代理數量不會超過65,535個?關於進程間消息傳遞的問題

在此先感謝!

回答

1

一些限制爲二郎:Efficiency Guide User's Guide/10 Advanced

分佈式節點 已知節點 遠程節點Y必須是已知的,如果存在任何的PID,港口,引用或玩意兒到節點X(Erlang的數據類型)從X上的Y,或者連接了X和Y.同時/節點已知的遠程節點的最大數量受可用於節點名稱的最大原子數限制。所有關於遠程節點的數據,除了節點名稱atom,都被垃圾回收。

連接節點 同時連接的節點的最大數量受限於同時已知的遠程節點的最大數量,可用的(Erlang)端口的最大數量或可用套接字的最大數量。

0

Erlang通過網絡連接Erlang節點,而不是Erlang進程。 (並且每個Erlang節點都是一個操作系統進程)。

所以,你會用完的TCP連接,當你有一臺機器上Erlang節點的幾十堪薩斯(這是不合理的),而不是當你有Erlang進程的幾十Ks的單一的Erlang節點上。

(我不會給任何絕對數字,因爲每個二郎節點也將需要產生另一個網絡連接EPMD進行通信。但是,你很可能將沒有又名操作系統進程Erlang節點的30 + K一臺機器上呢。 )

+0

Erlang節點以全網狀連接,所以64K代表網絡中所有連接的節點,而不是單個節點。擁有那麼多節點也不合理:) – Zed 2010-11-08 10:10:02

+0

那麼如果IM所需要的並且需要在超過64k的CPU內核上運行...... ;-) – 2010-11-08 10:17:37

+0

非常感謝!當流程通過不同的機器連接時,我發現這是事實。但是當它們在同一臺機器上時,每個進程都通過127.0.0.1(可能是epmd?)使用tcp連接。這似乎沒有太大的問題,因爲環回地址很豐富:) – 2010-11-11 01:25:07