我刚刚完成了Erlang in Practice截屏视频(代码here),并对分发有一些疑问。
以下是整体架构:
以下是监督树的外观:
阅读Distributed Applications让我相信,其中一个主要动机是故障转移/接管。
但是,例如,消息路由器主管及其工作人员是否可以在一个节点上,并且系统的其余部分可以在另一个节点上,而不需要对代码进行太多更改?
或者应该有3种不同的OTP应用程序?
此外,如何使该系统水平扩展?例如,如果我现在意识到我的系统可以处理100个用户,并且我已经将消息路由器确定为主要瓶颈,那么我怎样才能“添加另一个节点”,现在它可以处理200个用户?
答案 0 :(得分:3)
我只是在学习期间开发了Erlang应用程序,但通常我们有许多小进程只做一件事并向其他进程发送消息。 Erlang的优点在于,如果您在同一个Erlang VM中发送消息或者使用相同的计算机,相同的LAN或通过Internet发送消息,则调用和指向其他进程的指针看起来总是相同的显影剂。
所以你真的想为系统的每个小部分都有一个应用程序。
话虽如此,构建一个可以扩展的应用程序并不简单。根据经验,如果您希望应用程序工作的节点数量增加10倍,则需要重写,否则消息传递开销会过大。显然,当你从1开始到2时,你也需要考虑它。
因此,如果您发现了一个瓶颈,那么在处理太多客户端时应用程序特别慢,您希望再次运行它,而不是需要在启动第二个应用程序之前实现一些额外的负载平衡
我们假设主管检查邮件内容是否有不适当的内容,因此很慢。在这种情况下,每个人都在谈论的节点将是简单的路由器应用程序,它将以循环方式将消息转发到管理程序应用程序的不同实例。如果那些1或2个实例不够,你可以用某种方式编写路由器,你可以通过发送控制消息来操纵实例数。
然而,为此,要自动运行,您需要有另一个进程监视服务器并发现它们已经过载或使用不足。
我知道,当您听到它时,动态添加和删除资源总是听起来很棒,但正如您所看到的那样,它需要大量工作,您需要构建一些允许它的消息传递系统,以及监控系统这可以监控需求。
希望这能让你知道如何完成它,不幸的是,自从我编写完最后一个Erlang应用程序以来已经过了一年多,而且我不想提供可能出错的代码。