Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何从elixr phoenix framework应用程序中的另一个节点访问驻留在节点中的状态?_Elixir_Phoenix Framework - Fatal编程技术网

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

Elixir 如何从elixr phoenix framework应用程序中的另一个节点访问驻留在节点中的状态?,elixir,phoenix-framework,Elixir,Phoenix Framework,从另一个节点访问节点状态的最佳方式是什么? 我有一个用Phoenix框架(elixir Phoenix)开发的应用程序。我想在多个节点上运行这个应用程序来管理流量。我正在利用phoenix提供的套接字的功能,因此该应用程序创建了许多套接字 我们的应用程序需要存储用户的状态信息。在他的帮助下,我创建了一个监视程序,在监视程序的状态下维护状态信息。我必须通过访问状态信息来检查用户是否在线 当我进行多节点设置时,用户可能连接到任何节点。在这种情况下,要检查用户的在线状态,我需要从所有节点访问状态信息。

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

我有一个用Phoenix框架(elixir Phoenix)开发的应用程序。我想在多个节点上运行这个应用程序来管理流量。我正在利用phoenix提供的套接字的功能,因此该应用程序创建了许多套接字

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

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

实现跨节点状态访问的最佳方法是什么

ETS在这里有什么帮助吗

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


还有其他有效的方法吗?

您需要公开希望通过API与其他节点共享的信息。在这种情况下,每个节点都需要一个API来向其他节点公开用户状态。您可以从两个方面解决此问题:

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

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

  • 在这两种情况下,您可以有许多可能的设计

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

    对于第二种情况,您将公开一个API,可能是以调用gen_服务器的形式,以便其他节点可以直接从存储用户状态的gen_服务器检索用户状态。然后可以同步调用API,例如使用。或者,您可以使用异步调用它来处理调用或使用

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


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

    为什么不在单个节点上运行watcher?让登录/注销事件向该观察者发送消息。然后,您只需要监视一个观察者。@GavinBrelstaff:如果您对单点故障的风险感到满意,那么这就行了。在实现级别上,
    :pg2
    组将是一种适当的广播机制(如您的第一种方法)。在每个节点上,向组订阅一个ETS支持的GenServer,然后每个节点可以在用户状态发生变化时向组成员广播。然后,每个节点都有自己的用户状态信息副本。