erlang分布式开发中遇到的一些问题

Erlang开发心得001 1. 前言 新项目采用Erlang进行开发,从学习到开发功能已经有两个月,在此写下自己对这门语言的一些使用感受 2. 优点 ①. 由于天生支持分布式,不同Erlang进程间的同步异步通信非常方便,而且数据不需要做任何转换. ②. 自带的数据结构简单,掌握list,dict,tuple,record即可满足开发. 而且list和dict提供了比较主要的api函数,基本可以实现大部分需求. ③. ... 阅读详情

1、关于rpc

先上现象,如下:

erl -name a@192.168.35.147
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V6.0  (abort with ^G)
(a@192.168.35.147)1> net_kernel:connect('b@192.168.35.147').
true
(a@192.168.35.147)2> nodes().
['b@192.168.35.147']
(a@192.168.35.147)3> rpc:call('b@192.168.35.147', ets, new, [nimeizi, [named_table, public]]).
nimeizi

erl -name b@192.168.35.147
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V6.0  (abort with ^G)
(b@192.168.35.147)1> nodes().
['a@192.168.35.147']
(b@192.168.35.147)2> ets:info(nimeizi).
undefined

如上图所示,两个连接上的节点a和b,a节点使用远程调用rpc:call/4创建ets表,并且得到执行成功的返回结果,但是在b节点没有该ets表,文档中对rpc:call/4描述为: Evaluates  apply(Module, Function, Args)  on the node  Node  and returns the corresponding value  Res , or  {badrpc, Reason}  if the call fails. 查看源码rpc.erl,如下:

call(N,M,F,A) when node() =:= N ->  %% Optimize local call
    local_call(M, F, A);
call(N,M,F,A) ->
    do_call(N, {call,M,F,A,group_leader()}, infinity).

do_call(Node, Request, infinity) ->
    rpc_check(catch gen_server:call({?NAME,Node}, Request, infinity));
do_call(Node, Request, Timeout) ->
    Tag = make_ref(),
    {Receiver,Mref} =
	erlang:spawn_monitor(
	  fun() ->
		  %% Middleman process. Should be unsensitive to regular
		  %% exit signals.
		  process_flag(trap_exit, true),
		  Result = gen_server:call({?NAME,Node}, Request, Timeout),
		  exit({self(),Tag,Result})
	  end),
    receive
	{'DOWN',Mref,_,_,{Receiver,Tag,Result}} ->
	    rpc_check(Result);
	{'DOWN',Mref,_,_,Reason} ->
	    %% The middleman code failed. Or someone did 
	    %% exit(_, kill) on the middleman process => Reason==killed
	    rpc_check_t({'EXIT',Reason})
    end.

rpc_check_t({'EXIT', {timeout,_}}) -> {badrpc, timeout};
rpc_check_t(X) -> rpc_check(X).
	    
rpc_check({'EXIT', {{nodedown,_},_}}) -> {badrpc, nodedown};
rpc_check({'EXIT', X}) -> exit(X);
rpc_check(X) -> X.

handle_call({call, Mod, Fun, Args, Gleader}, To, S) ->
    handle_call_call(Mod, Fun, Args, Gleader, To, S);

handle_call_call(Mod, Fun, Args, Gleader, To, S) ->
    RpcServer = self(),
    %% Spawn not to block the rpc server.
    {Caller,_} =
	erlang:spawn_monitor(
	  fun () ->
		  set_group_leader(Gleader),
		  Reply = 
		      %% in case some sucker rex'es 
		      %% something that throws
		      case catch apply(Mod, Fun, Args) of
			  {'EXIT', _} = Exit ->
			      {badrpc, Exit};
			  Result ->
			      Result
		      end,
		  RpcServer ! {self(), {reply, Reply}}
	  end),
    {noreply, gb_trees:insert(Caller, To, S)}.

可以看到,当rpc:call/4被调用时,spwan了一个新进程来执行apply(M, F, A),并且把执行结果返回,随后该进程结束,所以类似于ets:new/2这种操作随着该进程结束后ets表也被删除了,有没有解决的办法?看文档中另一个方法rpc:block_call/4,描述如下: Like  call/4 , but the RPC server at  Node  does not create a separate process to handle the call. Thus, this function can be used if the intention of the call is to block the RPC server from any other incoming requests until the request has been handled. The function can also be used for efficiency reasons when very small fast functions are evaluated, for example BIFs that are guaranteed not to suspend.

结论:1、erlang的文档有些描述十分简单,需要和其他描述联合起来查看;2、源码是很好的工具。

2、epmd

