http://blog.csdn.net/karl_max/article/details/3985382

1. erlang分布式编程的基本模型
 (1) 分布式erlang:这种模型可以让我们在一个紧密耦合的计算机集群上编写程序。
 (2) 分布式erlang应用程序运行在一个可个这个进程的环境中。一个局域网的不同集群之间,但在同一个防火墙里面。
 (3) 基于套接字的分布式应用:使用TCP/IP套接字,我们可以编写运行在非信任环境中的分布式应用程序。
2. 编写分布式程序的步骤:
 (1)先在一个非分布式erlang环境中编写和测试程序。
 (2)然后在同一台计算机的两个不同的erlang节点上测试程序。 
 (3)最后在同一个网络或者因特网上的两台互相独立的机器上开户不同的erlang节点来测试程序。

3. rpc:call(Node, Mod, Func, [Arg1, Arg2, ..., ArgN]).在Node进行一次远程调用,被调用的函数是Mod:Func(Arg1, Arg2, ..., ArgN).
 节点名的形式形如NodeName@Host。NodeName和Host都是原子(其实整个节点名就是一个原子),所以如果其中有非原子字符时一定要用引号引起来(把节点名全部引起来,如:'NodeName@Host')
4. 在不需要DNS的情况下可以用erl -sname NodeName
否则用erl -name NodeName  在windows下erl -name hello这样不能用,得这样:erl -name hello@localhost
-sname的意思是“短名字”
5. 如果两个节点在不同的机器运行,为了确保两个节点能够通讯,在启动erl时需要设置相同抽cookie:
 erl -name node1 -setcookie abc
 erl -name node2 -setcookie abc
   可以用erlang:set_cookie来修改一个节点的cookie值。
6. 另外,要确保两个机器上的代码版本相同。
 (1)可以配置代码服务器来保证版本的一致。
 (2)使用shell命令nl(Mod),这个操作会在所有互相连接的节点上加载模块Mod。
7. 可以通过命令net_adm:ping(Node)来测试节点间的连通性。
8. 如果需要在internet上的两台机器相互连接,需要:
 (1)确保4396端口的TCP和UDP的通信正常。Erlang系统中的epmd(Erlang Port Mapper Daemon)程序会使用这个端口。
 (2)选择分布式Erlang需要使用的一个端口或者一个端口范围(就是应用程序要用的端口),确保这些端口在防火墙上打开。
  erl -name ... -setcookie .. -kernel inet_dist_listen_min Min inet_dist_listen_max Max
  如果是一个端口,则Min=Max

9. 具有相同cookie而且彼此互相连接的节点集称为Erlang集群。

10. 分布式原语
 (1)在节点Node上创建一个进程。
 @spec spawn(Node, Fun) -> Pid
 @spec spawn(Node, Mod, Fun, ArgList) -> Pid
 @spec spawn_link(Node, Fun) -> Pid
 @spec spawn_link(Node, Mod, Fun, ArgList) -> Pid
 (2)强制断开一个节点的连接
 @spec disconnect_node(Node) -> bool() | ignored
 (3)监视:如果Flag为true,则打开监视,为false,关闭监视
 当监视打开时,当有Node加入或离开erlag集群时,执行这个BIF的进程会收到{nodeup, Node}或{nodedown, Node}消息。
 @spec monitor_node(Node, Flag) -> true
 (4)Node查询
 @spec node() -> Node 返回本地节点的名字
 @spec node(Arg) -> Node 返回Arg所指定的节点,Arg可以是一个PID,一个引用或者一个端口。如果本地节点不是分布式的,就会返回nonode@nohost
 @spec nodes() -> [Node] 返回网络上与当前节点连接的所有其它节点列表
 @spec is_alive -> bool() 如果本地节点状态正常而且是分布式系统的一部分,返回true,否则返回false。
 (5)发送消息
 {RegName, Node} ! Msg 向Node节点上名为RegName的注册进程发送消息Msg。

11. 分布式编程中使用的库:rpc和global

12. 设置和保护cookie
方法1:让不同的机器的$HOME/.erlang.cookie文件内容相同,并将其设置读写保护
方法2:启动erlang时用setcookie选项,这种方法不是很安全,因为可以在操作系统中通过ps命令看到。
方法3:使用BIF erlang:set_cookie(node(), C)把本地节点的cookie设置为原子C。

13. 在分布式的erlang中,会话是不加密的,但可以将它设定在一个加密的信道里运行。

14. lib_chan的用法:
(1)先写配置文件:
 {port, NNNN} %% NNNN为服务器侦听的TCP端口
 {service, S, password, P, mfa, Mod, Func, ArgS} %% S为服务名称,P为应用服务时的密码
