《erlang程序设计》学习笔记-第3章 分布式编程

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

posted @ 2015-04-03 17:04  die  阅读(330)  评论(0编辑  收藏  举报