为啥我们需要 simple_one_for_one?

Posted

技术标签:

【中文标题】为啥我们需要 simple_one_for_one?【英文标题】: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 人,所以我真的需要解释这一点。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

如果我有一个 gen_server 来处理客户端请求,这个服务器连接并从 mnesia 获取数据,我应该使用simple_one_for_one 吗?因为我认为如果客户端因任何原因关闭服务器,服务器的主管将重新启动它,它可以继续处理客户端请求。我错了吗? 此外,如果您只有一个 gen_server 来处理所有聊天,那么您将在系统中引入严重的瓶颈,从而大大降低并行化。

以上是关于为啥我们需要 simple_one_for_one?的主要内容,如果未能解决你的问题,请参考以下文章

Erlang simple_one_for_one 主管不重启孩子

为啥我们需要回调事件?

为啥我们需要`cacheRedirects`?

为啥我们需要单子?

为啥我们需要使用 flatMap?

为啥我们需要 void 函数? [关闭]