`
cwqcwk1
  • 浏览: 86873 次
文章分类
社区版块
存档分类
最新评论

erlang节点通讯例子及问题分析

 
阅读更多

分布式是erlang的三大特性之一,都说erlang分布式,最简单最直接的应用就是节点通讯。

问题来了,怎么节点通讯,节点连接可能很多人知道,如何在两个节点连接后进行本地与远程通信?这就是本篇所讲的内容。

下面是示例代码,完成2个节点的通讯:

A节点的代码:

-module(server_demo).
-export([start/0, rpc_call/2]).

start() ->
   Pid = spawn(fun() -> server_loop() end),
   register(demo, Pid), %%注册进程名字
   ok.

server_loop() ->
   receive
      {msg, Pid, Msg} ->
         io:format("receive msg ~p from pid ~p~n",[Msg, Pid]);
      {rpc, Pid, Msg} ->
         io:format("receive rpc ~p from pid ~p~n",[Msg, Pid])
   end,
   server_loop().
	
rpc_call(Pid, Msg) ->
   demo ! {rpc, Pid, Msg}.	
启动A节点:
erl -s server_demo start -hidden -name server@127.0.0.1 -setcookie 123456


B节点的代码:
-module(client_demo).
-export([start/0]).

start() ->
   ServerNode = 'server@127.0.0.1',
   case net_kernel:connect(ServerNode) of
      true ->
         io:format("connect server success!"),
         %% 第一种通信方式:发信息
         {demo, ServerNode} ! {msg, self(), "hello world!"},
         %% 第二种通信方式:远程调用
         rpc:call(ServerNode, demo, rpc_call, [self(), "hello2!"]),
         ok;
     _ ->
         io:format("connect server fail!")
   end,
   ok.
启动B节点:
erl -s client_demo start -hidden -name client@127.0.0.1 -setcookie 123456

例子到这里就可以了,下面说说其中的erlang节点通讯的一些细则。

erlang节点通讯在实现上对用户是透明的,无需关心节点的内部连接和消息封包。通讯时节点是利用名字来识别,而进程也可以通过pid来识别。本地进程和远程进程可以无差别的使用消息的机制通信,这是erlang做的最为理想的地方。

很多人刚接触erlang节点通讯在强调性能性能,说erlang节点通讯没有socket通讯效率高。个人觉得,用起来爽,并且稳定性高更为重要,一定要自己用socket实现的场合很少,真到那时候,思考的问题或许就是,要不要用erlang的问题了。


erlang节点无法连接问题?

主要有3个:cookie、名字和版本问题

Cookie

erlang节点集群受到cookie保护,每个节点都有自己的cookie,而且任何节点要互联,必须保证是相同的cookie。所以,cookie像是一种授权认证,拥有许可的节点才能连接到erlang集群。

节点设置cookie有以下几种方式:
1. 启动erlang时,带启动参数-setcookie 123456 将cookie设为123456
2. 启动erlang时不带启动参数,取默认cookie,存在~/.erlang.cookie文件
3. 启动erlang后,使用erlang:set_cookie(123456) 修改cookie为123456

名字

erlang节点是利用名字来识别,不允许相同名字的节点加入集群。

节点设置名字有以下2种方式:
1. 启动erlang时,带启动参数-name node_1@127.0.0.1 将名字设为node_1@127.0.0.1
2. 启动erlang后,使用net_kernel:start(['node_1@127.0.0.1',longnames]).设置节点名字

版本

erlang允许不同操作系统的erlang节点进行互联,但是不允许主版本不同的erlang节点进行连接。比如说erlang R16不能与erlang R17互联。


这里暂时只讨论cookie和版本、名字问题,以后有补充再更新。

参考:http://blog.csdn.net/mycwq/article/details/40376269

分享到:
评论

相关推荐

    Erlang与C构建的节点通讯完整例子

    Windows下Erlang与C构建的节点通讯完整例子,包含cnode工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/40836273

    erlang节点连通测试

    在分布式环境中,网络问题可能导致节点断开连接。Erlang提供了一套完整的错误处理和故障恢复机制,包括监控节点状态、心跳检测、消息重试等。合理利用这些机制,可以确保即使在网络不稳定时,也能保持节点间的可靠...

    erlang 连接学习例子

    在这个“erlang 连接学习例子”中,我们有两个核心文件:`server.erl` 和 `client.erl`,它们分别代表了一个服务器进程和客户端进程,展示了Erlang中进程间的通信机制。 `server.erl` 文件通常包含一个持续运行的...

    erlang启动多节点,跨节点调用函数

    1.完成makefile,直接运行/...2.完成启动多节点的脚本,运行/script目录中的run.cmd可以启动3个节点, 节点的配置在/config目录config.txt中 3.完成跨节点函数的调用,记录日志都会在gm节点中执行 4.完成日志记录系统

    erlang程序设计相关例子程序

    通过对这些文件名的分析,我们可以看出这些Erlang程序涵盖了并发处理、进程通信、异常处理、服务器设计、数据处理和测试等多个方面,体现了Erlang在构建分布式系统中的强大功能。学习并理解这些示例,对于深入掌握...

    基于Erlang的即时通讯系统的设计与实现_黄明.caj

    基于Erlang的即时通讯系统的设计与实现

    在erlang项目中使用protobuf例子

    标题中的“在erlang项目中使用protobuf例子”指的是在Erlang编程环境中使用Protocol Buffers(protobuf)这一数据序列化工具。protobuf是由Google开发的一种高效、跨语言的数据表示和序列化格式,它允许开发者定义...

    erlang-ffi:与Haskell的Erlang节点通信

    讲出Erlang网络协议并模拟网络上的Erlang节点。 完全能够与Erlang进行双向通信。 在合理范围内,Erlang类型已映射到Haskell类型。 发给Erlang的消息只是Haskell中的函数调用,而来自Erlang的消息则传递到MVars。 ...

    Pyrlang:在Python 3.5+中实现的Erlang节点(基于Asyncio)

    Pyrlang-Python中的Erlang节点这是Python 3.5中的嵌入式Erlang节点实现,实现了网络Erlang节点协议。 它旨在允许现有的Python项目与BEAM语言(Erlang,Elixir,Alpaca,Luaerl,LFE,Clojerl等)之间进行互操作。 仅...

    Erlang/OTP Application完整例子

    Erlang/OTP Application完整例子,含代码和二进制,对于学习Erlang/OTP Application很有帮助。 配套文章http://blog.csdn.net/mycwq/article/details/12610677

    Erlang深度分析

    调试是软件开发中不可或缺的环节,Erlang提供了许多强大的调试工具,例如Erlang的crash dump分析工具、snooper消息监听器等,它们帮助开发者在开发和测试阶段快速定位和解决问题。 #### 4. 并发与网络 ##### 4.1 ...

    Windows下使用NIF扩展Erlang完整例子

    Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485

    erlang深度分析.pdf

    ### Erlang深度分析知识点 #### 1. Erlang VM分析 Erlang的虚拟机(VM)即Erlang Runtime System(ERTS),是Erlang系统运行的基础。它支持轻量级进程,提供了高效的并发处理能力。在性能方面,ERTS经过优化,能够...

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    mule-erlang-transport:一个 Mule 传输器,可以向 Erlang 节点发送消息和从 Erlang 节点接收消息

    骡子郎运输 可以向 Erlang 节点发送消息和从 Erlang 节点接收消息的传输。先决条件必须在要使用此传输的主机上安装 Erlang R13B01 或更高版本。在使用 Erlang 传输之前必须在启动 Erlang 连接器之前运行。 如果你有...

    ainterface:在Akka的ActorSystem上运行Erlang节点

    在Akka中运行Erlang节点,首先需要理解Erlang节点的概念。Erlang节点是Erlang虚拟机的一个实例,可以分布在不同的机器上,通过网络进行通信。Erlang节点之间通过分布式协议进行交互,允许数据共享和进程间通信。 ...

    Erlang程序设计及源码

    通过网络,Erlang节点可以相互通信,形成一个集群,共同处理任务,实现高可扩展性。 6. **BEAM虚拟机** Erlang运行在专为其设计的BEAM虚拟机上,BEAM负责执行Erlang字节码,并管理进程和内存。BEAM的内存管理策略...

    Erlang_CNode用户指

    5. **错误处理和调试**:讨论在CNode中处理Erlang错误和异常的方法,以及如何利用Erlang的调试工具来排查问题。 6. **性能优化**:提供关于如何最大限度地提高CNode与Erlang节点之间通信效率的提示和最佳实践。 7....

Global site tag (gtag.js) - Google Analytics