前言
用Erlang编写分布式程序和编写并发程序只有一步之遥。在分布式Erlang里,可以在远程节点和机器上分裂进程。分裂出远程进程之后,我们会看到其他所有的基本函数( send 、 receive和 link 等)都能透明运作在网络中,就像在单个节点上一样。
下面是一些想要编写分布式应用程序的原因。
-
性能
可以通过安排程序的不同部分在不同的机器上并行运行来让程序跑得更快。 -
可靠性
可以通过让系统运行在数台机器上来实现容错式系统。如果一台机器出了故障,可以在另一台机器上继续。 -
可扩展性
随着我们把应用程序越做越大,即使机器的处理能力再强大也迟早会耗尽。到那时,就必须添加更多的机器来提升处理能力。添加一台新机器应当是一次简单的操作,不需要对应用程序的架构做出大的修改。 -
天生分布式的程序
许多应用程序天生就是分布式的。如果编写一个多用户游戏或聊天系统,就会有来自世界各地的分散用户。如果我们在某个地理位置上拥有大量的用户,就会希望把计算资源放置在接近这些用户的地方。 -
fun
我想要编写的fun程序大部分都是分布式的。其中许多涉及与全世界各地的人与机器进行交互。
一、两种分布式模型
- 分布式Erlang
在分布式Erlang里,我们编写的程序会在Erlang的节点(node)上运行。节点是一个独立的Erlang系统,包含一个自带地址空间和进程组的完整虚拟机。
可以在任何节点上分裂进程,前几章讨论的所有消息传递和错误处理基本函数也都能像在单节点上那样工作。分布式Erlang应用程序运行在一个可信环境中。因为任何节点都可以在其他Erlang节点上执行任意操作,所以这涉及高度的信任。虽然分布式Erlang应用程序可以运行在开放式网络上,但它们通常是运行在属于同一个局域网的集群上,并受防火墙保护。 - 基于套接字的分布式模型
可以用TCP/IP套接字来编写运行在不可信环境中的分布式应用程序。这个编程模型不如分布式Erlang那样强大,但是更安全。在14.6节里,我们会来看看如何用基于套接字的简单分布式机制来构建应用程序。
二、创建名称服务器
第 1 阶段:一个简单的名称服务器
我们的名称服务器 kvs 是一个简单的 Key → Value 服务器,它的接口如下。
- spec kvs:start()->true
启动服务器。它将创建一个注册名为 kvs 的服务器。 - spec kvs:store(key,value)->true
关联 Key 和 Value 。 - spec kvs:lookup(Key)->{ok,value}|undefined
查询 Key 的值。如果 Key 带有关联值就返回 {ok, Value} ,否则返回 undefined 。这个键值服务器是用进程字典里的基本函数 get 和 put 实现的,它的代码如下:
start() -> register(kvs, spawn(fun() -> loop() end)).
store(Key, Value) -> rpc({
store, Key, Value}).
lookup(Key) -> rpc({
lookup, Key}).
rpc(Q) ->
kvs ! {
self(), Q},
receive
{
kvs, Reply} ->
Reply
end