什么过程执行RPC:铸造



现在,我正在构建一个分布式应用程序,并正在考虑使用RPC:cast vs rpc:呼叫,因为我不希望呼叫过程等待返回值,甚至接收到接收一。

铸件非常适合此功能,但是我很好奇,什么过程执行RPC通过:Cast and Call的功能?我应该担心过度/不同时发生吗?

通常,当我想要另一个进程执行代码时,我会使用一个工人池,并将其中一个与gen_server:cast/2一起发送异步铸造,让他们处理它。但是对于RPC,它不能定义计算的过程。这些流程是否已预先分配和等待?还是每个过程都按照RPC调用并终止终止?从我阅读的内容来看,如果您打电话很多,这是非常低效的,因为这些过程只是被创建和破坏,这在计算上并不容易。

感谢您提前的帮助!

tl; dr:

在目标节点上产生的一个过程以处理RPC。

讨论

如果我们查看RPC模块的代码,我们会看到它包裹了disterl中的基本正常节点消息传递功能:

https://github.com/erlang/otp/blob/master/lib/kernel/src/src/rpc.erl#l398-l403

-spec cast(Node, Module, Function, Args) -> true when
      Node :: node(),
      Module :: module(),
      Function :: atom(),
      Args :: [term()].
cast(Node, Mod, Fun, Args) when Node =:= node() ->
    catch spawn(Mod, Fun, Args),
    true;
cast(Node, Mod, Fun, Args) ->
    gen_server:cast({?NAME,Node}, {cast,Mod,Fun,Args,group_leader()}),
    true.

发生的事情是,当在当前节点上调用Cast时,A new Process 将用提供执行的MFA产生。如果在其他节点上调用了情况,则通过gen_server:cast/2发送消息到指示的节点的组领导者,而目标节点上的组负责人将产生一个处理MFA的过程。

演员的处理代码在这里:

https://github.com/erlang/otp/blob/master/lib/kernel/src/src/rpc.erl#l130-l139

-spec handle_cast(term(), state()) -> {'noreply', state()}.
handle_cast({cast, Mod, Fun, Args, Gleader}, S) ->
    spawn(fun() ->
          set_group_leader(Gleader),
          apply(Mod, Fun, Args)
      end),
    {noreply, S};
handle_cast(_, S) ->
    {noreply, S}. % Ignore !

如果您已经知道要在另一个节点上派遣消息的过程RPC模块完全,只需进行gen_server呼叫或直接施放。当然,哪种使用方法是一种口味和建筑问题。

该过程的名称为 rex。这是一个注册过程,它催生了执行apply(M, F, A)的过程。

https://github.com/erlang/otp/blob/master/lib/kernel/src/rpc/rpc.erl#l28

https://github.com/erlang/otp/blob/master/lib/kernel/src/rpc.erl#l402

顺便说一句,这意味着所有rpc:call/4rpc:cast/4和其他参数都通过一个限制可扩展性的过程。rpc模块不是用于高吞吐量的目的。

最新更新