分发一个 Erlang 聊天系统

Posted

技术标签:

【中文标题】分发一个 Erlang 聊天系统【英文标题】:Distributing an Erlang Chat system 【发布时间】:2014-02-22 21:11:27 【问题描述】:

我刚刚完成了 Erlang in Practice 截屏视频(代码 here),并且对分发有一些疑问。

这是整体架构:

下面是监督树的样子:

阅读Distributed Applications 让我相信主要动机之一是故障转移/接管。

但是,是否有可能,例如,消息路由器主管及其工作人员位于一个节点上,而系统的其余部分位于另一个节点上,而无需对代码进行太多更改?

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

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

【问题讨论】:

你用什么工具来绘制顶部图表? 不是我画的,是截屏的截图。但它来自 OmniGaffle。 【参考方案1】:

我只是在学习期间开发了 Erlang 应用程序,但通常我们有许多小进程只做一件事,并向其他进程发送消息。 Erlang 的美妙之处在于,无论您是在同一个 Erlang VM 中还是在同一台计算机、同一个 LAN 或 Internet 上发送消息,调用和指向另一个进程的指针看起来总是相同的。开发者。

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

话虽如此,构建一个可以横向扩展的应用程序并没有变得更简单。一条经验法则是,如果您希望应用程序在 10 倍多的节点上工作,则需要重写,否则消息传递开销会太大。而且显然从1到2的时候也需要考虑。

因此,如果您发现一个瓶颈,即在处理太多客户端时特别慢的应用程序,您希望再次运行它,而不是您需要在启动第二个应用程序之前实现一些额外的负载平衡.

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

但是,要自动工作,您需要让另一个进程监控服务器并发现它们过载或利用率不足。

我知道当您听说动态添加和删除资源时听起来总是很棒,但正如您所见,它需要做很多工作,您需要构建一些允许它的消息传递系统,以及一个监控系统可以监控需求。

希望这能让您对如何完成它有所了解,不幸的是,距离我编写上一个 Erlang 应用程序已经一年多了,我不想提供可能出错的代码。

【讨论】:

感谢您的回答!我特别喜欢倒数第二段。至少我没有遗漏一些明显的东西。 我没有 - 我让 erlang 做所有这些,因为它只是小任务。一般来说,Erlang 和 TCP 可以做很多事情,如果这对你来说还不够,你必须在你的应用程序之上实现一个额外的系统来检测网络和节点故障。

以上是关于分发一个 Erlang 聊天系统的主要内容,如果未能解决你的问题,请参考以下文章

即时聊天消息分发,实现婚恋消息服务

im即时通讯开发:百万人的直播实时聊天消息分发技术

百万人在线的直播间实时聊天消息分发技术

im即时通讯开发:百万人的直播实时聊天消息分发技术

带有牛仔和 websocket 的 erlang 聊天室

Erlang游戏服设计总结