【问题标题】:Erlang remote procedure call module internalsErlang 远程过程调用模块内部结构
【发布时间】:2011-07-17 09:29:46
【问题描述】:

我在节点 A 上有几个 Erlang 应用程序,他们正在对节点 B 进行 rpc 调用,在该节点 B 上我有 Mnesia 存储过程(数据库查询函数)和我的 Mnesia DB。现在,偶尔,同时向节点 B 调用数据的 rpc 进程的数量可能会上升到 150。现在,我有几个问题:

问题 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 等)

【问题讨论】:

  • 你问了很多问题,却根本不接受任何答案。为什么?

标签: erlang rpc


【解决方案1】:

Mnesia 在 erlang 发行版上运行,在 Erlang 发行版中,任何一对节点之间只有一个 tcp/ip 连接(通常采用全网状布置,因此每对节点都有一个连接)。所有 rpc/节点间通信都将通过此分发连接进行。

此外,还可以保证在任何一对通信进程之间通过分发保留消息顺序。未定义两个以上进程之间的排序。


Mnesia 为您提供了很多数据放置选项。如果您希望在节点 B 上进行持久存储,但在节点 A 上完成处理,您可以在 B 上拥有表的 disc_only_copies,在节点 A 上拥有 ram_copies。这样,节点 A 上的应用程序可以快速访问数据,并且您仍然可以在节点 B 上获取持久副本。

我假设 A 和 B 之间的网络是一个可靠的 LAN,很少会发生分区(否则您将花费​​大量时间在分区后让 mnesia 重新联机)。

如果 A 和 B 都在运行 mnesia,那么我会让 mnesia 为我做所有的 RPC - 这就是 mnesia 的目的,它有许多优化。如果没有很好的理由,我不会推出自己的 RPC 或分发机制。


至于基准测试,这完全取决于您的硬件、mnesia 架构和节点之间的网络(以及您的应用程序的数据访问模式)。没有人能给你这些基准,你必须自己运行它们。

至于其他访问 mnesia 的 RPC 机制,我不认为有任何现成的,但是有很多 RPC 库可以用来向网络展示 mnesia API部分。

【讨论】:

    猜你喜欢
    • 2017-07-05
    • 2022-01-06
    • 2011-06-13
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2012-09-12
    • 2019-05-14
    • 2010-10-01
    相关资源
    最近更新 更多