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