基于 Erlang 的聊天(负载平衡和通知分发)
Posted
技术标签:
【中文标题】基于 Erlang 的聊天(负载平衡和通知分发)【英文标题】:Erlang based chat (load balancing and notifications distribution) 【发布时间】:2015-06-02 20:25:55 【问题描述】:我们打算为我们的Messenger开发一个后端,所以我有一个想法,我想在这里描述一下,也许有人可以给我一个建议。
1) 想法:
nginx - 将请求重定向到随机节点(循环)-> Erlang 集群 - 重定向到实际节点(我们选择进程数最少的节点)-> 握手 -> 升级到 WebSocket。
集群中的每个节点都有 ETS 表,其中包含每个节点的进程数(字段 - 节点,num_processes)。每个节点每 5 秒将其进程数发送到集群中的所有节点。
所以我们不需要主节点,因为每个节点都可以做负载均衡。
2) 附加问题:
使用 gproc 全局注册用户的活动 WebSocket 连接 (pids) 是否是个好主意?我们需要这个列表让每个用户通过 ws 向最终用户发送通知。
【问题讨论】:
【参考方案1】:1) 是的 - 这是一个很好的方案。您可以进行的一项改进是每次将负载平衡到另一个节点时增加远程节点的负载。这就像保持对远程节点负载的估计,并阻止您一次将所有负载发送到一个节点五秒钟。每次您收到来自另一个节点的广播时,只需覆盖您的本地估计 - 这将修复任何丢失的更新并确保您的估计保持在实际远程值的一小部分范围内。
2) 您可以为每个 websocket 进程使用一个名为 Username, true
的 gproc 属性 - 这将让您找到整个集群中用户的所有 websocket 会话。
我忘记了 gproc 用于全局注册的底层协议以及在整个集群中始终注册/取消注册属性的成本。不久前,我在一个非常相似的系统(用户存在和消息传递与会话和多节点负载平衡)上工作,最后写了ngproc,以支持在分区后解决冲突的廉价名称查找。它以开源形式提供,可能会提供一些您可以使用的想法。
【讨论】:
【参考方案2】:有趣:
您设计的用户数量是多少? 聊天中将发送多少数据?是文本、图像还是视频? 您的负载平衡是什么,即您希望哪个资源成为关键资源? 如果一个节点死了,你预计会发生什么?【讨论】:
1) 超过 100 万用户(超过 20 万在线) 2) 我们将只发送带有元数据的文本消息(图像、视频和音频将存储在“媒体”服务器集群上) 3)我正在尝试将所有用户的WebSocket连接分散到集群中 4)当节点死亡时,所有用户的客户端将尝试重新连接,导致ping失败(死亡节点的WebSocket连接将分散到活动节点之间)以上是关于基于 Erlang 的聊天(负载平衡和通知分发)的主要内容,如果未能解决你的问题,请参考以下文章