《erlang程序設計》學習筆記-第10章 分佈式編程

第10章 分佈式編程


1. erlang分佈式編程的基本模型
 (1) 分佈式erlang:這種模型可以讓我們在一個緊密耦合的計算機集羣上編寫程序。
 (2) 分佈式erlang應用程序運行在一個可個這個進程的環境中。一個局域網的不同集羣之間,但在同一個防火牆裏面。
 (3) 基於套接字的分佈式應用:使用TCP/IP套接字,我們可以編寫運行在非信任環境中的分佈式應用程序。
2. 編寫分佈式程序的步驟:
 (1)先在一個非分佈式erlang環境中編寫和測試程序。
 (2)然後在同一臺計算機的兩個不同的erlang節點上測試程序。
 (3)最後在同一個網絡或者因特網上的兩臺互相獨立的機器上開戶不同的erlang節點來測試程序。

3. rpc:call(Node, Mod, Func, [Arg1, Arg2, ..., ArgN]).在Node進行一次遠程調用,被調用的函數是Mod:Func(Arg1, Arg2, ..., ArgN).
 節點名的形式形如NodeName@Host。NodeName和Host都是原子(其實整個節點名就是一個原子),所以如果其中有非原子字符時一定要用引號引起來(把節點名全部引起來,如:'NodeName@Host')
4. 在不需要DNS的情況下可以用erl -sname NodeName
否則用erl -name NodeName  在windows下erl -name hello這樣不能用,得這樣:erl -name hello@localhost
-sname的意思是“短名字”
5. 如果兩個節點在不同的機器運行,爲了確保兩個節點能夠通訊,在啓動erl時需要設置相同抽cookie:
 erl -name node1 -setcookie abc
 erl -name node2 -setcookie abc
   可以用erlang:set_cookie來修改一個節點的cookie值。
6. 另外,要確保兩個機器上的代碼版本相同。
 (1)可以配置代碼服務器來保證版本的一致。
 (2)使用shell命令nl(Mod),這個操作會在所有互相連接的節點上加載模塊Mod。
7. 可以通過命令net_adm:ping(Node)來測試節點間的連通性。
8. 如果需要在internet上的兩臺機器相互連接,需要:
 (1)確保4396端口的TCP和UDP的通信正常。Erlang系統中的epmd(Erlang Port Mapper Daemon)程序會使用這個端口。
 (2)選擇分佈式Erlang需要使用的一個端口或者一個端口範圍(就是應用程序要用的端口),確保這些端口在防火牆上打開。
  erl -name ... -setcookie .. -kernel inet_dist_listen_min Min inet_dist_listen_max Max
  如果是一個端口,則Min=Max

9. 具有相同cookie而且彼此互相連接的節點集稱爲Erlang集羣。

10. 分佈式原語
 (1)在節點Node上創建一個進程。
 @spec spawn(Node, Fun) -> Pid
 @spec spawn(Node, Mod, Fun, ArgList) -> Pid
 @spec spawn_link(Node, Fun) -> Pid
 @spec spawn_link(Node, Mod, Fun, ArgList) -> Pid
 (2)強制斷開一個節點的連接
 @spec disconnect_node(Node) -> bool() | ignored
 (3)監視:如果Flag爲true,則打開監視,爲false,關閉監視
 當監視打開時,當有Node加入或離開erlag集羣時,執行這個BIF的進程會收到{nodeup, Node}或{nodedown, Node}消息。
 @spec monitor_node(Node, Flag) -> true
 (4)Node查詢
 @spec node() -> Node 返回本地節點的名字
 @spec node(Arg) -> Node 返回Arg所指定的節點,Arg可以是一個PID,一個引用或者一個端口。如果本地節點不是分佈式的,就會返回nonode@nohost
 @spec nodes() -> [Node] 返回網絡上與當前節點連接的所有其它節點列表
 @spec is_alive -> bool() 如果本地節點狀態正常而且是分佈式系統的一部分,返回true,否則返回false。
 (5)發送消息
 {RegName, Node} ! Msg 向Node節點上名爲RegName的註冊進程發送消息Msg。

11. 分佈式編程中使用的庫:rpc和global

12. 設置和保護cookie
方法1:讓不同的機器的$HOME/.erlang.cookie文件內容相同,並將其設置讀寫保護
方法2:啓動erlang時用setcookie選項,這種方法不是很安全,因爲可以在操作系統中通過ps命令看到。
方法3:使用BIF erlang:set_cookie(node(), C)把本地節點的cookie設置爲原子C。

13. 在分佈式的erlang中,會話是不加密的,但可以將它設定在一個加密的信道里運行。

14. lib_chan的用法:
(1)先寫配置文件:
 {port, NNNN} %% NNNN爲服務器偵聽的TCP端口
 {service, S, password, P, mfa, Mod, Func, ArgS} %% S爲服務名稱,P爲應用服務時的密碼
(2)做一個模塊Mod,其中有一個函數Func,它接收3個參數,(MM, ArgsC, ArgS),在調用lib_chan:start_server的時候會調用它,所以它應該是一個不退出的函數。
(3)lib_chan:start_server()啓動服務器
(4)從客戶端{ok, Pid} = lib_chan:connect("localhost", 1234, S, P, ArgC). 返回的Pid是客戶端的代理進程的ID。
(5)從客戶端發送消息,lib_chan:cast(Pid, X).客戶端代理會將消息通過TCP連接發送到服務器代理。
(6)服務器代理(MM是這個服務器代理的Pid)收到後數據後,轉換爲消息{chan, MM, X}發給(2)所指的進程。
(7)如果連接關閉,(2)的進程會收到{chan_closed, MM}消息
(8)如果服務器想發消息給客戶端,那麼服務器只要執行MM!{send, X}
(9)如果服務器要主動斷開,MM!close

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章