iT邦幫忙

DAY 20
1

蠻可愛的 Erlang 與 Elixir系列 第 20

分散式運算

  • 分享至 

  • xImage
  •  

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在背後幫我們處理掉了.


上一篇
Concurrent程式設計 容錯機制
下一篇
Elixir: The Power of Erlang, the Joy of Ruby
系列文
蠻可愛的 Erlang 與 Elixir30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言