檢視原始碼 (View Source) global_group (kernel v10.2)

將節點分組到全域名稱註冊群組。

此模組使系統的節點可以分割成全域群組。每個全域群組都有自己的全域命名空間,請參閱 global

將系統劃分為全域群組的主要優點是,在操作全域註冊名稱時,背景負載會減少,同時需要更新的節點數量也會減少。

核心 (Kernel) 設定參數 global_groups 定義了全域群組。

{global_groups, [GroupTuple :: group_tuple()]}

為了讓程序和節點能夠使用全域群組功能順利執行,必須滿足以下標準:

  • 全域群組伺服器 global_group 的實例必須在每個節點上執行。當節點啟動時,這些程序會自動啟動並同步。
  • 所有相關的節點必須就全域群組的定義達成一致,否則系統的行為是未定義的。
  • 系統中所有節點都必須正好屬於一個全域群組。

在以下描述中,群組節點是指與本地節點屬於同一個全域群組的節點。

注意事項 (Notes)

  • 在一個節點失去與其全域群組中其他節點的連線,但與其他全域群組的節點有連線的情況下,來自另一個全域群組的請求可能會產生不正確或誤導性的結果。例如,隔離的節點可能具有關於其全域群組中註冊名稱的不準確資訊。
  • 函式 send/2,3 是不安全的。
  • 應用程式的分散高度依賴於全域群組的定義。不建議將應用程式分散到多個全域群組中,因為在故障轉移/接管時,已註冊的名稱可能會被移動到另一個全域群組。雖然沒有什麼能阻止這種情況發生,但應用程式程式碼必須能夠處理這種情況。

另請參閱 (See Also)

global, erl

摘要 (Summary)

類型 (Types)

沒有 PublishTypeGroupTuplePublishType 等於 normalGroupTuple 相同。

已註冊的名稱。

使用命令列標誌 -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()]}.

沒有 PublishTypeGroupTuplePublishType 等於 normalGroupTuple 相同。

-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 的清單,指定已訂閱 nodeupnodedown 訊息的程序。

-spec monitor_nodes(Flag) -> ok when Flag :: boolean().

變更呼叫程序對節點狀態變更訊息的訂閱。

如果 Flag 等於 true,則呼叫程序開始訂閱節點狀態變更訊息。如果等於 false,則停止訂閱。

已訂閱的程序會在群組節點連線或斷線時分別收到訊息 {nodeup, Node}{nodedown, Node}

-spec own_nodes() -> Nodes when Nodes :: [Node :: node()].

傳回所有群組節點的名稱,無論它們目前的狀態如何。

-spec registered_names(Where) -> Names when Where :: where(), Names :: [Name :: name()].

傳回在指定節點上或在指定的全域群組中全域註冊的所有名稱的清單。

-spec send(Name, Msg) -> pid() | {badarg, {Name, Msg}} when Name :: name(), Msg :: term().

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}}

-spec whereis_name(Name) -> pid() | undefined when Name :: name().

在任何全域群組中搜尋 Name

全域群組會按照它們在設定參數 global_groups 的值中出現的順序進行搜尋。

如果找到 Name,則會傳回對應的 pid。如果找不到該名稱,則該函式會傳回 undefined

-spec whereis_name(Where, Name) -> pid() | undefined when Where :: where(), Name :: name().

whereis_name(Name) 等效,但搜尋僅限於 Where 指定的節點或全域群組。