Erlang 103 Erlang分布式编程.- 缺2~4

Outline

笔记系列

Erlang环境和顺序编程
Erlang并发编程
Erlang分布式编程
Yaws
Erlang/OTP

日期              变更说明

2014-11-23  A Outline
          A 1.1-1.2
2014-12-08  A 1.3

Agenda

0范围

节点和通信

基本分布式编程模块

empd进程

套接字编程

1 Erlang节点和通信

1.1节点

一个Erlang节点是已命名的(named)的正在运行的Erlang运行时系统(erts)。

多个节点可以运行在一台机器上,也可以运行在不同的机器上。之前的顺序编程、并发编程中示例实际上是在一个Erlang节点上运行的。

存活节点/可命名的节点:如果一个节点可以与其他节点通信。任何存活的节点都需要命名,命名有两种方式:

(1)短名字 erl -sname <sname>

sname在局域网中命名一个主机,已[email protected]给出,例:[email protected]

(2)长名字 erl -name <name>

name给出完整的主机IP地址,可以是[email protected],或[email protected](可DNS解析的主机名)。

长名字节点只能与长名字节点通信,短名字节点只能与短名字节点通信。

节点启动和信息

erl -[s]name <nodeName>

命名节点方式启动

net_kernel:start([‘[email protected]’]).

启动节点

net_kernel:stop().

停止当前节点

node().

查看当前节点

elrang:is_alive().

当前节点是否存活

1.2 节点通信

节点连通性测试

net_adm:ping(‘[email protected]’).

pang:不连通,pong:连通。

Cookie

每个节点在任意时刻只有一个cookie,共享同一值的节点可以通信。

启动时设置cookie

erl -sname foo -setcookie <cookieValue>

运行时设置cookie

erlang:set_cookie(node(), <cookieValue>).

局限性

分布式节点通过cookie与另一远程节点建立连接后,远程节点的拥有者获得本地节点运行者用户相同的权限。远程节点能够执行spawn(YourNode, os, cmd, [“rm -rf *”]).是任何人都不想看到的。故,cookie安全通信在封闭式系统中是足够的,但在开放式系统中需要融入其他的安全通信机制,可以考虑安全套接字等。

连接性建立和配置

只要分布式Erlang节点共享相同的cookie值,它们之间就可以通信。

Erlang运行时系统(erts)在第一次引用一个节点时,自动建立连接。自动建立连接可以是通过调用net_adm:ping/1或者发送一个消息到该节点注册的进程上来完成。

连接在一起的节点,信息是共享的,具有可传递性。

net_kernel进程

每个节点的net_kernel进程负责协调分布式Erlang节点之间的操作,例如:spawn/4会被net_kernel进程转换为消息发送到远程节点的net_kernel进程上、net_kernel进程处理cookie认证。很重要的一点:用户可以修改net_kernel进程以获得期望的行为。

自动建立的可传递的连接行为的覆盖方法有:使用net_kernel模块中的函数手动的控制连接、运行erl -connect_all false拒绝节点全局的相互连接。

隐藏节点

希望覆盖默认配置下所有节点互相连接行为,只在必要时建立与其他节点的连接的时候,可以考虑隐藏节点。

启动隐藏节点: erl -sname ‘nodeName’ -hidden。

手动建立节点连接:net_kernel:connect(NodeName).。

nodes/0不会返回隐藏节点,nodes(hidden)返回隐藏节点,nodes(connected)返回隐藏节点和非隐藏节点。

1.3 远程过程调用与本地调用的区别

?Sample: facserver/facclient[1]

facserver.erl

-module(facserver).

%% API
-export([start/0]).

%%%===================================================================
%%% API
%%%===================================================================
start() ->
    register(facserver, self()),
    facLoop().

%%%===================================================================
%%% Internal functions
%%%===================================================================
facLoop() ->
    receive
    {Pid, N} ->
        Pid ! {ok, fac(N)}
    end,
    facLoop().

fac(0) -> 1;
fac(1) -> 1;
fac(N) -> N * fac(N-1).

facclient.erl

-module(facclient).

%% API
-export([remote_call/2]).

%%%===================================================================
%%% API
%%%===================================================================

remote_call(Message, Node) ->
    {facserver, Node} ! {self(), Message}, %?向远程节点远程发送消息节点
    receive
    {ok, Result} ->
        Result
    end.
%%%===================================================================
%%% Internal functions
%%%===================================================================

运行示例

分布式系统是一个会因为另一个你甚至不知道其存在的计算机的错误,而导致你的计算机无法使用的系统。

—— Lesilie Lamport

远程过程调用与本地调用的本质区别在于:远程节点可能失效,无法调用期望的功能。故,需要在远程过程调用时添加一些“护卫”语句,以确保远程节点连接正常、远程节点失效时有机会优雅的继续处理。[1]中给出了三种常见的方法:超时(receive … after)、连接到远程节点进程(spawn_link/4)、监视远程节点进程(monitor_node(Node, Bool));有关细节可以参考Erlang随版本发布的文档。

2 基本分布式编程模块

