我有一个设置,其中两个节点将进行大量通信。在节点 A 上,将有数千个进程用于访问节点 B 上的服务。两个节点之间将有大量的请求和响应。这两个节点将在两个不同的服务器上运行,每个服务器都在自己的硬件服务器上。
我有 3 个选项: HTTP/1.1 、 rpc:call/4 和直接向节点 B 上注册的 gen_server 发送消息。让我解释每个选项。
HTTP/1.1
假设在节点 A 上,我有一个类似 HTTP 客户端Ibrowse
,在节点 B 上,我有一个类似 Web 服务器Yaws-1.95
,Web 服务器能够处理无限连接,操作系统设置调整为允许 yaws 处理所有连接. 然后让我在节点 A 上的进程使用 HTTP 进行通信。在这种情况下,每个方法调用都意味着一个 HTTP 请求和一个回复。我相信这里有开销,但我们正在评估这里的选项。称为 erlang 的内置机制webtool
,可能就是为了这种目的而构建的。
RPC:调用/4
我可以直接从节点 A 到节点 B 进行 rpc 调用。我不太确定底层 rpc 机制是如何工作的,但我认为当两个 erlang 节点通过连接时net_adm:ping/1
,创建的连接不会关闭,但所有 rpc 调用都使用这个管道传输请求并传递响应。请纠正我这一点。
从节点 A 向节点 B 发送消息
我可以让节点 A 上的进程只向已注册的进程或节点 B 上的一组进程发送消息。这似乎也是一个干净的选择。
Q1。对于两个 erlang 节点将一直在它们之间进行大量通信的应用程序,您会推荐上述哪个选项以及为什么。想象一个消息传递系统,其中两个 erlang 节点是路由器 :) ?
Q2。上述哪种方法更干净、问题更少并且更容错(我的意思是,该方法不应该有单点故障,这可能导致节点 A 上的所有进程都失灵)?
Q3。您选择的机制:您将如何使其更具容错性或冗余性?
假设:节点始终处于活动状态并且永远不会关闭,节点之间的网络连接将始终可用且不拥塞(仅专用于两个节点),操作系统已为这两个节点分配了最大的资源。
感谢您的评价