1. 在 Erlang 中没有共享,只有消息传递,因此分布式还是单机本质上没有什么区别。
  2. Erlang 集群是一个全联通网络。
  3. 节点启动:
    1. erl -name xx
      适用于配有 DNS 的普通网络环境,需要给出节点的完全限定域名
    2. erl -sname xx
      适用于完全限定域名不可用的情况
  4. 采用短节点名和长节点名的节点所处的通信模式是不同的,它们之间无法形成集群。
  5. 隐形节点:
    借助一些特殊的节点,我们可以将多个集群合并成更大的、非全联通的集群。
    这类节点经过特殊配置,不会对外传播其他节点的信息,它们甚至可以对其他节点隐身,以便对集群进行非侵入式监控。
  6. 建立连接:
    net_adm:ping('haha@haha.com').
  7. EPMD(Erlang 端口映射守护进程):
    1. 启动每一个节点,EPMD 都会检查本地机器上是否运行着 EPMD,如果没有,节点就会自动启动 EPMD;
    2. EPMD 会追踪在本地机器上运行的每个节点,并记录分配给它们的端口号;
    3. 当一台机器上的 Erlang 节点试图与远程节点通信时, 本地的 EPMD 就会联络远程机器上的 EPMD(默认使用TCP/IP,端口号4369),询问在远程机器上有没有相应名字的节点。如果有,远程 EPMD 就会回复一个端口号,通过该端口便可直接与远程节点通信;
    4. EPMD 不会主动搜寻其他 EPMD,只有在某个节点主动搜寻其他节点时才能建立。
  8. 通信安全:
    Erlang 默认的分布式模型基于这样一个假设,集群中的所有节点都运行在一个受信网络内。
    如果这个假设不成立,或者其中的某些机器需要与外界通信,那么就应该直接在TCP(或 UDP、SCTP 等)之上配合恰当的应用层协议来实现非受信网络上的通信。此外还可以利用 SSL、SSH、IPsec 等技术建立加密隧道,甚至直接将 Erlang 的分布式通信层架设在 SSL 等传输协议之上。
  9. auth:get_cookie().            % 获取当前节点的 cookie
    set_cookie(Node, Cookie).     % 设置 cookie
  10. 在 Erlang 中,shell 是采用进程来容错的。shell 进程崩溃后,信箱中的内容会丢失,但变量绑定关系仍然会保留。
  11. 远程使用 shell:
    1. 节点之间事先无须建立连接
    2. Ctrl-G 命令下:r 'a@haha.com'
    3. 如果节点名中含有句点,要加上单引号
    4. 命令不会立即见效
    5. 退出远程 shell 时注意:!!!不要用 q(). q() 是关闭执行该命令的节点,也就是远程节点。
      要想安全退出,要使用 Ctrl-G 或 Ctrl-C
  12. 资源探测应用:
    1. 资源探测:建立资源提供方和资源使用方之间的关系
    2. 代码实现:
      -module(resource_discovery).-behavior(gen_server).
      %% API
      -export([start_link/0, add_target_resource_type/1, add_local_resource/2, fetch_resources/1, trade_resources/0]).-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/2,code_change/3
      ]).-define(SERVER, ?MODULE).-record(state, {target_resource_types, local_resource_tuples, found_resource_tuples}).start_link() ->gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).init([]) ->{ok, #state{target_resource_types = [], local_resource_tuples = dict:new(),found_resource_tuples = dict:new()}}.add_target_resource_type(Type) ->gen_server:cast(?SERVER, {add_target_resource_type, Type}).add_local_resource(Type, Instance) ->gen_server:cast(?SERVER, {add_local_resource, {Type, Instance}}).fetch_resources(Type) ->gen_server:call(?SERVER, {fetch_resources, Type}).trade_resources() ->gen_server:cast(?SERVER, trade_resources).handle_cast({add_target_resource_type, Type}, State) ->TargetTypes = State#state.target_resource_types,NewTargetTypes = [Type | lists:delete(Type, TargetTypes)],{noreply, State#state{target_resource_types = NewTargetTypes}};handle_cast({add_local_resource, {Type, Instance}}, State) ->ResourceTuples = State#state.local_resource_tuples,NewResourceTuples = add_resource(Type, Instance, ResourceTuples),{noreply, State#state{local_resource_tuples = NewResourceTuples}};handle_cast(trade_resources, State) ->ResourceTuples = State#state.local_resource_tuples,AllNodes = [node() | nodes()],lists:foreach(fun(Node) ->gen_server:cast({?SERVER, Node}, {trade_resources, {node(), ResourceTuples}})end, AllNodes),{noreply, State};handle_cast({trade_resources, {ReplyTo, Remotes}}, State) ->#state{local_resource_tuples = Locals, target_resource_types = TargetTypes, found_resource_tuples = OldFound} = State,FilteredRemotes = resource_for_types(TargetTypes, Remotes),NewFound = add_resources(FilteredRemotes, OldFound),case ReplyTo ofnoreply ->ok;_ ->gen_server:cast({?SERVER, ReplyTo}, {trade_resources, {noreply, Locals}})end,{noreply, State#state{found_resource_tuples = NewFound}}.handle_call({fetch_resources, Type}, _From, State) ->{reply, dict:find(Type, State#state.local_resource_tuples), State}.handle_info(_, State) ->{stop, normal, State}.terminate(_Reason, _State) ->sc_store:delete(self()),ok.code_change(_OldVsn, State, _Extra) ->{ok, State}.add_resources([{Type, Resource} | T ], ResourceTuples) ->add_resources(T, add_resource(Type, Resource, ResourceTuples));
      add_resources([], ResourceTuples) ->ResourceTuples.resource_for_types(Types, ResourceTuples) ->Fun =fun(Type, Acc) ->case dict:find(Type, ResourceTuples) of{ok, List} ->[{Type, Instance} || Instance <- List] ++ Acc;error ->Accendend,lists:foldl(Fun, [], Types).add_resource(Type, Resource, ResourceTuples) ->case dict:find(Type, ResourceTuples) of{ok, ResourceList} ->NewList = [Resource | lists:delete(Resource, ResourceList)],dict:store(Type, NewList, ResourceTuples);error ->dict:store(Type, [Resource], ResourceTuples)end.

《Erlang/OTP并发编程实战》第八章 分布式 Erlang/OTP 简介相关推荐

  1. Erlang/OTP并发编程实战

    <Erlang/OTP并发编程实战> 基本信息 原书名:Erlang and OTP in Action 作者: (美)洛根(Logan,M.) 梅里特(Merritt,E.) (瑞典) ...

  2. 图书封面的故事之“阿尔特温人”——选自《Erlang/OTP并发编程实战》图书封面

    图书封面故事之"阿尔特温人" --选自<Erlang/OTP并发编程实战>图书封面 我们 Manning人把两个世纪前多样的地方生活融入书籍的封面,令画卷复苏,谨以此表 ...

  3. 《Go并发编程实战》第2版 紧跟Go的1.8版本

    文章作者:郝林(<Go并发编程实战 (第2版)>作者) 终于来了!经过出版社的各位编辑.校对.排版伙伴与我的N轮PK和共同努力,<Go并发编程实战>第2版的所有内容终于完全确定 ...

  4. 《C++并发编程实战》——1.1 什么是并发

    本节书摘来自异步社区出版社<C++并发编程实战>一书中的第1章,第1.1节,作者:[美] Anthony Williams (威廉姆斯),更多章节内容可以访问云栖社区"异步社区& ...

  5. 【极客时间】《Java并发编程实战》学习笔记

    目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...

  6. Java并发编程实战之互斥锁

    文章目录 Java并发编程实战之互斥锁 如何解决原子性问题? 锁模型 Java synchronized 关键字 Java synchronized 关键字 只能解决原子性问题? 如何正确使用Java ...

  7. 计算机书籍-C++并发编程实战

    书名:C++并发编程实战 作者:[美] Anthony Williams 威廉姆斯 出版社:人民邮电出版社 出版时间:2015年06月 去当当网了解

  8. Java 7并发编程实战手册

    2019独角兽企业重金招聘Python工程师标准>>> Java 7并发编程实战手册 本书是 Java 7 并发编程的实战指南,介绍了Java 7 并发API 中大部分重要而有用的机 ...

  9. Java并发编程实战笔记2:对象的组合

    设计线程安全的类 在设计现车让安全类的过程之中,需要包含以下三步: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问策略 实例封闭 通过封闭机制与合适的加锁策略结合起来 ...

  10. aqs clh java_【Java并发编程实战】—– AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形. 其主要从双方面进行了改造:节点的结构与节点等待机制.在结构上引入了 ...

最新文章

  1. 计算机模拟热处理,计算机模拟在热处理中的应用
  2. 【企业管理】《人与绩效》读书笔记--怎样做员工
  3. 收藏这些芯片原厂的代码仓库
  4. jquery中each_如何在jQuery中使用each()
  5. 构建根文件系统之busybox
  6. windows上java调用gdal.jar报错
  7. 文字布局(TEXT STYLE)标记(TAGS)
  8. VHDL数控分频器及其应用
  9. 更深层次的了解计算机,想要对电脑拉力试验机有更深层次的了解,看这里
  10. vue问题解决 extract:echarts: sill extract echarts@^4.2.0-rc.2 extracted to
  11. 南卡小音舱蓝牙耳机评测:超轻腔体震撼音质
  12. 设计要用计算机吗,作为设计师 你需要这样的笔记本电脑
  13. 什么是 SDN?SDN 和 NFV 有什么区别?
  14. python会员折扣_Python——潜在会员用户预测
  15. WXML和HTML的区别
  16. labview 和lin 通讯_LABVIEW几种通讯应用1
  17. 97 后程序媛有什么特点?
  18. java app游戏源代码_跪求游戏java源代码
  19. linux只W25Q256驱动,使用m25p80,支持w25q系列nor flash
  20. Qt+Mplayer视频播放器

热门文章

  1. 魔镜mirror安卓版打不开_魔镜Mirror
  2. VBA教程初级(五):复杂数组
  3. springboot下载excel文件
  4. git 清除用户名密码
  5. 昭阳k20-80拆机过程
  6. 病毒的分类和命名规则
  7. onenote同步问题
  8. java jar包转成exe运行
  9. 【Windows】电脑清理个人隐私数据信息
  10. VB6 自定义 Msgbox 和 InputBox 消息框