`
solingye
  • 浏览: 20067 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang分布式

阅读更多
分布式erlang的核心概念是节点,包含了地址空间和独立进程集的完整虚拟机。

访问单个节点或节点集都受到cookie保护,每个节点都有自己的cookie,而且必须保证所有要和这个节点通信的其他节点有相同的cookie,为此,在一个分布式系统中,所有的节点必须用相同的magic cookie来启动。具有相同cookie而且彼此互相连接的节点集称为erlang集群。
三种方法来设置cookie:
1.把相同的cookie存放在$HOME/.erlang.cookie文件中。
2.在启动erlang时,带上命令行参数-setcookie C把cookie设置为C。
3.使用erlang:set_cookie(C)把本地节点的cookie设置为C

事例:名字服务
-module(kvs).
-compile(export_all).

start() ->
    register(kvs,spawn(fun() -> loop() end)).

store(Key,Value) ->
    rpc({store,Key,Value}).

loopup(Key) ->
    rpc({loopup,Key}).

rpc(Q) ->
    kvs ! {self(),Q},
    receive
        {kvs,Reply} ->
            Reply
    end.

loop() ->
    receive
        {From,{store,Key,Value}} ->
            put(Key,{ok,Value}),
            From ! {kvs,true},
            loop();
        {From,{loopup,Key}} ->
             From ! {kvs,get(Key)},
             loop()
     end.


本地测试:
kvs:start().
kvs:store(aaa,”aaa”).
kvs:loopup(aaa).


在同一台机器上运行两个节点测试:
erl –sname a //命令行启动erlang,-sname表示启动一个名字为a的节点
kvs:start(). //在a节点上启动服务
erl  -sname b //启动一个名字为b的节点
rpc:call(a@LBWin7,kvs,store,[aaa,"aaa"]). //在b节点上远程调用服务
rpc:call(a@Lbwin7,kvs,loopup,[aaa]).

函数rpc:call(Node,Mod,Fun,[Arg1,Arg2…]):在Node节点上执行一个远程调用,被调用的函数是Mod:Func(Arg1,Arg2…)

spawn(Node,Fun) -> Pid:在Node节点上创建一个进程。
spawn(Node,Mod,Fun,Args) -> Pid:在一个节点上创建一个会执行apply(Mod,Fun,Args)的新进程。
disconnect_node(Node) ->bool()|ignored:强制断开一个节点的连接。
monitor_node(Node,Flag) ->true:如果Flag为true就打开监视,如果Flag为false就会关闭监视,在监视被打开时若有新的Node加入或者离开erlang集群,执行这个BIF的进程就会接收到{nodeup,Node}和{nodedown,Node}消息。
node() -> Node:返回本地节点的名字。如果本地节点不是分布式的,就会返nonode@nohost.
node(Arg) -> Node:返回Arg所指定的节点,Arg可以是一个Pid,一个引用或者一个端口。如果本地节点不是分布式的,就会返回nonode@nohost.
nodes() -> [Node]:返回网络上与当前节点连接的所有其他节点列表。
is_alive() ->bool():如果本地节点状态正式而且是一个分布式系统的一部分,那么返回true,否则返回false.

我们可以使用send原语来向一个分布式的erlang节点集中注册的进程发送消息.
{RegName,Node} ! Msg.
向节点Node上名为RegName的注册进程发送消息Msg.


一个启动远程进程的例子:
-module(dist_demo).
-export([rpc/4,start/1]).
start(Node) ->
   spawn(Node,fun()->loop() end).

rpc(Pid,M,F,A) ->
   Pid ! {rpc,self(),M,F,A},
   receive
       {Pid,Response} -> Response
   end.

loop() ->
  receive
     {rpc,Pid,M,F,A} ->
        Pid ! {self(), (catch apply(M,F,A))},
        loop()
  end.

启动两个节点:
erl –sname a
erl –sname b

在a节点上启动一个运行在b节点上的进程:
Pid = dist_demo:start(b@LBWin7).
dist_demo:rpc(Pid,erlang,node,[]). 
//这里我们在远程节点上对erlang:node()求值,然后返回运算结果。


分布式编程使用到的lib:
rpc模块提供了一系列的远程调用服务。
global模块提供了名称注册函数和分布式系统中的锁定功能,还有完整的网络连接维护函数。
详情参考官方文档。

rpc模块最为常用的函数:
call(Node,Mod,Fun,Args) -> Result|{badrpc,Reason}
这个函数会在Node节点上对apply(Mod,Fun,Args)进行求值并且返回Result或者在调用失败时返回{badrpc,Reason}.


基于套接字的分布式模型:
在一个不安全的网络环境中,我们使用一种受限的进程创建模式,在这种模式下,特定机器的拥有者有显示的控制权来控制什么能在他们自己的机器上运行。

lib_chan:lib_chan是一个允许一个用户显示的控制他自己的机器能够启动哪些模块进程。
主要接口有:
start_server() -> true:这个函数在本地主机上启动一个服务,这个服务器的行为取决于文件$HOME/.erlang/lib_chan.conf中的配置。
start_server(Conf) -> true.:这个函数在本地主机上启动一个服务器,其行为取决于文件Conf的内容。
配置文件是一个包含了一系列元祖的文件,格式如下:
{port,NNNN} //告诉服务器监听的端口号为NNNN
{service,S,password,P,mfa,SomeMod,SomeFun,SomeArg}
//这个配置定义了一个由密码P保护的服务S
//如果服务启动,那么由SomeMod:SomeFun(MM,ArgsC,SomeArgs)创建的进程处理来自客户
//端的消息,这里MM是代理进程的Pid,这个代理进程通常用来向客户机发送消息,参数//ArgsC则是来自客户端的调用参数。

connect(Host,Port,S,P,ArgsC) -> {ok,Pid} | {error,Why}:尝试在主机Host上打开端口Port,然后尝试激活由密码P保护的服务S,如果密码正确,则返回{ok,Pid},其中Pid是向服务器发送消息的代理进程的进程标识。当客户端调用这个函数来发起一个连接时,就会创建两个代理进程,一个在客户端,一个在服务端,这两个代理进程负责把erlang消息处理为TCP数据包,并且负责捕获来自控制进程的退出信号和套接字消息。

事例:把lib_chan和kvs整合在一起。
首先编写配置文件:
{port,1234}.
{service,nameServer,password,"123456",mfa,mod_name_server,start_me_up,notUsed}

这个配置文件的意思是我们准备在机器上1234端口启动一个名为nameServer的服务,并且使用密码123456把服务保护起来。
-module(mod_name_server).
-compile(export_all).

start_me_up(MM,_ArgC,_ArgS) ->
    loop(MM).

loop(MM) ->
    receive
        {chan,MM,{store,K,V}} ->
           {chan,MM,{store,K,V}} ->
            kvs:store(K,V),
            loop(MM);
           {chan,MM,{loopup,K}} ->
            MM ! {send,kvs:loopup(K)},
            loop(MM);
           {chan_closed,MM} ->
            true
    end.

mod_name_server的协议如下:
如果客户端向服务器发送一个消息{send,X},那么它就会在mod_name_server中转换成形如{chan,MM,X}的消息(MM是服务器代理进程的Pid)。
如果客户端停止或者套接字因为某种原因终止通信并且关闭,那么服务器就会收到形如{chan_closed,MM}的消息。
如果服务器想要发送消息X给客户端,服务器只需要调用MM!{send,X}。
如果服务器想要显示的关闭连接,那么服务器只要执行M!close。
这份协议是客户端和服务器两端的代码都必须遵守的中间协议。

分享到:
评论

相关推荐

    erlang分布式 XMPP Server.ppt

    总的来说,Erlang分布式XMPP服务器利用其强大的分布式特性、丰富的扩展机制和成熟的开源社区,为构建高效、可扩展的即时通讯服务提供了坚实的基础,尤其在结合Web和移动设备的场景下,展现出巨大的潜力。

    EdpBench:Erlang 分布式协议 (EDP) 基准

    Erlang分布式协议基准这是一个基准生成器,用于测量 Erlang 和 Java 节点之间的消息和字节传输速率。 它使用网络上的和包来创建 Java 节点,该节点知道 Erlang 端口映射器( )、数据类型及其分布式协议。基准为了...

    Erlang分布式节点中的注册进程使用实例

    Erlang是一种基于actor模型的并发编程语言,它被设计用于构建并发性、容错性强的分布式系统。在Erlang系统中,多个运行Erlang虚拟机的节点可以连接成一个分布式网络,节点之间可以相互通信。Erlang节点间的通信可以...

    编写分布式的Erlang程序:陷阱和对策

    这里提到的陷阱主要指的是在开发分布式Erlang程序时可能会遇到的问题,这些问题往往由于开发者对Erlang分布式的某些特性的理解不足而产生。以下是一些具体的陷阱: 1. **消息传递的顺序性**:虽然Erlang提供了消息...

    erlang 深度分析

    Erlang分布式核心技术浅析 - **关键技术**: - **节点间通信**: 通过分布协议实现节点间的高效数据交换。 - **故障恢复**: 利用监控和链接机制来检测和处理故障。 - **集群管理**: 支持节点动态加入和离开。 - **...

    erlang深度分析中文版(业余研究)

    4. **Erlang分布式协议格式**:书中详细解析了Erlang的分布式协议,即dist protocol,这是Erlang节点间通信的基础,包括连接建立、心跳维护和数据传输的细节。 5. **erts运行期内存使用情况查看**:erts是Erlang...

    编写分布式的Erlang程序_陷阱和对策(中文版)

    阅读此书将有助于深化对Erlang分布式编程的理解,避免常见的错误,提升编写高质量Erlang程序的能力。同时,"打开方式.htm"可能是阅读资料的指南,而"爱书吧-全国最大图书-课件免费下载.url"则可能指向更多相关的学习...

    Python-inetsshdist一个运行在ssh上的Erlang发行版网络协议

    `Python-inetsshdist` 是一个独特的项目,它允许Erlang节点通过安全的Shell (SSH) 协议进行通信,从而扩展了Erlang分布式计算的能力。Erlang是一种面向并发的编程语言,其分布式特性使得在多节点间进行高效、可靠的...

    erlang学习4.pdf

    ### Erlang分布式调用与TableServer支持详解 #### 前言 Erlang作为一种专为构建高并发、高可用性系统而设计的编程语言,其核心特性之一就是强大的分布式处理能力。本篇文档旨在深入解析Erlang的分布式调用机制及...

    Erlang脚本及其在分布式系统中的应用

    Erlang是一种专为构建可扩展、并发和分布式系统而设计的编程语言。它最初由爱立信公司开发,用于电信领域的软件开发。Erlang的设计理念包括轻量级进程、消息传递、容错性和分布式计算,这些特性使得Erlang非常适合...

    erlang节点连通测试

    节点之间可以进行通信,这是Erlang分布式计算的基础。现在我们来深入探讨如何进行Erlang节点的连通测试以及如何在需要通信时建立连接。 ### 1. Erlang节点的连接原理 在Erlang中,节点之间的连接是基于TCP/IP协议...

    RabbitMQ实战高效部署分布式消息队列.pdf+rabbitmq学习手册.pdf

    - **高可用集群**:通过Erlang分布式的特性,实现无单点故障的集群。 - **网络分区容错**:使用 Federation 插件和 Shovel 插件进行跨集群的消息传递,应对网络分区问题。 4. **分布式消息队列的高效部署** - *...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、容错性和可扩展性的分布式系统。OTP则是Erlang生态系统的核心组成部分,提供了大量的库和设计模式,旨在简化并发、错误处理和系统管理。 ...

    图书:Erlang和OTP实战

    这本书深入浅出地介绍了Erlang在分布式系统、并发处理以及高可用性设计中的应用,同时结合 OTP 提供了强大的工具和库支持。通过阅读此书,读者可以掌握如何利用Erlang和OTP构建高效、容错的实时系统。 Erlang是一种...

    otp_src_24.0.tar.gz

    总的来说,"otp_src_24.0.tar.gz"是一个包含了Erlang OTP库的源代码包,版本24.0,对于RabbitMQ开发者或者对Erlang分布式系统有兴趣的学习者来说,这是一个宝贵的资源。通过学习和研究这个源码,我们可以深入理解...

    Erlang生态的分布式Pythonpy.zip

    py 是为 Erlang 生态系统准备的分布式 Python。该项目有两个主要特性: Python 的简单封装接口,封装了 ErlPort 调用,可方便的进行: Make module-level calls Get module-level constants Instantiate ...

    RabbitMQ用户手册

    如果你在同一台机器上运行多个 RabbitMQ 节点,每个节点的 RABBITMQ_NODENAME 必须是唯一的,以确保每个节点都能在 Erlang 的分布式网络中正确识别和通信。 4. **RABBITMQ_NODE_IP_ADDRESS**: 该环境变量允许你指定...

    Node.js-Clusterluck-以node.js编写的类似于erlang的分散式分布式系统的库

    而 Clusterluck 是一个专为 Node.js 设计的库,它的目标是模仿 Erlang 语言的某些特性,尤其是其在分布式系统中的强大功能。 Erlang 是一种为构建大规模并发系统而设计的编程语言,它以其轻量级进程、消息传递和...

    scalang:Scalang是一个scala包装器,可以轻松编写与erlang交互的服务

    Scalang包含Erlang分布式节点协议的完整实现。 它提供了一个面向参与者的API ,该API可用于以惯用的,符合OTP的方式与Erlang节点进行交互。 Scalang基于Netty构建其网络层,基于Jetlang构建其actor。 安装 从Maven...

Global site tag (gtag.js) - Google Analytics