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

erlang并发编程分布式02

分布式编程天生分布式的程序优点:性能:不同部分在不同的机器上并行运行来让程序跑得更快。可靠性:如果一台机器出了故障,可

分布式编程

天生分布式的程序

优点:


  • 性能: 不同部分在不同的机器上并行运行来让程序跑得更快。
  • 可靠性:如果一台机器出了故障,可以在另一台机器上继续。
  • 可扩展性:可以通过添加机器提升处理能力。

COOKIE 保护系统

每个节点都有一个COOKIE,如果它想与其他任何节点通信,它的COOKIE就必须和对方节点的COOKIE相同

Erlang集群的定义就是一组带有相同COOKIE的互连节点。

COOKIE从不会在网络中明文传输,它只用来对某次会话进行初始认证。

COOKIE的三种设置方法:


  • $HOME/.erlang.COOKIE 存放相同的COOKIE   chmod 400 .erlang.COOKIE 文件只能被它的所有者访问。
  • erl -setCOOKIE C (不安全,别人容易查看到)
  • erlang:set_COOKIE(node(),C) 把本地COOKIE设置成原子C

 

分布式Erlang 

高度信任,任何节点都可以在其他Erlang节点上执行任意操作。

编写一个用于分布式的程序demo

-module(kvs).
-export([start/0,store/2,lookup/1]).%% 启动进程监听收到的消息
start() -> register(kvs,spawn(fun() -> loop() end)).%% 调用rpc存入Key-Value
store(Key,Value) -> rpc({store,Key,Value}).
%% 查询存入Key-Value
lookup(Key) -> rpc({lookup,Key}).rpc(Q) ->kvs ! {self(),Q},receive{kvs,Replay} ->Replayend.loop() ->receive{From,{store,Key,Value}} ->put(Key,{ok,Value}),From ! {kvs,true},loop();{From,{lookup,Key}} ->From ! {kvs,get(Key)},loop()end.

一台电脑启动执行

kvs:start().kvs:store(weather,raining).kvs:lookup(weather).

一台电脑启动两个节点执行

%% 开启一个节点gandalf@localhost
erl -sname gandalf
kvs:start().%% 开启第二个节点bilbo@localhost
erl -sname bilbo
rpc:call(gandalf@localhost,kvs,store,[weather,fine]).
rpc:call(gandalf@localhost,kvs,lookup,[weather]).

两台服务器相互通信(同局网),需要设置相同的COOKIE 才能通信

%% 开启一个节点gandalf@doris.myerl.example.com
erl -name gandalf -setCOOKIE abc
kvs:start().%% 开启第二个节点bilbo@doris.myerl.example.com
erl -name bilbo -setCOOKIE abc
rpc:call(gandalf@doris.myerl.example.com,kvs,store,[weather,fine]).
rpc:call(gandalf@doris.myerl.example.com,kvs,lookup,[weather]).

两台服务器相互通信(外网)

erl -name ... -setCOOKIE ... -kernel inet_dist_listen_min Min\inet_dist_listen_max Max

相互调用的内置函数

rpc提供了许多远程过程调用服务。

global里的函数可以用来在分布式系统里注册名称和加锁,以及维护一个全连接网络。

%% rpc最重要的函数,它会在指定节点上执行apply(Mod,Function,Args)
call(Node,Mod,Function,Args) -> Result | {badrpc,Reason}-spec spawn(Node,Fun) -> Pid
-spec spawn(Node,Mod,Func,ArgList) -> Pid-spec spawn_link(Node,Fun) -> Pid
-spec spawn_link(Node,Mod,Func,ArgList) -> Pid%% 强制断开与某节点的连接
-spec disconnect_node(Node) -> bool | ignored-spec monitor_node(Node,Flag) -> true%% Arg不传查找本地节点名称,Arg可以是Pid、引用或者端口
-spec node(Arg) -> Node%% 查询所有与我们连接的节点
-sepc nodes() -> [Node]%% 查询节点是否活着
-spec is_alive() -> bool()

例子:远程分裂

-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} -> Responseend.%% 监听需要调用的本地方法
loop() -> receive{rpc,Pid,M,F,A} ->Pid ! {self(),(catch apply(M,F,A))},end.

%% 开启一个gandalf节点
erl -name gandalf -setCOOKIE abc%% 开启一个bilbo节点
erl -name bilbo -setCOOKIE abc%% 通过bilbo在gandalf开启一个进程,执行指定任务
Pid = dist_demo:start('gandalf@doris.myerl.example.com').
dist_demo:rpc(Pid,erlang,node,[]).

例子:模拟文件传输

Pid = dist_demo:start('gandalf@doris,myerl.example.com').%% 获取当前文件路径
dist_demo:rpc(Pid,file,get_cwd,[]).%% 获取文件目录
dist_demo:rpc(Pid,file,list_dir,["."]).%% 获取文件具体内容
dist_demo:rpc(Pid,file,read_file,["dist_demo.erl"]).

 

基于套接字的分布式模型

不可信环境中,更安全。

lib_chan 显式控制自己的机器能分裂出哪些进程。

%% 启动一个基于$HOME/.erlang_config/lib_chan.conf的服务器
-spec start_server() -> true
%% 指定配置文件启动服务器
-spec start_server(Config) -> true%% 客户端连接上服务器,然后开始相互发消息
%% ip、端口号、服务器名、密码、传递参数
-spec connect(Host,Port,S,P,ArgsC) -> {ok,Pid} | {error,Why}

Config 配置部分内容

%% 开始监听端口号:NNNN
{port,NNNN}   %% S服务器名称、P服务器密码、模块、方法、传递参数(这个方法类似启动类)
{service,S,password,P,mfa,SomeMode,SomeFunc,SomeArgS}      

就会通过分裂SomeMod: SomeFunc(MM, ArgsC, SomeArgsS)创建一个进程,负责处理来自客户端的消息。 这里的MM是一个代理进程的PID,可以用来向客户端发送消息。参数ArgsC来自于 客户端的连接调用

例子:

配置

{port,1234}.
{service,nameServer,password,"ABXy45",mfa,mod_name_server,start_me_up,notUserd}.

connect(Host,1234,nameServer,"ABXy45",nil).   服务器会分裂mod_name_server:start_me_up(MM, nil, notUsed)MM是一个代理进程的PID,用来和客户端通信。

服务器主类

-module(mod_name_server).
-export([start_me_up/3]).start_me_up(MM,_ArgsC,_ArgS) ->loop(MM).loop(MM) ->receive{chan,MM,{store,K,V}} ->kvs:store(K,V),loop(MM);{chan,MM,{lookup,K}} ->MM ! {send,kvs:lookup(K)},loop(MM);{chan_closed,MM} ->trueend.

特点:


  • 客户端给服务器发送一条消息{send,X},它会在mod_name_server变成{chan,MM,X}
  • 连接关闭,会受到{chan_closed,MM}格式的消息
  • 服务器给客户端发送消息MM !{send,X}
  • 服务器主动关闭连接 MM !close

执行例子:

 

 


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
author-avatar
焦作艾文斯
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有