檢視原始碼 (View Source) global_group (kernel v10.2)
將節點分組到全域名稱註冊群組。
此模組使系統的節點可以分割成全域群組。每個全域群組都有自己的全域命名空間,請參閱 global
。
將系統劃分為全域群組的主要優點是,在操作全域註冊名稱時,背景負載會減少,同時需要更新的節點數量也會減少。
核心 (Kernel) 設定參數 global_groups
定義了全域群組。
{global_groups, [GroupTuple :: group_tuple()]}
為了讓程序和節點能夠使用全域群組功能順利執行,必須滿足以下標準:
- 全域群組伺服器
global_group
的實例必須在每個節點上執行。當節點啟動時,這些程序會自動啟動並同步。 - 所有相關的節點必須就全域群組的定義達成一致,否則系統的行為是未定義的。
- 系統中所有節點都必須正好屬於一個全域群組。
在以下描述中,群組節點是指與本地節點屬於同一個全域群組的節點。
注意事項 (Notes)
- 在一個節點失去與其全域群組中其他節點的連線,但與其他全域群組的節點有連線的情況下,來自另一個全域群組的請求可能會產生不正確或誤導性的結果。例如,隔離的節點可能具有關於其全域群組中註冊名稱的不準確資訊。
- 函式
send/2,3
是不安全的。 - 應用程式的分散高度依賴於全域群組的定義。不建議將應用程式分散到多個全域群組中,因為在故障轉移/接管時,已註冊的名稱可能會被移動到另一個全域群組。雖然沒有什麼能阻止這種情況發生,但應用程式程式碼必須能夠處理這種情況。
另請參閱 (See Also)
摘要 (Summary)
類型 (Types)
沒有 PublishType
的 GroupTuple
與 PublishType
等於 normal
的 GroupTuple
相同。
已註冊的名稱。
使用命令列標誌 -hidden
啟動的節點(請參閱 erl
)被稱為隱藏節點。隱藏節點會與不屬於同一個全域群組的節點建立隱藏連線,但會與屬於同一個全域群組的節點建立正常(可見)連線。
函式 (Functions)
傳回一個 tuple,其中包含本地節點所屬的全域群組的名稱,以及所有其他已知群組名稱的清單。
傳回一個清單,其中包含有關全域群組的資訊。每個清單元素都是一個 tuple。tuple 的順序是未定義的。
變更呼叫程序對節點狀態變更訊息的訂閱。
傳回所有群組節點的名稱,無論它們目前的狀態如何。
傳回在指定節點上或在指定的全域群組中全域註冊的所有名稱的清單。
將 Msg
傳送到由全域註冊名稱 Name
代表的 pid。
與 send(Name, Msg)
等效,但搜尋僅限於 Where
指定的節點或全域群組。
同步群組節點,也就是群組節點上的全域名稱伺服器。還會檢查目前全域群組中全域註冊的名稱,並在任何已知但不屬於該群組的節點上取消註冊它們。
在任何全域群組中搜尋 Name
。
與 whereis_name(Name)
等效,但搜尋僅限於 Where
指定的節點或全域群組。
類型 (Types)
-type group_name() :: atom().
-type group_tuple() :: {GroupName :: group_name(), [node()]} | {GroupName :: group_name(), PublishType :: publish_type(), [node()]}.
沒有 PublishType
的 GroupTuple
與 PublishType
等於 normal
的 GroupTuple
相同。
-type info_item() :: {state, State :: sync_state()} | {own_group_name, GroupName :: group_name()} | {own_group_nodes, Nodes :: [node()]} | {synched_nodes, Nodes :: [node()]} | {sync_error, Nodes :: [node()]} | {no_contact, Nodes :: [node()]} | {other_groups, Groups :: [group_tuple()]} | {monitoring, Pids :: [pid()]}.
-type name() :: atom().
已註冊的名稱。
-type publish_type() :: hidden | normal.
使用命令列標誌 -hidden
啟動的節點(請參閱 erl
)被稱為隱藏節點。隱藏節點會與不屬於同一個全域群組的節點建立隱藏連線,但會與屬於同一個全域群組的節點建立正常(可見)連線。
以 PublishType
等於 hidden
定義的全域群組被稱為隱藏全域群組。隱藏全域群組中的所有節點都是隱藏節點,無論它們是否使用命令列標誌 -hidden
啟動。
-type sync_state() :: no_conf | synced.
-type where() :: {node, node()} | {group, group_name()}.
函式 (Functions)
-spec global_groups() -> {GroupName, GroupNames} | undefined when GroupName :: group_name(), GroupNames :: [GroupName].
傳回一個 tuple,其中包含本地節點所屬的全域群組的名稱,以及所有其他已知群組名稱的清單。
如果沒有定義全域群組,則傳回 undefined
。
-spec info() -> [info_item()].
傳回一個清單,其中包含有關全域群組的資訊。每個清單元素都是一個 tuple。tuple 的順序是未定義的。
{state, State}
- 如果本地節點屬於全域群組,則State
等於synced
。如果沒有定義全域群組,則State
等於no_conf
。{own_group_name, GroupName}
- 本地節點所屬的群組名稱 (atom)。{own_group_nodes, Nodes}
- 節點名稱 (atom) 的清單,即群組節點。{synced_nodes, Nodes}
- 節點名稱的清單,即目前與本地節點同步的群組節點。{sync_error, Nodes}
- 節點名稱的清單,即本地節點同步失敗的群組節點。{no_contact, Nodes}
- 節點名稱的清單,即目前沒有連線的群組節點。{other_groups, Groups}
-Groups
是 tuple{GroupName, Nodes}
的清單,指定其他全域群組的名稱和節點。{monitoring, Pids}
- pid 的清單,指定已訂閱nodeup
和nodedown
訊息的程序。
-spec monitor_nodes(Flag) -> ok when Flag :: boolean().
變更呼叫程序對節點狀態變更訊息的訂閱。
如果 Flag
等於 true
,則呼叫程序開始訂閱節點狀態變更訊息。如果等於 false
,則停止訂閱。
已訂閱的程序會在群組節點連線或斷線時分別收到訊息 {nodeup, Node}
和 {nodedown, Node}
。
-spec own_nodes() -> Nodes when Nodes :: [Node :: node()].
傳回所有群組節點的名稱,無論它們目前的狀態如何。
傳回在指定節點上或在指定的全域群組中全域註冊的所有名稱的清單。
將 Msg
傳送到由全域註冊名稱 Name
代表的 pid。
send/2
會在任何全域群組中搜尋 Name
。全域群組會按照它們在設定參數 global_groups
值中出現的順序進行搜尋。
如果找到 Name
,則會將訊息 Msg
傳送到對應的 pid。該 pid 也是該函式的傳回值。如果找不到該名稱,則該函式會傳回 {badarg, {Name, Msg}}
。
-spec send(Where, Name, Msg) -> pid() | {badarg, {Name, Msg}} when Where :: where(), Name :: name(), Msg :: term().
與 send(Name, Msg)
等效,但搜尋僅限於 Where
指定的節點或全域群組。
-spec sync() -> ok.
同步群組節點,也就是群組節點上的全域名稱伺服器。還會檢查目前全域群組中全域註冊的名稱,並在任何已知但不屬於該群組的節點上取消註冊它們。
如果無法同步,則會將錯誤報告傳送到錯誤記錄器(另請參閱 error_logger
)。
如果設定參數 global_groups
具有無效值 Bad
,則傳回 {error, {'invalid global_groups definition', Bad}}
。
在任何全域群組中搜尋 Name
。
全域群組會按照它們在設定參數 global_groups
的值中出現的順序進行搜尋。
如果找到 Name
,則會傳回對應的 pid。如果找不到該名稱,則該函式會傳回 undefined
。
與 whereis_name(Name)
等效,但搜尋僅限於 Where
指定的節點或全域群組。