问题描述:

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会自动运行,然后通过 手动开启,可以传递一系列的命令和设置参数。

[Erlang04]为什么有了rpc还有net_kernel:connect/1?的更多相关文章

  1. [Erlang07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏

    用Erlang久了,以为erlang做类似于As3,JS的图形化界面是绝对不可能的,多少次,多少次想用erlang做个炫酷的图形游戏.终于:折腾出来了结果:纯Erlang也可以做到! 因为以前接触过W ...

  2. Erlang 103 Erlang分布式编程

    Outline 笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明 2014-11-23 A Outl ...

  3. cowboy中分布式节点通信

    项目开发中,web前端节点需要与远端的聊天服节点通信.聊天服使用了otp,但我对otp下的分布式通信不太清楚,造成了一些问题. 1)首先是cowboy节点的命名.具体参数是配置在工程目录rel下的vm ...

  4. OTL翻译(9) --常量的SQL语句

    常量的SQL语句 一个没有绑定变量的SQL语句.SQL语句块或是存储过程就被称为常量的SQL语句.OTL通过一个静态的函数来执行这样的SQL语句. 例如: // static otl_cursor:: ...

  5. [Erlang12] Mnesia分布式应用

    [Erl_Question12] Mnesia分布式应用 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个节点挂了进,对外接口不影响). 方案一: Er ...

  6. OceanBase数据库实践入门——手动搭建OceanBase集群

    前言 目前有关OceanBase功能.案例.故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试.本文就是分享初学者如何手动搭建一个OceanBase集群.这也是学习理解Ocea ...

  7. [Erlang]Mnesia分布式应用

    http://blog.csdn.net/erlib/article/details/40743687 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个 ...

  8. 5105 pa1 MapReduce

    Programming Assignment 1: A simple MapReduce-like compute framework Yuanli Wang  wang8662            ...

  9. erlang在windows下和虚拟机节点通信

    版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/24738599 在Linux下部署erlan ...

随机推荐

  1. C#中如何判断线程当前所处的状态

    转自原文 在C#中如何判断线程当前所处的状态 在C#中,线程对象Thread使用ThreadState属性指示线程状态,它是带Flags特性的枚举类型对象.    ThreadState 为线程定义了 ...

  2. ListView 中 的 分页

     Django Pagination 简单分页 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面,影响用户体验.Django 内置的 Pagination 能够帮助我 ...

  3. c++builder 读写文件类

    c++builder 读写文件类 TStreamReader.TStreamWriter读取一行 http://docwiki.embarcadero.com/CodeExamples/XE8/en/ ...

  4. Git(三):Git 使用规范流程

    转:http://www.ruanyifeng.com/blog/2015/08/git-use-process.html 团队开发中,遵循一个合理.清晰的Git使用流程,是非常重要的. 否则,每个人 ...

  5. 【297】IDL 过程、函数&关键字参数

    目录: 一.Procedure 1.1 基本说明&定义 1.2 关键字参数 二.Function 2.1 基本说明&定义 2.2 关键字参数 参考:IDL中函数中的带有关键字的参数的使 ...

  6. Log4j编写

    来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.html Log4J的配置文件(Configuration File)就是用来设置记 ...

  7. SPI子系统分析之三:驱动模块

    内核版本:3.9.5 SPI核心层(平台无关) SPI子系统初始化的第一步就是将SPI总线注册进内核,并且在/sys下创建一个spi_master的类,以后注册的从设备都将挂接在该总线下. 下列函数位 ...

  8. MySQL数据库篇之初识数据库

    主要知识点: 一.数据库概述 二.mysql安装与基本管理 1️⃣ 数据库概述 1.什么是数据(Data)? 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音. ...

  9. C#根据url生成唯一的key

    根据url生成唯一的idkey,记录并分享: public class UrlToUniqueKey { ); , ] { { 0L, 0L }, { -4611686018427387904L, - ...

  10. cdoj914-方老师分身 I 【dijkstra】

    http://acm.uestc.edu.cn/#/problem/show/914 方老师分身 I Time Limit: 3000/1000MS (Java/Others)     Memory ...