《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
《erlang程序设计》学习笔记-第3章 分布式编程的更多相关文章
- 《Erlang程序设计》学习笔记-第2章 并发编程
http://blog.csdn.net/karl_max/article/details/3977860 1. 并发原语: (1) Pid = spawn(Fun) %% 创建一个新的并发进程,用于 ...
- JavaScript高级程序设计学习笔记第三章--基本概念
一.标识符: 1.区分大小写 2.命名规则: 第一个字符必须是一个字母.下划线(_)或一个美元符号($) 其他字符可以是字母.下划线.美元符号或数字 标识符中的字母也可以包含扩展的 ASCII 或 U ...
- JavaScript高级程序设计学习笔记第十三章--事件
事件冒泡: IE 的事件流,事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).例如: <!DOCTYPE html> <htm ...
- JavaScript高级程序设计学习笔记第十一章--DOM扩展
1.对 DOM 的两个主要的扩展是 Selectors API(选择符 API)和 HTML5 2.Selectors API Level 1 的核心是两个方法: querySelector()和 q ...
- JavaScript高级程序设计学习笔记第六章--面向对象程序设计
1.ECMAScript没有类的概念,ECMA-262 把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数.”,有点类似于散列表 2.ECMAScript 中有两种属性:数据属性和访问 ...
- JavaScript高级程序设计学习笔记第五章--引用类型(函数部分)
四.Function类型: 1.函数定义的方法: 函数声明:function sum (num1, num2) {return num1 + num2;} 函数表达式:var sum = functi ...
- JavaScript高级程序设计学习笔记第五章--引用类型
一.object类型 1.创建object类型的两种方式: 第一种,使用构造函数 var person = new Object();或者是var person={};/与new Object()等价 ...
- JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题
1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...
- Java程序设计学习笔记(六) — 网络编程
时间:2016-5-8 02:03 --网络编程 网络传输实际上就是进行数据传输. 一.传输的步骤: 1.对对方IP地址进行定位. 2.将数据打包发送到 ...
随机推荐
- 1.2 Use Cases中 Commit Log官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Commit Log 提交日志 Kafka can serve as a kind ...
- ES5, ES6, ES2016, ES.Next: JavaScript 的版本是怎么回事?
原网址:http://huangxuan.me/2015/09/22/js-version/ JavaScript 有着很奇怪的命名史. 1995 年,它作为网景浏览器(Netscape Naviga ...
- 深拷贝&浅拷贝
1.区别 浅拷贝:只拷贝了基本数据类型,引用数据类型只复制了引用,没有复制实体. 深拷贝:拷贝所有的层级属性 2.浅拷贝 (1) 直接赋值 拷贝之后,所有层级属性仍然公用了地址,会被影响 var a ...
- MySQL和SqlServer的区别
一.查看表结构数量等mysql语句: -- 查看系统内所有数据库 show databases: -- 查询数据库内所有表 show tables; -- 显示表结构 desc 表名; sql ser ...
- 前端切图|点击按钮div变色
<!DOCTYPE html> <html> <head> <title>点击按钮div变色.html</title> <meta c ...
- VC6.0调试知识大全
VC6.0调试知识大全 分类: C++ 2010-09-06 21:33 7080人阅读 评论(5) 收藏 举报 debuggingmfcfunctionmenumicrosoftdll My Not ...
- VIP的转移
首先查看vip在各个节点的状态 [root@rac2 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:27:C9:28:D0 inet addr: ...
- Excel Add-in
Excel Add-in 前言 这个系列文章应该有一阵子没有更新了,原因是一如既往的多,但是根本所在是我对于某些章节其实还没有完全想好怎么写,尤其是对于Office Add-in这块 —— 到底是要每 ...
- 16.用Spring Boot颠覆Java应用开发
转自:https://www.cnblogs.com/aishangJava/p/5971288.html Java开发概述: 使用Java做Web应用开发已经有近20年的历史了,从最初的Servle ...
- 第一个Python程序(全面)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.Windows系统 1.编写Python程序方式之Sublime文本编辑器: 1>打开sublime,创建hello.p ...