我有一个标准的erlang应用程序build立在otp原则上。 我打算把我的erlang节点放在生产中,如下所述:
所有这些工作都非常好,但是在基于会话的http事务的情况下,erlang节点接收到一个请求的机会之一,谁的会话相关的进程驻留在另一个erlang节点上。
我的问题与处理这种情况的最佳策略有关:
1),2)是非常直接的使用和设置,但是我读和testing基于source / cookie / url_param的平衡并不能确保后端之间的平衡。
3)可以使用erlang内部的mnesia复制function来实现。 与3)我可能会结束一个情况下,一个erlang节点内部通信到另一个erlang节点,然后才最终响应请求。
我想知道什么是可取的,为什么? 将长期考虑我的otp应用程序处理大量的实时数据(xmpp协议)将是一个更好的select。
我认为这在很大程度上取决于你的一个节点可以处理多less会话。 至less在HTTP方面,IP和cookie hashing在保持与大量短暂会话的平衡方面做得相当不错。
例如,一个IP后面可能有很多客户(基于cookie的散列应该有助于这一点)。 如果单个节点只能处理相对less量的同时会话,则节点可能会超载。 而且,如果会话长期存在,散列的不平衡可能会显着。 另一方面,如果会话的数量很大且短暂,则具有更多连接的一个节点的相对重要性可能并不重要。
从理论上讲,我也希望通过某种forms的源代码或基于cookie的平衡,您将获得更好的caching命中率。 还有一件事情要考虑的是,如果你有3个节点,那么如果一个节点下来,其他每个节点上的负载都会有16%的负担,即使有完美的负载平衡。 所以你也应该考虑configuration。
如果你可以在单个节点上处理很多请求,那么对我来说,第三个选项就好像你正在解决一个你没有的问题,而当一个更简单的选项是可行的时候,这个问题是不可能的。