Erlang远程过程调用模块内部机制

3
我在节点A上有多个Erlang应用程序,它们正在向节点B发起rpc调用,其中我有Mnesia存储过程(数据库查询函数)和我的Mnesia数据库。现在,偶尔会有150个同时进行的进程向节点B发起数据rpc调用。现在,我有几个问题:
问题1:对于每个远程节点的rpc调用,节点A是否会创建一个全新的(例如TCP/IP或UDP连接或任何它们在传输中使用的内容)连接?还是只有一个连接,所有rpc调用都共享这个连接(因为节点A和节点B已连接[与epmd进程有关])?

问题2:如果我在一个节点上有数据中心应用程序,并且在另一个节点上有集中管理的Mnesia数据库,这些应用程序的表共享相同的模式,可能会被复制、分片、索引等等,哪个选项更好:使用rpc调用从数据节点获取数据到应用程序节点,还是开发一个全新的框架,例如使用TCP/IP(就像Scalaris的故障检测器一样)来解决网络延迟问题?

问题3: 有没有人测试或者基准测试过rpc调用的效率,以便回答以下问题?
(a) Erlang节点可以将最大数量的同时rpc调用推送到另一个节点上而不会崩溃是多少?
(b) 是否有一种方法可以通过系统配置或操作系统设置来增加此数字?(在您的答案中参考Open Solaris for x86)
(c) 除了rpc之外,应用程序是否有其他方式从运行在远程Erlang节点上的Mnesia请求数据? (例如CORBA,REST [需要HTTP端到端],Megaco,SOAP等)

你问了很多问题,却不接受任何答案。为什么? - Peer Stritzinger
1个回答

4
Mnesia在Erlang分布式系统上运行,在Erlang分布式系统中,任何一对节点之间只有一个TCP/IP连接(通常是全网状结构,因此每对节点之间有一个连接)。所有rpc/节点内通信都将通过此分布式连接进行。
此外,保证消息排序在任何一对通信进程之间的分发中得以保留。但在超过两个进程之间的排序未被定义。
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呈现给网络。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接