zoukankan      html  css  js  c++  java
  • [Erlang04]为什么有了rpc还有net_kernel:connect/1?

    问题描述:

    RPC(Remote Procedure Call)远程程序调用:

    如果要给另一个节点发信息:可以简单写成:

    call(Msg,Node) ->
       {server,Node}!{self(),Msg},
       receive
         {ok,Res} ->
             Res
    end.
    
    server() ->
     register(server,self()),
     loop().
    
    loop() ->
       receive
           {Pid,N} ->
                   Pid!{ok,N*N}
       end,
       loop().

    以上就是RPC的原型,但是要注意本地调用和远程调用区别在于远程节点可能失效,可以加个超时:

    call(Msg,Node) ->
       {server,Node}!{self(),Msg},
       receive
         {ok,Res} ->
             Res
        after 1000 ->
           {error,timeout}
    end.

    Tip: 但是要特别注意的是:超时后仍可能收到消息并存储在进程邮箱中,远程服务器很忙或网络不佳时,如果你不刷新消息,下次call/2并且发送一个新的请求时,最终你取出了是队列的每一个消息,就是你call(A,Node)timeout了,又call(B,Node),可能你得到的是A的结果,这个不刷新真悲剧。

    erlang把上面的原理也用gen_server封装了下,就有了rpc:call(Node,Module,Func,Args)这个函数。

    以上来源于:Erlang编程指南

    问题:都已经可以用RPC和远程节点通信了,还要net_kernel来做什么?

      注意到,我们发信息时还要指定对应的Node名字,对于调用者是不好的,(这个参数也不好找),Erlang要的效果是:把本地节点方式和远程节点编写方式统一,将其透明化。

    因为只要知道PID就可以给它发信息这个特性,可以分2步完成。

    1. 把要用的节点手动连接起来,

    2.使用加强版本的global:whereis_name/1代替erlang:whereis/1.

    所以这就是net_kernel的作用:用于手动启动,停止,连接和监控节点的构造。

    这样你发信息可以这样子!和本地是一样了啦!!!

    erlang:send(global:whereis_name(test),for_test).

    Tips:

        1. 这里使用:net_kernel:connect/1成功的前提一定是cookie相同;

        2. erl 可以用-connect_all_false 标记,来不让别的节点连接,系统也不会保留连接节点的全局表,这样就可以阻止全局声明。

        3. erl –hidden将节点隐藏起来:原因如果N个节点隐藏互连,就会互相监视,要保持N*(N-1)/2的连接,增加了节点凌晨发送监控消息的开销,所以就把不用的节点先隐藏,要用的时候再用net_kerlel:connect(Node)建立;

        4. erl –name –sname 最好不要混用;

        5. nep_adm: ping(Node)可以Node有没有连接上来pong通,pang不通.

    epmd进程:如果你是在用UDP或TCP等协议来做分布式的话:

    以下摘自Erlang编程指南

    epmd是erlang运行时系统的一部分,它为erlang分布式的节点扮演了端口映射看守程序的角色,无论多少分布式节点运行在它上面,每个机器 只会启动一个epmd看守程序进程,监听来自己端口4369的所有连接请求,并把综们映射到被接节点的监听端口,如果还没有开始运行,当启动你第一个分布式erlang节点时epmd会自动运行,然后通过 手动开启,可以传递一系列的命令和设置参数。

  • 相关阅读:
    Python3 运算符
    Python之匿名函数
    Python之推导式、生成器表达式
    Python网络编程
    Python单例模式
    Python异常处理及元类
    Python面向对象(三)
    Python面向对象(二)
    Python面向对象(一)
    Python面向对象入门
  • 原文地址:https://www.cnblogs.com/zhongwencool/p/3726739.html
Copyright © 2011-2022 走看看