《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.将数据打包发送到 ...
随机推荐
- Vue 自定义全局消息框组件
消息弹框组件,默认3秒后自动关闭,可设置info/success/warning/error类型 效果图: 文件目录: Message.vue <template> <transit ...
- scrapy-加蘑菇代理
加代理ip 隧道代理 setting中 解开 下载器
- 在CentOS7 开发与部署 asp.net core app笔记
原文:在CentOS7 开发与部署 asp.net core app笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lihongzhai/art ...
- amazeui学习笔记--css(常用组件14)--缩略图Thumbnail
amazeui学习笔记--css(常用组件14)--缩略图Thumbnail 一.总结 1.基本样式:在 <img> 添加 .am-thumbnail 类:也可以在 <img> ...
- 详解javascript的深拷贝与浅拷贝
1. 认识深拷贝和浅拷贝 javascript中一般有按值传递和按引用传递两种复制,按值传递的是基本数据类型(Number,String,Boolean,Null,Undefined),一般存放于内存 ...
- Day2:列表、元组
一.列表 1.定义与访问元素(按索引) #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan list_a = [&quo ...
- SVN—怎样安装SVNclient软件
一.怎样安装TortoiseSVN-1.7.12.24070-win32-svn-1.7.9版本号的SVNclient软件: a.下载TortoiseSVN-1.7.12 ...
- boost 库编译选项
boost大部分库仅仅须要包括头文件就可以使用,而有部分须要编译的.例如以下: E:\Qt\Qt3rdlib\boost_1_58_0>bjam --show-libraries The fol ...
- apache-spark导入eclipse环境
工作中用到了apache-spark,想深入了解一下,决定从源码开始. 先导入到常用的ide,eclipse吧: 准备工作 1. 下载Eclipse:http://scala-ide.org/ 2. ...
- [TypeScript] Creating a Class in TypeScript
Typescript classes make traditional object oriented programming easier to read and write. In this le ...