2011-11-04 66 views
3

我創建了一個封裝tcp/ip功能的通用行爲。該行爲的所有用戶都必須執行回調函數,以處理來自套接字另一端的解析「命令」。補償one_for_one管理員無法重新啓動子節點:tcp/ip端口偵聽器

我的通用behvour創建一個通過gen_tcp:accept監聽端口的端口偵聽器進程。當有人連接到端口時,端口監聽器會要求監控人員啓動一個新的端口監聽器,同時繼續處理與剛剛連接的任何客戶端的套接字通信。因爲這些端口監聽器/套接字處理器都是動態創建的並且是相同的,所以我使用simple_one_for_one管理器來創建它們。標準的東西。

這是我的問題。如果端口監聽過程消失,整個behivour將不起作用,因爲沒有任何監聽端口。因爲port_listener是由simple_one_for_one管理員創建的,所以管理員無法重新啓動新的port_listener。

那麼,我應該創建一個keep_alive進程來監視「最新」端口偵聽器,並要求superviosr在死亡時啓動另一個偵聽器嗎?或者,對於這種情況還有其他一些最佳做法嗎?

另外,有沒有辦法看到/檢查由此行爲創建的進程?這不是一個應用程序,所以appmon在這裏不起作用。

感謝

回答

1

,因爲你總是能夠藉助傳輸插座所有權轉讓給其他進程你很可能只有一個監聽進程繼續下去

gen_tcp:controlling_process(Socket, Pid) 

然後偵聽器將能夠太。

那麼你就不會被迫simple_one_for_one主管在頂層,但one_for_one代替。或者你認爲應該更適合。然後頂級主管將會產生simple_one_for_one策略的產生偵聽器進程和接受者主管。然後,聽衆將會肯定會重新啓動(如果你想的話)。

此外,您可以諮詢cowboy項目以瞭解作者正在使用哪些方法。

+0

所以,我遵循你的建議,並有一個one_for_one主管啓動port_listener。當客戶端連接port_listener時,要求主管啓動一個「客戶端/套接字」進程並對其進行控制。我想知道在我不得不擔心快速丟包問題 – Jr0

+0

@ Jr0之前系統需要多忙,唯一的方法就是基準測試。我的觀點是下一個:因爲我看到port_listener進程採取的任何一個操作都不會阻止其執行很長時間,所以這不是瓶頸。如果你對類似行爲的表現感興趣,你可以閱讀這個[blogpost](http://lionet.livejournal.com/42016.html)。 – Keynslug

+0

@ Jr0,http://trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principles可能也有幫助。 – Keynslug