Erlang计时器是否规模?

时间:2012-10-20 14:55:39

标签: timer erlang

在我使用Erlang开发的websocket服务器中,我想为每个连接使用一个计时器(start_timer/3),如果超时没有从客户端接收到“ping”,则终止连接。

假设我将拥有大量客户端连接,Erlang定时器是否可以很好地扩展?

2 个答案:

答案 0 :(得分:9)

什么是大量连接? Erlangs VM在内部使用定时器轮来处理定时器,因此它可以很好地扩展到数千个连接。那你可能会遇到麻烦。

通常的诀窍是将定时器组合在一起。这也是内核倾向于做的事情。例如,如果您有一个必须在200毫秒内唤醒的计时器,您可以提前安排自己,而不是下一个,而是再次使用下一个200毫秒计时器。这意味着您将等待至少200毫秒,也许400毫秒,典型的300毫秒。通过近似这样的计时器,您可以运行更多计时器,因为您可以让一个计时器一次性唤醒大量进程。但取决于计时器频率和计时器数量,标准send_after/3可能就足够了。

在任何情况下,我都会假设它可以扩展然后处理问题,如果不能通过像上面设想的近似时间那样处理问题。

答案 1 :(得分:0)

这种服务器的通常模式是利用轻量级Erlang进程,并为每个连接创建一个服务器。

您可以使用gen_server行为构建服务器,例如为您提供

  • 使用State变量
  • 管理连接(等待连接,登录等)的不同状态
  • 每个连接和每个状态的单独超时,由VM和OTP行为管理。

好处是每个服务器都必须处理单个客户端,因此编写起来真的很容易。

初始阶段应该启动一个等待连接的服务器,

然后在连接时,服务器应为下一个客户端启动一个新的(最好是通过主管启动simple_one_for_one子进程)并转到登录步骤或任何你想做的事情。

您可以在网站LearnYouSomeErlang上找到非常有趣的信息,特别是在章节http://learnyousomeerlang.com/supervisors和以下章节中。