为啥我们需要 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?的主要内容,如果未能解决你的问题,请参考以下文章