erlang rpc 远程调用

本文探讨了Erlang中的RPC远程调用机制,重点分析了rex进程的作用、gen_server:call与rpc:call的效率比较,以及rpc与gen_server之间的关系。在rpc调用中,业务进程通过gen_server:call与rex进程交互,rex进程处理请求并回复结果。当调用增多时,rex进程可能会变得繁忙。与直接使用gen_server:call相比,rpc:call涉及额外的rex进程层,可能影响效率。
摘要由CSDN通过智能技术生成

跨节点进行远程调用的时候,会经常用到rpc模块提供的方法,例如rpc:call、rpc:cast。那么每个节点上的rpc模块是怎么工作的呢?

rex进程

rpc模块的启动过程很简单,并没有初始化做太多事情,以{local,rex}的名称启动了一个gen_server进程,这个gen_server进程的state是一个gb_trees的数据结构。

-spec start() -> {'ok', pid()} | 'ignore' | {'error', term()}.
start() ->
    gen_server:start({local,?NAME}, ?MODULE, [], []).

-spec start_link() -> {'ok', pid()} | 'ignore' | {'error', term()}.
start_link() ->
    gen_server:start_link({local,?NAME}, ?MODULE, [], []).

业务进程调用rpc:call

rpc模块中比较常用的就是rpc:call和rpc:cast

call/4 和 call/5 这个两个接口的区别,只是在timeout时间是自定义还是infinity而已。
call(Node,M,F,A,Timeout) 内部根据Node是否为本地节点,又分为local_call/3和do_call/3。
这里我们可以通过rpc.erl来查看。

同个节点local_call

local_call根据MFA直接调用apply执行。

local_call(M, F, A) when is_atom(M), is_atom(F), is_list(A) ->
    case catch apply(M, F, A) of
    {'EXIT',_}=V -> {badrpc, V};
    Other -> Other
    end.

远程节点do_call

do_call(Node, {call, M,F,A,group_leader()},Timeout)

do_call(Node,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值