C:\Users\pyfn1100>erl -name b@192.168.35.142 -setcookie 123456
Eshell V6.1  (abort with ^G)
(b@192.168.35.142)1> net_kernel:connect('a@192.168.35.147').
false

erl -name a@192.168.35.147 -setcookie 123456
Erlang/OTP 17 [erts-6.0] [source] [64-bit] [smp:2:2] [async-threads:10] [kernel-poll:false]

Eshell V6.0  (abort with ^G)
(a@192.168.35.147)1> net_kernel:connect('b@192.168.35.142').
true
(a@192.168.35.147)2> nodes().
['b@192.168.35.142']

如图所示,b节点在windows上,a节点在linux上,b节点连接a失败,a连接b成功,防火墙全部关闭,追查原因不明,初步怀疑epmd. 关于epmd详细,链接:

http://blog.yufeng.info/archives/2169

http://mryufeng.iteye.com/blog/288235

http://mryufeng.iteye.com/blog/120666

http://blog.yufeng.info/archives/539

http://www.cnblogs.com/me-sa/p/erlang-epmd.html

Erlang语言的人工智能 Erlang是一种由爱里克·阿姆德森(Ericsson)于1980年代初期开发的编程语言。最初设计用于电信系统,但因其独特的特性,后来被广泛应用于分布式系统、实时系统和高并发应用。Erlang的设计初衷是为了创建高可用性、低延迟的系统,这些特性使其在人工智能等苛刻计算场景中具有巨大潜力。Erlang作为一种出色的并发编程语言,凭借其独特的架构和特性,为人工智能领域提供了新的可能性。虽然Erlang在AI应用中尚未广泛采用,但其在高并发和容错性方面的优势,能够为解决特定的AI问题提供有效的解决方案。 阅读详情

相关推荐

Erlang远程调用:实现分布式通信与协作

其中,Erlang的RPC(Remote Procedure Call,远程过程调用)机制为不同节点之间的通信提供了便利。它允许在不同节点上的Erlang进程之间进行函数调用,就像调用本地函数一样。通过RPC,我们可以实现节点间的数据传输、协作和协调,提高系统的可伸缩性和灵活性。通过这种方式,我们可以在不同的Erlang节点之间进行函数调用,实现分布式系统的协作和通信。RPC机制使得节点之间的交互变得简单而高效,为构建可扩展的分布式应用提供了强大的基础。节点上的终端中,我们可以调用。节点上使用RPC调用。

AzProcessgroup的博客 258

【原创】erlang 模块之 rpc

kernel-2.15.2 中的内容123456789101112

weixin_34293911的博客 415

Erlang分布式编程的实践与安全防护

本文介绍了Erlang分布式编程的基础知识,包括如何在多个节点上加载模块、跨互联网进行节点间通信以及如何确保通信安全。通过实际案例,展示了如何设置分布式Erlang节点,以及如何使用库和BIFS来简化分布式编程。特别强调了在开放环境中对分布式系统的安全防护,包括Cookie保护系统的设置和使用,以及基于套接字的分布式程序编写方法。

weixin_28888459的博客 798

erlang节点连接与通信

参考资料: https://www.cnblogs.com/me-sa/archive/2011/07/12/erlang0005.html part1: 节点连接 Erlang节点之间建立连接,可以使用net_adm:ping(),参数填写指定节点名字,连接成功返回pong,失败返回pang。 part2: 订阅节点连接 使用net_adm:ping()可以连接上指定节点,但实践中我们不仅仅是要...

lewiskyo的专栏 1427

RT-Thread Studio使用笔记(四):带片外Flash(W25Q128)的OTA(YModem)

前言 在学习OTA之前,请先参考上两篇博客写的关于SPI设备及W25Q128的使用方法,传送门: https://blog.youkuaiyun.com/tigerots/article/details/107423633 https://blog.youkuaiyun.com/tigerots/article/details/107933991 如何使用OTA 一. 制作BootLoader 打开Bootloader 在线获取地址,注册,并根据RT-thread官方文档生成BootLoader,官方文档已经写的很清楚,再此

tigerots的专栏 4008

Qt多线程实战:如何优雅地处理Modbus设备通信中的线程安全问题

本文深入探讨了在Qt框架下实现Modbus设备通信时的多线程安全问题,提供了优雅的解决方案。通过生产者-消费者模型、任务队列与锁机制等设计模式,有效解决了界面卡顿、数据包错乱等问题。文章还详细介绍了对象生命周期管理、信号槽连接类型选择等关键实现细节,帮助开发者构建稳定可靠的Modbus通信模块。

weixin_30897233的博客 483

Erlang rpc.erl 的学习记录

