erlang的分散式運算具有許多優點:
工作分派給不同的電腦分別運算,可以讓程式運作的更快
若其中有部份電腦失效,系統仍可持續運作
可視需要適當的加入電腦或減少電腦,且無須大幅變動軟體架構
有些應用天生具有分散的特質,例如Game或是IM,可以讓使用者就近使用
運算資源.例如著名的WhatsApp就是使用erlang開發的.
我們來看一個簡單的Key-Value Server.
-module(kvs).
-export([start/0, store/2, lookup/1]).
start() ->
register(kvs, spawn(fun() -> loop() end)).
%
loop() ->
receive
{From, {store, Key, Value}} ->
put(Key, {ok, Value}),
From ! {kvs, true},
loop();
{From, {lookup, Key}} ->
From ! {kvs, get(Key)},
loop()
end.
%
rpc(Q) ->
kvs ! {self(), Q},
receive
{kvs, Reply} ->
Reply
end.
%
store(Key, Value) ->
rpc({store, Key, Value}).
%
lookup(Key) ->
rpc({lookup, Key}).
編譯及測試運作:
1> c(kvs).
{ok,kvs}
2> kvs:start().
true
3> kvs:store({tall, arale}, 139).
true
4> kvs:store({tall, doraemon}, 129.3).
true
5> kvs:lookup({tall, arale}).
{ok,139}
6> kvs:lookup({tall, doraemon}).
{ok,129.3}
此程式使用process dictionary來存放資料.
利用put(Key, Value),get(Key)->Value 兩函數.
這個簡單的Key-Value伺服器,就是用來當範例.
接著我們來看看在不同節點上運作的情形.
要開啟兩個終端機,在第一個終端機啟動erlang shell時
使用 -sname gandalf ,命名節點為 gandalf.
第二個終端機啟動erlang shell時
使用 -sname miku ,命名節點為 miku.
先在第一個終端機啟動 kvs
(gandalf@asami)1> kvs:start().
true
注意到前面有 gandalf@asami 代表 gandalf節點在 asami機器上運作.
接著在第二台終端機上
(miku@asami)1> rpc:call(gandalf@asami, kvs, store, [{tall, arale}, 139]).
true
(miku@asami)2> rpc:call(gandalf@asami, kvs, lookup, [{tall, arale}]).
{ok,139}
同樣有 miku@asami, 代表 miku節點在 asami機器上運作.
使用erlang的rpc來呼叫在 gandalf@asami 上的kvs的store與lookup,
來存入與取出資料.
回到第一台終端機
(gandalf@asami)2> kvs:lookup({tall, arale}).
{ok,139}
驗證資料有正確存放在gandalf.
我們的程式碼,就是剛剛在本機上運作的,一行都沒改.
分散式運算複雜的部份,全部由erlang在背後幫我們處理掉了.