热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么有了rpc还有net_kernel:connect/1?

问题描述:RPC(RemoteProcedureCall)远程程序调用:如果要给另一个节点发信息:可以简单写成:call

问题描述:

RPC(Remote Procedure Call)远程程序调用:

如果要给另一个节点发信息:可以简单写成:

call(Msg,Node) ->{server,Node}!{self(),Msg},receive{ok,Res} ->Res
end.server() ->register(server,self()),loop().loop() ->receive{Pid,N} ->Pid!{ok,N*N}end,loop().

以上就是RPC的原型,但是要注意本地调用和远程调用区别在于远程节点可能失效,可以加个超时:

call(Msg,Node) ->{server,Node}!{self(),Msg},receive{ok,Res} ->Resafter 1000 ->{error,timeout}
end.

Tip: 但是要特别注意的是:超时后仍可能收到消息并存储在进程邮箱中,远程服务器很忙或网络不佳时,如果你不刷新消息,下次call/2并且发送一个新的请求时,最终你取出了是队列的每一个消息,就是你call(A,Node)timeout了,又call(B,Node),可能你得到的是A的结果,这个不刷新真悲剧。

erlang把上面的原理也用gen_server封装了下,就有了rpc:call(Node,Module,Func,Args)这个函数。

以上来源于:Erlang编程指南

问题:都已经可以用RPC和远程节点通信了,还要net_kernel来做什么?

  注意到,我们发信息时还要指定对应的Node名字,对于调用者是不好的,(这个参数也不好找),Erlang要的效果是:把本地节点方式和远程节点编写方式统一,将其透明化。

因为只要知道PID就可以给它发信息这个特性,可以分2步完成。

1. 把要用的节点手动连接起来,

2.使用加强版本的global:whereis_name/1代替erlang:whereis/1.

所以这就是net_kernel的作用:用于手动启动,停止,连接和监控节点的构造。

这样你发信息可以这样子!和本地是一样了啦!!!

erlang:send(global:whereis_name(test),for_test).

Tips:

    1. 这里使用:net_kernel:connect/1成功的前提一定是COOKIE相同;

    2. erl 可以用-connect_all_false 标记,来不让别的节点连接,系统也不会保留连接节点的全局表,这样就可以阻止全局声明。

    3. erl –hidden将节点隐藏起来:原因如果N个节点隐藏互连,就会互相监视,要保持N*(N-1)/2的连接,增加了节点凌晨发送监控消息的开销,所以就把不用的节点先隐藏,要用的时候再用net_kerlel:connect(Node)建立;

    4. erl –name –sname 最好不要混用;

    5. nep_adm: ping(Node)可以Node有没有连接上来pong通,pang不通.

 

epmd进程:如果你是在用UDP或TCP等协议来做分布式的话:

以下摘自Erlang编程指南:

epmd是erlang运行时系统的一部分,它为erlang分布式的节点扮演了端口映射看守程序的角色,无论多少分布式节点运行在它上面,每个机器 只会启动一个epmd看守程序进程,监听来自己端口4369的所有连接请求,并把综们映射到被接节点的监听端口,如果还没有开始运行,当启动你第一个分布式erlang节点时epmd会自动运行,然后通过 手动开启,可以传递一系列的命令和设置参数。

 

转:https://www.cnblogs.com/zhongwencool/p/3726739.html


推荐阅读
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • TCP三次握手过程详解与图示解析
    本文详细解析了TCP三次握手的过程,并通过图示清晰展示了各个状态的变化。同时,文章还介绍了四次挥手的图解,解释了在TIME_WAIT状态中,客户端最后一次发送的ACK包的作用和重要性。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 随着CRM版本的更新,某些功能可能不再可用。本文探讨了一种高效的替代方案,通过编写 `function loadFrom()` 来识别和区分不同的编辑窗口。该方法利用了Xrm.Page对象的特性,确保在不同版本的CRM中都能稳定运行。此外,文章还详细介绍了如何通过检测页面类型和上下文信息来优化用户体验。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • Python爬虫入门:深入解析HTTP协议与Requests库的应用
    Python爬虫入门:深入解析HTTP协议与Requests库的应用 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
author-avatar
烦了_12664
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有