2012-10-20 38 views
6

在我用Erlang開發的websocket服務器中,我希望爲每個連接使用一個定時器(start_timer/3)來終止連接,如果超時過去而不從客戶端接收到「ping」。Erlang定時器是否縮放?

假設我會有大量的客戶端連接,Erlang計時器是否可以很好地擴展?

回答

8

什麼是大量的連接? Erlangs VM在內部使用定時輪來處理定時器,因此可以很好地擴展到幾千個連接。那麼你可能會遇到麻煩。

通常訣竅是將定時器上的pid組合在一起。這也是內核傾向於做的事情。例如,如果你有一個必須在200毫秒內喚醒的定時器,你可以提前預約而不是下一個,但是下一個200毫秒的定時器會再次。這意味着您將等待至少200ms,也許是400ms,典型值爲300ms。通過接近這樣的計時器,您可以運行更多,因爲您可以讓一個計時器一次性喚醒大量進程。但取決於定時器頻率和定時器數量,標準send_after/3可能就足夠了。

在任何情況下,我都會先假設它可以縮放,然後如果不能像上面所設想的那樣進行大致的計時,則可以處理該問題。

0

這種服務器的通常模式是利用輕量級的Erlang進程,併爲每個連接創建一個服務器。

您可以使用gen_server行爲您提供兩種

  • 不同的狀態來管理連接(等待連接,登錄,...),其狀態變量,
  • 建立例如您的服務器
  • 由VM管理的每個連接和每個狀態的單獨超時和OTP行爲。

好的是每個服務器都必須照顧一個客戶端,所以寫起來更容易。

的初始化階段應該啓動一個服務器等待連接,

然後在連接的服務器應該啓動一個新的準備下一個客戶端(最好是通過監事推出simple_one_for_one孩子)並轉到登錄步驟,或任何你想做。

您會在網站LearnYouSomeErlang上找到非常有趣的信息,特別是在http://learnyousomeerlang.com/supervisors和以下章節中。