【问题标题】:Why do we need simple_one_for_one?为什么我们需要 simple_one_for_one?
【发布时间】:2014-06-18 05:34:07
【问题描述】:

有人告诉我,simple_one_for_one 对于聊天应用程序非常有用,因为每个聊天客户端都是一个服务器进程(gen_server)。这是正确的吗?

我想知道为什么我们需要它?为什么不只创建一个中心服务器(gen_server)来处理所有聊天客户端通信?因为可能聊天客户端的数量非常多,所以只有一台服务器无法快速处理,导致系统变慢?

我认为创建太多像 simple_one_for_one 这样的服务器可能会占用太多系统资源。我是一个新的 OTP 人,所以我真的需要解释这一点。

【问题讨论】:

    标签: erlang erlang-otp erlang-supervisor gen-server


    【解决方案1】:

    是的,我们的想法是每个客户端都有一个进程 (gen_server)。

    这让您可以将一个客户端的故障与另一个客户端隔离开来。

    如果每个人都在一个进程中,则必须非常小心地处理所有可能出错并导致进程崩溃的事情(从而断开所有客户端的连接)。

    每个客户端都有一个进程,您可以为快乐路径编写代码,并在出现问题时让它崩溃。最坏的情况是您删除了一个客户端。

    进程相当便宜(不像创建线程)。在现代机器上,您可以拥有数百万美元。

    如果您的用户群数以百万计,我相信您最终会拥有不止一台服务器。因此,在一个盒子上可以轻松扩展到几十万到几百万的东西就足够了。

    【讨论】:

    • 如果我有一个 gen_server 来处理客户端请求,这个服务器连接并从 mnesia 获取数据,我应该使用simple_one_for_one 吗?因为我认为如果客户端因任何原因关闭服务器,服务器的主管将重新启动它,它可以继续处理客户端请求。我错了吗?
    • 此外,如果您只有一个 gen_server 来处理所有聊天,那么您将在系统中引入严重的瓶颈,从而大大降低并行化。
    猜你喜欢
    • 2019-06-09
    • 2017-02-26
    • 2011-04-03
    • 2017-07-27
    • 2020-09-21
    • 2020-03-09
    • 2018-12-24
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多