[Erl_Question04]为什么有了rpc还有net_kernel:connect/1?
2014-05-13 23:13
197 查看
问题描述:
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会自动运行,然后通过 手动开启,可以传递一系列的命令和设置参数。
相关文章推荐
- [ASP.NET]为什么CustomValidator验证控件在验证DropdownList的时候不能设置ControlToValidate属性
- asp.net打造进度条窗口代码,还有取消按钮呢
- 为什么安装mysql提示安装.net framework 4.0
- 我们为什么要推出ASP.NET栏目?
- 【原创】Asp.net MVC 学习笔记之-为什么使用Html.TextBox方法会出现异常?
- 关于ASP.net - Joyrock:异步应用示例、JSON-RPC了解
- ASP.NET : 为什么应该尽量避免直接用Response.Write输出内容
- HTML5绘制矩形和圆形并且还有获取在这个图层内的坐标的思路和代码 - feilong_12的专栏 - 博客频道 - CSDN.NET
- Asp.Net GridView 的e.Row.Cells[0].Text为什么取不到值?
- 为什么IM还有生存空间
- 我们为什么要推出ASP.NET栏目?
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
- 北大、咖啡、自行车还有.NET 推荐
- 互联网风口上的猪都能飞,为什么还有90%的人摔了?
- 为什么用ADO.NET方式读取Excel数字读不出来?
- 图灵社区 : 阅读 : [讨论] Java语言被很多人抱怨语法繁琐、开发效率低、体系繁杂而笨重,为什么还有这么强的生命力,尤其是在企业软件领域?
- 为什么要进行vs.net和模型的双向同步?
- 我们为什么要推出ASP.NET栏目?
- asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作
- [Asp.net基础]httpmodule, httphandler, handlerfactory(未完待续, 还有异步处理)