(2)做一个模块Mod,其中有一个函数Func,它接收3个参数,(MM, ArgsC, ArgS),在调用lib_chan:start_server的时候会调用它,所以它应该是一个不退出的函数。
(3)lib_chan:start_server()启动服务器
(4)从客户端{ok, Pid} = lib_chan:connect("localhost", 1234, S, P, ArgC). 返回的Pid是客户端的代理进程的ID。
(5)从客户端发送消息,lib_chan:cast(Pid, X).客户端代理会将消息通过TCP连接发送到服务器代理。
(6)服务器代理(MM是这个服务器代理的Pid)收到后数据后,转换为消息{chan, MM, X}发给(2)所指的进程。
(7)如果连接关闭,(2)的进程会收到{chan_closed, MM}消息
(8)如果服务器想发消息给客户端,那么服务器只要执行MM!{send, X}
(9)如果服务器要主动断开,MM!close

《erlang程序设计》学习笔记-第3章 分布式编程的更多相关文章

  1. 《Erlang程序设计》学习笔记-第2章 并发编程

    http://blog.csdn.net/karl_max/article/details/3977860 1. 并发原语: (1) Pid = spawn(Fun) %% 创建一个新的并发进程,用于 ...

  2. JavaScript高级程序设计学习笔记第三章--基本概念

    一.标识符: 1.区分大小写 2.命名规则: 第一个字符必须是一个字母.下划线(_)或一个美元符号($) 其他字符可以是字母.下划线.美元符号或数字 标识符中的字母也可以包含扩展的 ASCII 或 U ...

  3. JavaScript高级程序设计学习笔记第十三章--事件

    事件冒泡: IE 的事件流,事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).例如: <!DOCTYPE html> <htm ...

  4. JavaScript高级程序设计学习笔记第十一章--DOM扩展

    1.对 DOM 的两个主要的扩展是 Selectors API(选择符 API)和 HTML5 2.Selectors API Level 1 的核心是两个方法: querySelector()和 q ...

  5. JavaScript高级程序设计学习笔记第六章--面向对象程序设计

    1.ECMAScript没有类的概念,ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”,有点类似于散列表 2.ECMAScript 中有两种属性:数据属性和访问 ...

  6. JavaScript高级程序设计学习笔记第五章--引用类型(函数部分)

    四.Function类型: 1.函数定义的方法: 函数声明:function sum (num1, num2) {return num1 + num2;} 函数表达式:var sum = functi ...

  7. JavaScript高级程序设计学习笔记第五章--引用类型

    一.object类型 1.创建object类型的两种方式: 第一种,使用构造函数 var person = new Object();或者是var person={};/与new Object()等价 ...

  8. JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题

    1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...

  9. Java程序设计学习笔记(六) — 网络编程

    时间:2016-5-8 02:03 --网络编程        网络传输实际上就是进行数据传输.    一.传输的步骤:        1.对对方IP地址进行定位.        2.将数据打包发送到 ...

随机推荐

  1. gerrit-申请id跟本地配置

    OpenID 是一个以用户为中心的数字身份识别框架,它具有开放.分散.自由等特性. 什么是gerrit? 看 了网上的介绍,感觉所谓的gerrit就是一个基于web实现代码管理的服务器.Gerrit ...

  2. Android实践 -- 设置系统日期时间和时区

    设置系统日期时间和时区 设置系统的日期时间和时区,需要 系统权限和系统签名,android:sharedUserId="android.uid.system" 需要在manifes ...

  3. Dcloud课程7 单例模式一般用在什么场景

    Dcloud课程7 单例模式一般用在什么场景 一.总结 一句话总结:连接数据库,这样就保证了和数据之间只有一个连接,从而能够不占用多余资源,这样就极大的减少了资源浪费,减少了mysql或者说服务器压力 ...

  4. __INLINE

  5. 《你不知道的JavaScript(上)》笔记——提升

    笔记摘自:<你不知道的JavaScript(上)>第3章 提升 1.包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理. 2.变量和函数声明从它们在代码中出现的位置被“移动”到了 ...

  6. 关于HEXO安装失败的解决方法

    目前国内npm源有问题:所以键入如下代码即可安装成功: npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm inst ...

  7. 2015,我的投资理财策略(股权众筹+P2P网贷+活期理财)

    纸币流行,尤其是当今中国的市场经济,纸币几乎是一直是贬值的,每个人的财富都在被不断地稀释,可能是被政府.如果你不注意保值增值,你就越来越穷.     当年的万元户,在今天看来就是一个笑话,其实不怎么好 ...

  8. Maven学习总结(17)——深入理解maven灵活的构建

    一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建.maven为了支持构建的灵活性,内置了三大特性,即:属性.profile和资源过滤. 1.maven属性 maven属性分6类 ...

  9. 如何获取用户的地理位置-浏览器地理位置(Geolocation)API 简介

    如何获取用户的地理位置-浏览器地理位置(Geolocation)API 简介 一.总结 一句话总结:Geolocation API(地理位置应用程序接口)提供了一个可以准确知道浏览器用户当前位置的方法 ...

  10. jquery-validate使用.md

    html <form id="s_form" class="form-horizontal" action="http://www.baidu. ...