学习到的小知识: 调用gen_server的call时, 如果先调用gen_server:reply(Form, Reply1)又返回{reply, Reply2, State} ,那么调用的进程收到函数调用的返回值Reply1,然后再收到 {Ref,Reply2} 。翻过来亦然,会先收到Reply2,再收到{Ref,Reply1} group_leader就是决定erlang的io控制台的输出到那个进程。https://www.iteye.com/blog/mryufeng-271706 rpc.er

为天地立心,为生民立命,为往圣继绝学,为万世开太平 495

VS2103+Intel2013+MSMPI运行Fortran并行程序

VS2103+Intel2013+MSMPI运行Fortran并行程序MSMPI安装新建Fortran90项目编写Fortran并行程序在cmd运行编译完成的执行文件 MSMPI安装 我这里采用的是Microsoft MPI v9.0.1,可以点此下载。下载完成后同时安装msmpisdk.msi、msmpisetup.exe两个文件,安装位置默认即可。 其中msmpisdk.msi的默认安装路径在C:\Program Files (x86)\Microsoft SDKs\MPI,该文件包含了mpi环境所需

weixin_43176703的博客 2937

《Erlang/OTP并发编程实战》第三章 开发基于 TCP 的 RPC 服务

进程间的消息传递是异步的。 信箱的大小是没有上限的。 gen_server:call/2 的默认应答等待超时为 5 秒。 gen_server: -module(tcp_rpc_server). -behaviour(gen_server). %% API -export([ start_link/1, start_link/0, get_count/0, ...

sanmao123456_的博客 273

FPGA信号处理系列文章——分数倍插值抽取滤波器(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章——分数倍插值抽取滤波器(一)前言信号流matlab模型频谱示意图分析总结 前言 变采样率滤波器不仅仅存在整数倍插值和整数倍抽取的情况,还会存在分数倍插值抽取的情况。那这种情况下要怎么处理呢 信号流 分数倍插值抽取滤波器的信号流是什么?信号先进行插值,再进行FIR滤波,最后进行抽取 matlab模型 %signal 定点化数据输入 coeff_val_fir = importdata('fir.coe'); si

gzy0506的博客 1万+

最详细的 SAP ABAP Web Service 创建和消费步骤讲解

本文原版发表于 SAP 官方社区,当时用的英文版写作,标题为:Step by step to create, consume and trace web service in ABAP system https://blogs.sap.com/2014/05/20/step-by-step-to-create-consume-and-trace-web-service-in-abap-system/ 总共阅读量超过 18 万。 How to create web service provider in A

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3151

Erlang语言的移动应用开发

Erlang最初由爱立信(Ericsson)在1980年代开发,主要用于电信系统的构建。高并发:Erlang基于轻量级进程的模型,可以极高效地处理数以万计的并发进程。分布式:Erlang支持分布式系统的构建,允许在多台机器上运行应用。容错:Erlang的“让它崩溃”哲学 allows developers to build systems that can recover gracefully from errors.

2501_90435923的博客 715

基于STM32F103的智能门禁门锁门卫系统设计

本文设计了一种基于STM32F103单片机的智能门禁系统,集成了密码、射频IC卡和指纹识别三种验证方式。系统采用模块化设计,包含MFRC522射频模块、AS608指纹模块、矩阵键盘、OLED显示和舵机控制等硬件,实现了身份验证、密码修改、IC卡/指纹管理以及安全防护功能。测试结果表明系统响应迅速(密码验证250ms、指纹验证600ms)、功耗低(待机50mA),且具备掉电密码保存功能。该系统操作简便、功能完善,适用于家庭和办公场所,具有较高实用价值。未来可扩展远程控制、人脸识别等功能以进一步提升智能化水平。

3254968421的博客 318

新买入《Erlang程序设计》

    最近研究即时通讯软件开发,其中涉及到高并发访问和分布式等技术让我很苦恼,所以准备学习一下Erlang,在网上买了由Erlang之父Joe Armstrong的权威著作《Erlang程序设计》一书,正努力学习中,以后有心得再发贴。    以前一说到高性能网络服务器,在Windows平台会想到iocp,而在Linux平台会让人想到epoll,确实,在一定程度上,iocp和epoll可以解决高并

西城居士的专栏 900

模型预测控制(MPC)解析(三):多输入多输出系统

本文为阅读笔记,仅供学习交流使用!!! 在之前的文章中,为了简单起见,以单输入单输出系统为例介绍了MPC控制的实现方法。因为使用的是状态空间方程作为系统模型,这种方法可以轻松的扩展到多输入多输出系统中。 ...

行者无疆的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

intellij-erlang调试功能详解:轻松解决Erlang程序难题

intellij-erlang作为一款强大的Erlang IDE,提供了全面的调试功能,帮助开发者轻松定位和解决Erlang程序中的难题。无论是设置断点、查看变量还是分析调用栈,intellij-erlang的调试工具都能让复杂的调试过程变得简单高效。 ## 一、断点调试:精准控制程序执行流程 在intellij-erlang中,断点调试是最常用的调试方式之一。通过设置断点,开发者可以精确控制

gitblog_00220的博客 628

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ErlyBerly:革命性Erlang调试工具,让分布式追踪不再复杂

ErlyBerly是一款专为Erlang开发者打造的分布式追踪调试工具,它通过直观的图形界面和强大的分析功能,让原本复杂的Erlang进程监控和问题诊断变得简单高效。无论是处理分布式系统中的性能瓶颈,还是追踪难以复现的异常,ErlyBerly都能提供全方位的支持,帮助开发者快速定位问题根源。 ## 🚀 核心功能概览:一站式Erlang调试解决方案 ErlyBerly整合了进程监控、内存分析、

gitblog_00798的博客 776

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenTelemetry Erlang/Elixir:分布式追踪的利器

OpenTelemetry Erlang/Elixir:分布式追踪的利器 项目介绍 OpenTelemetry Erlang/Elixir 是一个为 Erlang 和 Elixir 语言设计的分布式追踪框架,它实现了 OpenTelemetry 规范 的 1.8.0 版本。OpenTelemetry 是一个开源的分布式追踪和监控系统,旨在为现代云原生应用提供统一的观测数据收集和分析工具。通过 Op...

gitblog_00173的博客 703

erlang夜话(2) - OTP

OTP不仅是Erlang技术堆栈的一部分,它也是构建高度可靠、可伸缩软件解决方案的基石,对于那些追求系统稳定性和可维护性的开发者而言,这是一个不容忽视的强大工具箱。

tenth_quadrant的博客 1546

终极Erlang调试指南:如何用Erlyberly快速定位代码问题

Erlyberly是一款强大的Erlang、Elixir和LFE调试工具,通过Erlang追踪技术为开发者提供无代码侵入的调试体验。这款工具让追踪函数调用、查看进程状态、分析异常变得异常简单高效。🚀 ## ✨ 为什么选择Erlyberly? 如果你还在使用`io:format/2`或lager进行调试,那么Erlyberly将为你节省大量时间。**Erlang追踪**无需修改代码或重新编译,

gitblog_00083的博客 514

erlang/OTP 平台(学习笔记)(三)

标准Erlang实现的核心是一个称作Erlang运行时系统(ERTS)的应用:这是一大块用C语言写成的代码,负贡Erlang中所有底层的玩怎儿。在前一节,我们曾讨论过Erlang的进程调度器。随着线程在大多数操作系统中的普及,ERTS也有所变化,开始将I/O系统这类东西从运行Erlang进程的线程中拿出来,放到独立的线程中去,但完成主体工作的线程仍然只有一个。调度器——处理运行中的Erlang进程,令所有就绪的进程共享可用的CPU资源,并在新消息到达或发生超时的时候唤醒相应的睡眠中的进程;

m0_62961827的博客 1249

Erlang语言的计算机基础

Erlang中的函数定义采用模式匹配,支持多重函数头。函数的定义如下:```erlang```在这个例子中,add/2表示add函数有两个参数。函数定义用->符号分隔。

2501_90494573的博客 699

Erlang语言的物联网平台

Erlang是由瑞典电信公司Ericsson在1980年代开发的一种编程语言,最初用于电信系统的开发。随着时间的推移,Erlang逐渐演变为一种面向并发、分布式和容错的编程语言。并发性:Erlang的并发模型基于轻量级进程,这使得它可以处理大量并发连接而不会产生显著的性能损耗。容错性:Erlang采用"让它崩溃"的哲学,使得系统能够在发生错误时自动重启进程,从而提高系统的可靠性。分布式特性:Erlang原生支持分布式编程,可以很容易地在多个节点之间进行通信。

2501_91275967的博客 1004

一位Erlang程序猿的自白

Erlang不能错过的盛宴 (快步进入Erlang的世界) 作者:成立涛 (litaocheng@gmail.com) 作为程序猿,我们以前闻听非常多“业界动态”,“技术革新”,以前接触非常多“高手箴言”,“权威推荐”。这些正确与否,都已成过去! 如今,让我们迎...

weixin_30394633的博客 58
上一篇: 用erlang打造系统级监控工具
下一篇: erlang的坑
pyf725324
博客等级 码龄17年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值