如何从 elixir,phoenix 框架应用程序中的另一个节点访问驻留在一个节点中的状态?
How to access the state residing in a node from another node in elixr, phoenix framework application?
从另一个节点访问一个节点的状态的最佳方式是什么?
我有一个使用 Phoenix Framework(elixir phoenix) 开发的应用程序。我想 运行 这个应用程序在多个节点来管理流量。我正在利用 phoenix 提供的套接字的强大功能,因此该应用程序创建了大量套接字。
我们的应用程序需要存储用户的状态信息。在 的帮助下,我创建了一个观察者,它在观察者的状态下维护存在信息。我必须通过访问状态信息来检查用户是否在线。
当我进行多节点设置时,用户可能会连接到任何节点。在这种情况下,要检查用户的在线状态,我需要从所有节点访问在线状态信息。而且这个操作会非常频繁。
实现这种跨节点状态访问的最佳方式是什么?
ETS 对此有帮助吗?
我可以使用 Genserver.call({node, name}, :identifier)
来获取状态吗?是阻塞调用吗?这会使节点变慢吗?
还有其他有效的方法吗?
您需要通过API公开您想要与其他节点共享的信息。在这种情况下,每个节点都需要有一个 API 来向其他节点公开用户状态。您可以从两方面解决这个问题:
主动共享:包含用户状态的节点主动将状态发送到其他节点(或缓存形式)以响应某些事件(例如,当用户连接,断开连接,每小时, ...)
被动共享:其他节点在需要时查询拥有用户状态信息的节点。
在这两种情况下,您都可以有多种可能的设计。
例如,在第一种情况下,您可以有一个代理(如 RabbitMQ or ZeroMQ)接受通知并存储它们,以便其他节点可以查询它们或根据某些规则发送它们。此外,如果您选择将通知存储在节点上的 ETS table 中,这样的 ETS table 基本上可以充当代理。所以 ETS table 属于第一类。包含用户状态的进程将信息存储在 ETS 中,另一个进程可以从那里查询它,或者拥有 ETS table 的进程可以根据某些规则发送通知。
对于第二种情况,您将公开一个 API,可能是以调用 gen_server 的形式,以便其他节点可以直接从 gen_server 它的存储位置。然后你可以同步调用 API ,例如使用 rpc:call
. Or you can call it asynchronously with either spawning a new process to handle the call or using rpc:async_call
.
选择哪种设计是您需要自己回答的重要问题。如果用户状态经常变化,而你只需要不时查询,那么第二种变体可能更有效。如果用户状态不经常变化,并且从性能的角度来看缓存它会很好,那么可以考虑第一个选项。您还需要考虑额外的复杂性和可能的其他要求。
在您的具体情况下,第一个选项 - 用户在线时发送通知 - 似乎更合适。确切的实施可能取决于您希望如何使用该信息。
从另一个节点访问一个节点的状态的最佳方式是什么?
我有一个使用 Phoenix Framework(elixir phoenix) 开发的应用程序。我想 运行 这个应用程序在多个节点来管理流量。我正在利用 phoenix 提供的套接字的强大功能,因此该应用程序创建了大量套接字。
我们的应用程序需要存储用户的状态信息。在
当我进行多节点设置时,用户可能会连接到任何节点。在这种情况下,要检查用户的在线状态,我需要从所有节点访问在线状态信息。而且这个操作会非常频繁。
实现这种跨节点状态访问的最佳方式是什么?
ETS 对此有帮助吗?
我可以使用 Genserver.call({node, name}, :identifier)
来获取状态吗?是阻塞调用吗?这会使节点变慢吗?
还有其他有效的方法吗?
您需要通过API公开您想要与其他节点共享的信息。在这种情况下,每个节点都需要有一个 API 来向其他节点公开用户状态。您可以从两方面解决这个问题:
主动共享:包含用户状态的节点主动将状态发送到其他节点(或缓存形式)以响应某些事件(例如,当用户连接,断开连接,每小时, ...)
被动共享:其他节点在需要时查询拥有用户状态信息的节点。
在这两种情况下,您都可以有多种可能的设计。
例如,在第一种情况下,您可以有一个代理(如 RabbitMQ or ZeroMQ)接受通知并存储它们,以便其他节点可以查询它们或根据某些规则发送它们。此外,如果您选择将通知存储在节点上的 ETS table 中,这样的 ETS table 基本上可以充当代理。所以 ETS table 属于第一类。包含用户状态的进程将信息存储在 ETS 中,另一个进程可以从那里查询它,或者拥有 ETS table 的进程可以根据某些规则发送通知。
对于第二种情况,您将公开一个 API,可能是以调用 gen_server 的形式,以便其他节点可以直接从 gen_server 它的存储位置。然后你可以同步调用 API ,例如使用 rpc:call
. Or you can call it asynchronously with either spawning a new process to handle the call or using rpc:async_call
.
选择哪种设计是您需要自己回答的重要问题。如果用户状态经常变化,而你只需要不时查询,那么第二种变体可能更有效。如果用户状态不经常变化,并且从性能的角度来看缓存它会很好,那么可以考虑第一个选项。您还需要考虑额外的复杂性和可能的其他要求。
在您的具体情况下,第一个选项 - 用户在线时发送通知 - 似乎更合适。确切的实施可能取决于您希望如何使用该信息。