基于 Erlang 的聊天(负载平衡和通知分发)
Erlang based chat (load balancing and notifications distribution)
我们要为我们的 Messenger 开发一个后端,所以我想在这里描述一个想法,也许有人可以给我一个建议。
1)想法:
Nginx - 将请求重定向到随机节点(循环法)->
Erlang 集群 - 重定向到实际节点(我们选择进程数最少的节点)->
握手 ->
升级到 WebSocket。
集群中的每个节点都有 ETS table,其中包含每个节点的进程数(字段 - 节点,num_processes)。每个节点每 5 秒将其进程数发送到集群中的所有节点。
所以我们不需要主节点,因为每个节点都可以做负载均衡。
2) 附加问题:
使用 gproc 全局注册用户的活动 WebSocket 连接 (pids) 是个好主意吗?我们需要此列表供每个用户通过 ws 向最终用户发送通知。
1) 是的 - 这是一个很好的方案。您可以进行的改进是每次将负载平衡到另一个节点时增加远程节点的负载。这就像保持对远程节点负载的估计,并阻止您一次将所有负载发送到一个节点 5 秒。每次您收到来自另一个节点的广播时,只需覆盖您的本地估计 - 这将修复所有丢失的更新并确保您的估计保持在实际远程值的少量范围内。
2) 您可以为每个 websocket 进程使用名为 属性 {Username, true}
的 gproc - 这将使您可以找到整个集群中用户的所有 websocket 会话。
我忘记了 gproc 用于全局注册的底层协议以及在整个集群中始终为 registering/deregistering 属性支付的费用。我曾在一个非常相似的系统上工作(用户存在和消息传递与会话和多节点负载平衡)并最终编写 ngproc 以支持廉价名称查找并在分区后解决冲突。它是开源的,可能会提供一些您可以使用的想法。
有趣:
- 您设计的用户数量是多少?
- 聊天会发送多少数据?是文本、图像还是视频?
- 您的负载平衡是为了什么,即您希望哪个资源成为关键资源?
- 如果节点死亡,您预计会发生什么情况?
我们要为我们的 Messenger 开发一个后端,所以我想在这里描述一个想法,也许有人可以给我一个建议。
1)想法:
Nginx - 将请求重定向到随机节点(循环法)-> Erlang 集群 - 重定向到实际节点(我们选择进程数最少的节点)-> 握手 -> 升级到 WebSocket。
集群中的每个节点都有 ETS table,其中包含每个节点的进程数(字段 - 节点,num_processes)。每个节点每 5 秒将其进程数发送到集群中的所有节点。
所以我们不需要主节点,因为每个节点都可以做负载均衡。
2) 附加问题:
使用 gproc 全局注册用户的活动 WebSocket 连接 (pids) 是个好主意吗?我们需要此列表供每个用户通过 ws 向最终用户发送通知。
1) 是的 - 这是一个很好的方案。您可以进行的改进是每次将负载平衡到另一个节点时增加远程节点的负载。这就像保持对远程节点负载的估计,并阻止您一次将所有负载发送到一个节点 5 秒。每次您收到来自另一个节点的广播时,只需覆盖您的本地估计 - 这将修复所有丢失的更新并确保您的估计保持在实际远程值的少量范围内。
2) 您可以为每个 websocket 进程使用名为 属性 {Username, true}
的 gproc - 这将使您可以找到整个集群中用户的所有 websocket 会话。
我忘记了 gproc 用于全局注册的底层协议以及在整个集群中始终为 registering/deregistering 属性支付的费用。我曾在一个非常相似的系统上工作(用户存在和消息传递与会话和多节点负载平衡)并最终编写 ngproc 以支持廉价名称查找并在分区后解决冲突。它是开源的,可能会提供一些您可以使用的想法。
有趣:
- 您设计的用户数量是多少?
- 聊天会发送多少数据?是文本、图像还是视频?
- 您的负载平衡是为了什么,即您希望哪个资源成为关键资源?
- 如果节点死亡,您预计会发生什么情况?