2.1 erl模块

2.2 rpc模块

2.3 erlang模块

2.4 net_kernel模块

2.5 net_adm模块

3 empd进程

4 Erlang套接字编程

参考文献

[1] Cesarini F., Thompson S.著,慕尼黑Isar工作组 杨剑译.

Erlang编程指南.

北京: 机械工业出版社.2011.

[2] Armstrong J.著,牛化成 译.

Erlang程序设计(2).(Programming Erlang, Second Edition – Software for a Concurrent World).

北京: 人民邮电出版社.2014.

时间: 2024-10-17 09:37:36

Erlang 103 Erlang分布式编程.- 缺2~4的相关文章

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

http://blog.csdn.net/karl_max/article/details/3985382 1. erlang分布式编程的基本模型 (1) 分布式erlang:这种模型可以让我们在一个紧密耦合的计算机集群上编写程序. (2) 分布式erlang应用程序运行在一个可个这个进程的环境中.一个局域网的不同集群之间,但在同一个防火墙里面. (3) 基于套接字的分布式应用:使用TCP/IP套接字,我们可以编写运行在非信任环境中的分布式应用程序.2. 编写分布式程序的步骤: (1)先在一个非

erlang分布式编程模型

erlang分布式编程有两种模型 一.分布式erlang 运行在可信的网络环境中 1.rpc提供的远程过程调用 rpc:call(Node,Mode,Fun,Args) ->Result|{badrpc,Reason} 2.global里的函数可以用来在分布式系统里注册名称和加锁,以及维护一个全连接网络 spawn(Node,Fun) -> Pid spawn(Node,Mode,Fun,Args) ->Pid spawn_link(Node,Fun) -> Pid spawn_l

Erlang入门(三)——分布式编程

明天要回家一个星期了,好好休息下.今天找到别人翻译的Erlang编程手册,值的好好读一遍.    所谓分布式的Erlang应用是运行在一系列Erlang节点组成的网络之上.这样的系统的性质与单一节点上的Erlang系统并没有什么不同.分布式这是个“大词”,Erlang从语言原生角度支持分布式编程,相比于java简单不少.一.分布式机制下列的BIFs是用于分布式编程:spawn(Node, Mod, Func, Args)启动远程节点的一个进程 spawn_link(Node, Mod, Func

Erlang 102 Erlang并发编程 - should be done in 2014-11-09

笔记系列 Erlang环境和顺序编程Erlang并发编程Erlang分布式编程YawsErlang/OTP 日期              变更说明2014-11-02 A outline,1 Agenda 0 范围 Erlang的现实世界建模方式 Erlang进程创建 Erlang进程设计模式 Erlang进程错误处理 1 Erlang Concurrency Modeling Philosophy Armstrong在[2]中跳出程序语言在处理并发应用场景时洋洋洒洒的急迫性.跃跃欲试的一站式

Erlang 101 Erlang环境和顺序编程 - should done in 2014-10-26

笔记系列 Erlang环境和顺序编程 Erlang并发编程 Erlang分布式编程 Yaws Erlang/OTP 前言 拖了很久很久了,终于快忘的差不多了. Agenda 0 范围 环境 Erlang运行时环境.Emacs开发环境 顺序编程 数据结构 语法 1 Erlang环境搭建 Erlang website http://www.erlang.org/ 实践版本 otp_win32_R16B/erl5.10.1 安装路径记为ERLANG_HOME=D:/erl5.10.1 获取环境变量的方

[Erl_Question07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏

用Erlang久了,以为erlang做类似于As3,JS的图形化界面是绝对不可能的,多少次,多少次想用erlang做个炫酷的图形游戏.终于:折腾出来了结果:纯Erlang也可以做到! 因为以前接触过WxErlang,网上的资料又少,还好有wx : demo().神器,用了大约20小时的时间.代码在这里: Erlang 2048 github 欢迎大家一起玩! 框架基本流程 使用到的知识: 1. 图形化界面使用了wxErlang; 2.LAN联网使用到Erlang的分布节点互连:net_kerne

[Erlang 00124] Erlang Unicode 两三事 - 补遗

最近看了Erlang User Conference 2013上patrik分享的BRING UNICODE TO ERLANG!视频,这个分享很好的梳理了Erlang Unicode相关的问题,基本上把 Using Unicode in Erlang 讲解了一遍.再次学习了一下,整理成文字,补充一些 [Erlang 0062] Erlang Unicode 两三事 遗漏掉的内容. 视频在这里: http://www.youtube.com/watch?v=M6hPLCA0F-Y PDF在这里:

[Erlang 0129] Erlang 杂记 VI

把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM   P23 简单介绍了Erlang Compiler和Beam文件格式; The Erlang Compiler in short 章节提到了 Core Erlang 这个之前有提到过: [Erlang 0120] Know a little Core Erlang http://www.cnblogs.com/me-sa/p/know

[Erlang危机]Erlang In Danger 序言

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface?? Introduction On Running Software 运行时软件 There's something rather unique in Erlang in how it approaches failure compared to most other programming languages. There's this common way of thinkin