1,什么是分布式程序?
Erlang分布式程序是设计用来在网络计算机上运行并且只可以通过消息传递来协调活动
2,为啥要写分布式程序?
1) 性能
通过将程序的不同部分分布到不同计算机来并行运行,以此提升性能(适用于密集型、CPU是瓶颈的计算)
2) 可靠性
通过将程序分布来构建容错系统,以此提升可靠性。如果一台机器失败了,我们可以在另一台机器上继续计算
3) 伸缩性
如果我们scale up,迟早有一天机器性能会成为瓶颈。增加新机器应该是一个很简单的操作并且不需要应用程序架构做太大改动
4) 本质上分布的程序
多用户游戏或聊天系统等程序的在本质上就是分布的,如果我们有大量在地理位置上不同的用户,我们希望将计算资源放在离用户近的地方
5) 乐趣
大部分有意思的程序都是分布式的,这些程序大多数需要和全世界的人和机器交互
3,Erlang里两种分布模型
1) 分布式Erlang
程序运行在Erlang节点上,我们可以在任一节点上spawn一个进程,任何节点都可以在其他节点上做任何操作
所有的消息传递和错误处理就和在一个单一节点上运行一样
2) 基于Socket的分布
使用TCP/IP socket来分布,没有上面的分布式Erlang强大
4,erl -sname hideto表示在本地启动一个Erlang节点,名字为hideto
如果两个节点在同一机器上,或者没有DNS服务,只能用-sname参数,s表示short
不同的机器上使用-name参数来启动节点
5,rpc:call(Node, Mod, Func, [Arg1, Arg2, ..., ArgN)在Node上执行一个远程过程调用,要调用的方法是Mod:Func(Arg1, Arg2, ..., ArgN)
6,使用-setcookie参数来保证交互的两个节点有一样的cookie,以此保证安全性
7,使用-kernel inet_dist_listen_min Min \ inet_dist_listen_max Max参数来设置端口范围
8,分布式程序用到的BIF:
1) @spec spawn(Node, Fun) -> Pid
2) @spec spawn(Node, Mod, Func, ArgList) -> Pid
3) @spec spawn_link(Node, Fun) -> Pid
4) @spec spawn_link(Node, Mod, Func, ArgList) -> Pid
5) @spec disconnect_node(Node) -> bool() | ignored
6) @spec monitor_node(Node, Flag) -> true
7) @spec node() -> Node
8) @spec node(Arg) -> Node
9) @spec nodes() -> [Node]
10) @spec is_alive() -> bool()
9,分布式程序库:
1) rpc
2) global
rpc module里最常用的方法是call(Node, Mod, Function, Args) -> Result | {badrpc, Reason}
10,设置cookie的三种方式
1) $HOME/.erlang.cookie
2) erl -setcookie C
3) erlang:set_cookie(node(), C)