我在节点A上有几个Erlang应用程序,他们正在对节点B进行rpc调用,我有Mnesia存储过程(数据库查询功能)和我的Mnesia数据库。现在,偶尔,对节点B进行rpc调用以获取数据的同时进程数量可以增加到150.现在,我有几个问题:
问题1:对于每个对远程节点的rpc调用,节点A是否创建了一个全新的(比如TCP / IP或UDP连接或它们在传输中使用的任何连接)CONNECTION?或者只有一个连接,并且所有rpc调用都共享这个连接(因为节点A和节点B连接[与该epmd进程有关])?
问题2:如果我在一个节点上有以数据为中心的应用程序,并且我在另一个节点上有一个集中管理的Mnesia数据库,这些应用程序的表共享相同的模式,可以复制,分段,索引等,这是一个更好的选择:使用rpc调用以便从数据节点获取数据到应用程序节点,或者使用说TCP / IP开发一个全新的框架(Scalaris人们为其故障检测器做的方式)以应对网络延迟问题?
问题3:有没有人在那里测试或替换标记rpc呼叫效率的方式可以回答以下问题?
(a) Erlang节点可以在不中断的情况下推送到另一个节点的最大同时rpc调用数是多少?
(b)有没有办法通过系统配置或操作系统设置增加此数量? (请参阅答案中的Open Solaris for x86)
(c)是否还有其他方法可以从远程Erlang节点上运行的Mnesia请求数据而不是rpc? (比如CORBA,REST [需要HTTP端到端],Megaco,SOAP e.t.c)
答案 0 :(得分:4)
Mnesia运行erlang发行版,在Erlang发行版中,任何一对节点之间只有一个tcp / ip连接(通常采用完全网状排列,因此每对节点都有一个连接)。所有rpc / internode通信都将通过此分发连接进行。
此外,保证在分发之间的任何一对通信进程之间保留消息排序。未定义两个以上进程之间的顺序。
Mnesia为您提供了很多数据放置选项。如果您希望在节点B上使用持久存储,但在节点A上完成处理,则可以在B上使用表的disc_only_copies,在节点A上使用ram_copies。这样,节点A上的应用程序可以快速访问数据,您仍然可以在节点B上获得持久的副本。
我假设A和B之间的网络是一个很可靠的局域网,很少进行分区(否则你将花费大量时间在分区后让mnesia重新上线)。
如果A和B都在运行mnesia,那么我会让mnesia为我做所有的RPC - 这就是为mnesia构建的,并且它有许多优化。如果没有充分的理由,我不会推出自己的RPC或分发机制。
对于基准测试,完全依赖于您的硬件,mnesia架构和节点之间的网络(以及应用程序的数据访问模式)。没有人可以给你这些基准,你必须自己运行它们。
至于其他用于访问mnesia的RPC机制,我认为没有任何开箱即用的功能,但是您可以使用许多RPC库将mnesia API呈现给网络,只需要花费少量精力就可以了。一部分。