現在,假設我們正在設計一個應用程序,它由2個Erlang節點組成。在節點A上,將有非常多的進程,數量級爲幾千。通過在節點B
在B節點發送消息到註冊的過程在節點B這些進程訪問的資源,可以說你必須通過執行以下功能啓動的進程:Erlang節點到節點消息傳遞吞吐量,超時和保證
start_server()-> register(zeemq_server,spawn(?MODULE,server,[])),ok.在節點A,想要執行任何處理節點B上給定模塊中的任何功能都使用以下代碼段:
server()-> receive {{CallerPid, Ref}, {Module, Func, Args}} -> Result = (catch erlang:apply(Module, Func, Args)), CallerPid ! {Ref, Result}, server(); _ -> server() end.
call(Node, Module, Func, Args)-> Ref = make_ref(), Me = self(), {zeemq_server,Node} ! {{Me, Ref}, {Module, Func, Args}}, receive {Ref, Result} -> Result after timer:minutes(3) -> error_logger:error_report(["Call to server took so long"]), {error,remote_call_failed} end.因此,假設節點B上的進程
zeemq_server
永遠不會關閉,並且節點A和B之間的網絡連接總是處於啓動狀態,請回答以下幾個問題:
QN 1:由於只有一個在節點B接收過程中,它的郵箱是最有可能是滿的,所有的時間。這是因爲,節點A上的進程數很多,並且在給定的時間間隔(例如2秒)內,每個進程至少會對Node B服務器進行一次調用。在哪些方面,接收可以在節點B上冗餘? ,例如,進程組e.t.c.並解釋(概念)如何取代上面的服務器端代碼。顯示客戶端會發生什麼變化。
的Qn2:在的情況下,只有一個接收器上的節點B,是否有消息中可允許的處理郵件箱的最大數目?如果單個進程郵件黃牛充斥着太多的消息,erlang會如何迴應?
Qn 3:在什麼情況下,使用上面顯示的概念,我可以保證發送請求的每個進程在超時發生之前儘快找到答案嗎?可以將節點B上的接收部分轉換爲並行操作嗎?像這樣:
start_server()-> register(zeemq_server,spawn(?MODULE,server,[])),ok.上面顯示的方法可能會增加在節點B上運行的進程的即時數量,並且這可能會由於內存而極大地影響服務。但是,它看起來不錯,並使
server()-> receive {{CallerPid, Ref}, {Module, Func, Args}} -> spawn(?MODULE,child,[Ref,CallerPid,{Module, Func, Args}]), server(); _ -> server() end.
child(Ref,CallerPid,{Module, Func, Args})-> Result = (catch erlang:apply(Module, Func, Args)), CallerPid ! {Ref, Result}, ok.
server()
循環立即返回以處理下一個請求。你對這個修改有什麼看法?
最後:表明你應如何實現在節點B一個
Pool of receiver Threads
,但看來是下一個
Name
至於節點A,使得傳入消息進行復用接收機的線程之中和負載該組的過程中共享。保持問題的含義相同。
謝謝
Erlangers
!
這與java有關嗎? –
我的歉意@喬伊 –
沒有得到太多的答案,最後做了什麼你不介意我問? –