如何从elixr,phoenix框架应用程序中的另一个节点访问驻留在节点中的状态?

时间:2016-03-16 05:52:28

标签: elixir phoenix-framework

从另一个节点访问节点状态的最佳方法是什么?

我有一个用Phoenix Framework(elixir phoenix)开发的应用程序。我想在多个节点中运行此应用程序来管理流量。我正在利用凤凰提供的套接字的强大功能,因此这个应用程序创建了很多套接字。

我们的应用程序需要存储用户的状态信息。在this answer的帮助下,我创建了一个观察者,用于维护观察者状态下的状态信息。我必须通过访问状态信息来检查用户是否在线。

当我进行多节点设置时,用户可能会连接到任何节点。在这种情况下,为了检查用户的在线状态,我需要访问来自所有节点的在线状态信息。这项行动将非常频繁。

跨节点完成此状态访问的最佳方法是什么?

ETS可以在这方面提供任何帮助吗?

我可以使用Genserver.call({node, name}, :identifier)来获取状态吗?这是阻断电话吗?这会使节点变慢吗?

其他任何有效的方法吗?

1 个答案:

答案 0 :(得分:3)

您需要通过API公开要与其他节点共享的信息。在这种情况下,每个节点都需要有一个API来将用户状态公开给其他节点。你可以双重解决这个问题:

  1. 主动共享:包含用户状态的节点主动将状态发送到其他节点(或缓存形式)以响应某些事件(例如,当用户连接,断开连接,每小时,...... )

  2. 被动共享:其他节点在需要该信息时查询具有用户状态信息的节点。

  3. 在这两种情况下,您都可以拥有许多可能的设计。

    例如,在第一种情况下,您可以拥有一个代理(如RabbitMQZeroMQ),它接受通知并存储它们,以便其他节点可以查询它们或根据它们发送它们。一些规则。此外,如果您选择将通知存储在节点上的ETS表中,则此类ETS表基本上可用作代理。所以ETS表属于第一类。包含用户状态的进程将信息存储在ETS中,然后另一个进程可以查询它,或者拥有ETS表的进程可以根据某些规则发送通知。

    对于第二种情况,您可能会以调用gen_server的形式公开API,以便另一个节点可以直接从存储它的gen_server中检索用户状态。然后,您可以同步调用API,例如使用rpc:call。或者您可以使用spawning a new process异步调用它来处理呼叫或使用rpc:async_call

    选择哪种设计是您需要自己回答的重要问题。如果用户状态经常更改而您只需要不时查询,则第二个变体可能更有效。如果用户状态不经常改变并且从性能角度缓存它是好的,则可以考虑第一选项。您还需要考虑其他复杂性和可能的​​其他要求。

    在您的具体情况下,第一个选项 - 当用户在线时发送通知 - 似乎更合适。确切的实现可能取决于您希望如何使用该信息。