Erlang中的高可用性?

Erlang中的高可用性?,erlang,load-balancing,high-availability,Erlang,Load Balancing,High Availability,在Erlang中实现高可用性的典型方法是什么 让我们假设一些genu服务器在本地注册为?模块。给定N独立并由defaul Erlang节点互连,每个节点运行该gen_server的一个实例,如何1)确保不会由于某些参与节点的故障而丢失请求(只要其中至少一个节点在线),2)对它们进行负载平衡,以避免某些节点过载,而其他节点则挂起等待新消息?据我所知,不存在内置的负载平衡器:没有pg2或更新的pg就足够了(可能仍然是在这方面进一步工作的良好基础) 我敢打赌,这是一个常见的问题,并且经过良好的战斗测试

在Erlang中实现高可用性的典型方法是什么

让我们假设一些
genu服务器
在本地注册为
?模块
。给定
N
独立并由defaul Erlang节点互连,每个节点运行该
gen_server
的一个实例,如何1)确保不会由于某些参与节点的故障而丢失请求(只要其中至少一个节点在线),2)对它们进行负载平衡,以避免某些节点过载,而其他节点则挂起等待新消息?据我所知,不存在内置的负载平衡器:没有
pg2
或更新的
pg
就足够了(可能仍然是在这方面进一步工作的良好基础)

我敢打赌,这是一个常见的问题,并且经过良好的战斗测试的“Erlangish”解决方案确实存在。它们是什么?

我认为对于1)只有一次保证,您需要某种分布式事务算法,因为连接可能会失败,并且您不知道远程节点中请求的状态:远程节点是否已死亡?它是否处于活动状态,只是因为网络故障而断开了连接?在失败之前,它在请求处理过程中走了多远?
您应该检查一下,它与Erlang深度集成

如果您放宽了1的要求(例如,如果请求是幂等的。您只关心至少一次,或者故障并不常见),那么远程
gen_server
可能就足够了,只要在与远程服务器的连接因任何原因断开时重放请求即可

对于2,我们在节点前面以最少连接的方式使用or或webserver,尽管我相信您指的是“内部”Erlang。在这种情况下,我将执行以下操作,以获得带有负载信息的本地ETS:

  • 拥有一个
    模块
    助手,定期向群集中的其他助手广播本地
    模块
    的邮箱大小(或其他度量)
  • 如果sidekick接收到该广播,它会将原始节点和大小写入ETS,或者只在内部保存它们,并将当前最不繁忙的节点存储在ETS中
  • 如果sidekick注意到远程节点断开连接,它将更新ETS
  • 关于,不要轻易放弃它。通过doc
    流程组实现了强大的最终一致性。
    您可能有过载的服务器暂时离开流程组,它们最终将停止接收请求。您可以按节点拥有多台服务器,触发次数较低,以便离开组进行更均匀的分发。

    我认为对于1)只有一次保证,您需要某种分布式事务算法,因为连接可能会失败,并且您不知道远程节点中请求的状态:远程节点是否已死亡?它是否处于活动状态,只是因为网络故障而断开了连接?在失败之前,它在请求处理过程中走了多远?
    您应该检查一下,它与Erlang深度集成

    如果您放宽了1的要求(例如,如果请求是幂等的。您只关心至少一次,或者故障并不常见),那么远程
    gen_server
    可能就足够了,只要在与远程服务器的连接因任何原因断开时重放请求即可

    对于2,我们在节点前面以最少连接的方式使用or或webserver,尽管我相信您指的是“内部”Erlang。在这种情况下,我将执行以下操作,以获得带有负载信息的本地ETS:

  • 拥有一个
    模块
    助手,定期向群集中的其他助手广播本地
    模块
    的邮箱大小(或其他度量)
  • 如果sidekick接收到该广播,它会将原始节点和大小写入ETS,或者只在内部保存它们,并将当前最不繁忙的节点存储在ETS中
  • 如果sidekick注意到远程节点断开连接,它将更新ETS
  • 关于,不要轻易放弃它。通过doc
    流程组实现了强大的最终一致性。
    您可能有过载的服务器暂时离开流程组,它们最终将停止接收请求。您可以按节点设置多个服务器,并使用较低的触发器离开组,以便进行更均匀的分发