2011-03-17 25 views
1

我有節點A上的幾個Erlang應用程序,他們正在對節點B進行rpc調用,我有Mnesia存儲過程(數據庫查詢函數)以及我的Mnesia數據庫。現在,偶爾,同步進程進行RPC調用數到節點B的數據可以上升到150。現在,我有幾個問題:
Erlang遠程過程調用模塊內部

問題1:對於每個RPC調用遠程節點,確實節點一個全新的(例如說TCP/IP或UDP連接或者他們在傳輸中使用的任何東西)CONNECTION?或者只有一個連接,並且所有的rpc調用都共享這個連接(因爲節點A和節點B連接[與該epmd進程有關])?

問題2:如果我有一個節點上的數據中心的應用程序和我有另一個集中管理的Mnesia數據庫和這些應用程序表共享可被複制的,零散的,索引等相同的模式,這是一個更好的選擇:使用rpc調用以從數據節點獲取數據到應用程序節點,或者使用TCP/IP(Scalaris傢伙爲失敗檢測器所做的方式)開發一個全新的框架來迎合網絡延遲問題?

問題3:有沒有人在那裏測試過或者板凳標記的方式,可以通過回答以下RPC調用的效率?
(a) Erlang Node可以在不中斷的情況下將同時進行的rpc調用的最大數量推到另一個調用上的最大數量是多少?
(b)有沒有辦法通過系統配置或操作系統設置增加這個數字? (請參閱在您的答案中打開Solaris for x86)
(c)是否有任何其他方式的應用程序來請求Mnesia運行遠程Erlang節點而不是rpc的數據? (說CORBA,REST [要求HTTP端至端],Megaco協議,SOAP等)

+0

你問很多問題,根本不接受答案。爲什麼? – 2011-03-17 14:13:52

回答

3

Mnesia的運行在Erlang分佈,和在Erlang分佈有任何一對節點之間只有一個TCP/IP連接(通常是全網狀佈置,所以每對節點都有一個連接)。所有rpc/internode通信都將通過此分配連接進行。

此外,它可以確保消息順序保留在任何一對通信進程之間的分佈。未定義兩個以上的過程之間的排序。


Mnesia爲您提供了很多數據放置選項。如果你想在節點B上持久存儲,但是在節點A上完成處理,你可以在B上使用disc_only_copies,在節點A上使用ram_copies。這樣,節點A上的應用程序就可以快速訪問數據,而且你仍然可以在節點B上獲得耐用的副本。

我假設A和B之間的網絡是一個很少去分區的可靠局域網(否則你會花費一大堆時間讓mnesia重新聯機後劃分)。

如果A和B都在運行mnesia,那麼我會讓mnesia爲我做所有的RPC--這就是mnesia的目的,它有很多優化。沒有很好的理由,我不會推出自己的RPC或分發機制。


至於基準,這是完全依賴你的硬件,節點之間Mnesia模式和網絡(以及應用程序的數據訪問模式)。沒有人能給你這些基準,你必須自己來運行它們。

至於其他用於訪問mnesia的RPC機制,我認爲沒有任何開箱即用的功能,但有許多RPC庫可用於向網絡呈現mnesia API,只需少量工作即可你的部分。

+0

非常感謝archaelus,這一直很有用 – 2011-05-04 09:32:06