[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会自动运行,然后通过 手动开启,可以传递一系列的命令和设置参数。
[Erlang04]为什么有了rpc还有net_kernel:connect/1?的更多相关文章
- [Erlang07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏
用Erlang久了,以为erlang做类似于As3,JS的图形化界面是绝对不可能的,多少次,多少次想用erlang做个炫酷的图形游戏.终于:折腾出来了结果:纯Erlang也可以做到! 因为以前接触过W ...
- Erlang 103 Erlang分布式编程
Outline 笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期 变更说明 2014-11-23 A Outl ...
- cowboy中分布式节点通信
项目开发中,web前端节点需要与远端的聊天服节点通信.聊天服使用了otp,但我对otp下的分布式通信不太清楚,造成了一些问题. 1)首先是cowboy节点的命名.具体参数是配置在工程目录rel下的vm ...
- OTL翻译(9) --常量的SQL语句
常量的SQL语句 一个没有绑定变量的SQL语句.SQL语句块或是存储过程就被称为常量的SQL语句.OTL通过一个静态的函数来执行这样的SQL语句. 例如: // static otl_cursor:: ...
- [Erlang12] Mnesia分布式应用
[Erl_Question12] Mnesia分布式应用 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个节点挂了进,对外接口不影响). 方案一: Er ...
- OceanBase数据库实践入门——手动搭建OceanBase集群
前言 目前有关OceanBase功能.案例.故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试.本文就是分享初学者如何手动搭建一个OceanBase集群.这也是学习理解Ocea ...
- [Erlang]Mnesia分布式应用
http://blog.csdn.net/erlib/article/details/40743687 情景: 设计一个图书管理系统,需求: 1. 基本的增删查改功能; 2. 支持多节点备份(其中一个 ...
- 5105 pa1 MapReduce
Programming Assignment 1: A simple MapReduce-like compute framework Yuanli Wang wang8662 ...
- erlang在windows下和虚拟机节点通信
版权声明:博客将逐步迁移到 http://cwqqq.com https://blog.csdn.net/cwqcwk1/article/details/24738599 在Linux下部署erlan ...
随机推荐
- windows兼容方式安装python[转]
Python 是一门很不错的语言,语言简单易学,又不失脚本语言的灵活性,还有海量的第三方库,覆盖的很全面.但也有不少“硬伤”,比如 Python 2.x 和 Python 3.x 版本之间的不兼容等等 ...
- Newtonsoft.Json(Json.Net)学习
转自原文 Newtonsoft.Json(Json.Net)学习笔记 Newtonsoft.Json,一款.NET中开源的Json序列化和反序列化类库.软件下载地址: http://www.newto ...
- leetcode558
""" # Definition for a QuadTree node. class Node(object): def __init__(self, val, isL ...
- malloc()与calloc区别 (转)
另外说明: 1.分配内存空间函数malloc 调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域.函数的 ...
- UGUI BUG
UNITY UGUI问题:父类使用 GroupLayout,子类使用contentsize filter时,会出现运行时布局重叠,但隐藏后再显示就会好了.
- Struts2结果页面配置(Result)
1.全局页面配置 全局结果页面:针对一个包下的所有Action的页面跳转都可生效 <global-results> <result name="xxx">/ ...
- ResultMap详解
MyBatis:ResultMap详解 一.前言 MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBat ...
- VMWare中三种网络连接模式的区别
VMWare中有桥接.NAT.host-only三种网络连接模式,在搭建伪分布式集群时,需要对集群的网络连接进行配置,而这一操作的前提是理解这三种网络模式的区别. 参考以下两篇文章可以更好的理解: V ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager
我们看看NSFileManager如何使用.包括创建文件,目录,删除,遍历目录等. 1.在Documents里创建目录 创建一个叫test的目录,先找到Documents的目录, [cpp] view ...
- 一个word小技巧
最近在进行word格式重拍的时候发现了一个有些恶心的事,怎么去匹配文档里面所有的中文呢? 后来通过网络搜索发现了答案,在word中的查找和替换中有一个选项,可以使用通配符进行匹配. 当我们使用 ([一 ...