【问题标题】:Do Erlang timers scale?Erlang 计时器可以扩展吗?
【发布时间】:2012-10-20 14:55:39
【问题描述】:

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

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

【问题讨论】:

    标签: timer erlang


    【解决方案1】:

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

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

    在任何情况下,我都会首先假设它可以扩展,然后如果不能通过按照上面设想的大致时间来处理问题。

    【讨论】:

      【解决方案2】:

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

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

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

      好处是每个服务器都必须处理一个客户端,所以写起来真的很容易。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-10
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 2020-06-15
        • 2017-01-18
        • 2014-02-15
        相关资源
        最近更新 更多