2014-01-30 94 views
6

我刚刚完成了Erlang in Practice screencasts(代码here),并对分发有一些疑问。分发Erlang聊天系统

这里的是总体架构:

architecture

这里是如何监督树的样子:

supervisortree

阅读Distributed Applications使我相信,主要动机之一用于故障转移/接管。

但是,是否有可能使消息路由器监督员及其工作人员在一个节点上,而系统的其余部分在另一个节点上,而对代码没有太多改变?

或者应该有3个不同的OTP应用程序?

此外,该系统如何水平扩展?例如,如果我现在意识到我的系统可以处理100个用户,并且我已经将消息路由器确定为主要瓶颈,那么如何才能'添加另一个节点',现在它可以处理200个用户?

+0

你用什么工具绘制顶部图表? –

+0

我没有画出它,它是截屏的截图。但它来自OmniGaffle。 –

+0

好的,谢谢。 –

回答

3

我只在学习期间开发了Erlang应用程序,但通常我们有许多小进程只做一件事,并将消息发送到其他进程。 Erlang的优点在于,如果您在同一台Erlang虚拟机或者同一台计算机,同一个局域网或互联网上发送消息,则无关紧要,调用和指向其他进程的指针总是相同开发商。

所以你真的想为系统的每个小部分都有一个应用程序。

这就是说,它并没有使构建可扩展的应用程序变得更简单。根据经验法则,如果您希望应用程序工作的节点数量是10倍以上,则需要重写,否则消息传递开销将会过大。显然,当你从1开始到2时,你也需要考虑它。

所以如果你发现了一个瓶颈,当处理太多的客户端时,这个应用程序特别慢,你希望第二次运行它,而且你需要实现一些额外的负载平衡,在你开始第二个应用。

让我们假设主管检查消息内容是否有不适当的内容,因此速度很慢。在这种情况下,每个人都在谈论的节点将是简单的路由器应用程序,它将以循环方式将消息转发到管理程序应用程序的不同实例。如果这些1或2个实例不够用,可以用某种方式写路由器,以便通过发送控制消息来操纵实例的数量。

但是,为了自动工作,您需要有另一个进程监视服务器,并发现它们过载或未充分利用。

我知道,动态添加和始终删除资源,当你听到它的声音很大,但你可以看到它是一个大量的工作,你需要有建立了一些消息系统,该系统允许的话,还有一个监控系统可以监控需求。

希望这会给你一些关于如何完成的想法,不幸的是,自从我写了我最后的Erlang应用程序已经过了一年多了,我不想提供可能会出错的代码。

+1

谢谢你的回答!我特别喜欢最后第二段。至少我不会错过某些明显的东西。 –

+0

你如何处理网络故障或延迟? – CMCDragonkai

+0

我没有 - 我有erlang做这一切,因为它只是小小的任务。通常,Erlang和TCP可以做很多事情,如果它不够用,你必须在应用程序之上实现一个额外的系统来检测网络和节点故障。 – peter