基于Erlang的聊天(负载均衡和通知分发)

时间:2015-06-02 20:25:56

标签: erlang

我们将为我们的信使开发一个后端,所以我想在这里描述一个想法,也许有人可以给我一个建议。

1)想法:

Nginx - 将请求重定向到随机节点(循环) - > Erlang集群 - 重定向到实际节点(我们选择具有最少进程数的节点) - > 握手 - > 升级到WebSocket。

集群中的每个节点都有ETS表,其中包含每个节点的进程数(字段 - 节点,num_processes)。每个节点每5秒将其进程数发送给集群中的所有节点。

因此我们不需要拥有主节点,因为每个节点都可以进行负载平衡。

2)其他问题:

使用gproc全局注册用户的活动WebSocket连接(pids)是一个好主意吗?我们需要为每个用户提供此列表,以通过ws向最终用户发送通知。

2 个答案:

答案 0 :(得分:2)

1)是的 - 这是一个很好的计划。您可以进行的改进是每次平衡负载到另一个节点时增加远程节点的负载。这就像保持对远程节点负载的估计并阻止您一次将所有负载发送到一个节点五秒钟。每当您收到来自其他节点的广播时,只需覆盖您的本地估算值 - 这将修复所有丢失的更新,并确保您的估算值保持在实际远程值的一小部分内。

2)您可以为每个websocket进程使用名为property {Username, true}的gproc - 这将让您在整个集群中找到用户的所有websocket会话。

我忘记了gproc用于全局注册的基础协议以及您在整个群集中始终注册/取消注册属性的成本。我曾经在一个非常相似的系统(用户存在和消息与会话和多节点负载平衡)上工作了一段时间,最后写了ngproc,以便在分区后支持冲突解决的廉价名称查找。它可以作为开源提供,并可能提供一些您可以使用的想法。

答案 1 :(得分:0)

有趣:

  • 您为什么样的用户设计?
  • 聊天会发送多少数据?是文本,图像还是视频?
  • 你有什么负载平衡,即你期望哪个资源是关键资源?
  • 如果节点死亡,您期望发生什么?