《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.将数据打包发送到 ...
随机推荐
- Android应用开发-广播和服务
广播 广播的概念 现实:电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件. Android系统 ...
- Font Awesome 图标如何使用
Font Awesome 图标如何使用 一.总结 一句话总结:Font Awesome字体图标非常好用,直接引入font-awesome.css,然后就可以直接使用了,使用的时候是用的i标签. 1.字 ...
- vue.js的基础与语法
Vue的实例 创建第一个实例: {{}} 被称之为插值表达式.可以用来进行文本插值. <!DOCTYPE html> <html lang="en"> &l ...
- [置顶]
WebService学习总结(3)——使用java JDK开发WebService
一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...
- HDU 1166 敌兵布阵 树状数组||线段树
http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...
- (转) 设置sqlplus中的退格键
转自:http://blog.itpub.net/26110315/viewspace-717249/ 有些时候当你使用sqlplus登录到数据库中的时候,敲错了命令想要删除修改的时候,发现以前敲入的 ...
- 1、移动端 2、后台 3、 移动端,Web 端 4、 PC端
移动端: 1.公众号:停开心 住总物业 2.app: iso Android 停开心,住总停开心 后台:停开心智慧停车管理平台(所有的停车场) 移动端,Web端: 海投OA,公司OA PC端:收费软 ...
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)
原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...
- 【习题 3-9 UVA - 10340】All in All
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 相当于让你判断s1是不是s2的子序列. for一遍就好 [代码] #include <bits/stdc++.h> us ...
- 百度糯米iOSclient登录BUG
环境 设备:iphone5s 网络:WIFI App版本号: 操作步骤 1.进入登录界面 2.输入手机号 3.点击[获取验证码],等待接收验证码后 4.点击[X]退出登录界面 5.反复1-2-3,提示 ...