檢視原始碼 Phoenix.PubSub (Phoenix.PubSub v2.1.3)

即時發布/訂閱服務。

getting-started

開始使用

您可以在監督樹中直接啟動 Phoenix.PubSub

{Phoenix.PubSub, name: :my_pubsub}

現在您可以使用此模組中的功能來訂閱和廣播訊息

iex> alias Phoenix.PubSub
iex> PubSub.subscribe(:my_pubsub, "user:123")
:ok
iex> Process.info(self(), :messages)
{:messages, []}
iex> PubSub.broadcast(:my_pubsub, "user:123", {:user_update, %{id: 123, name: "Shane"}})
:ok
iex> Process.info(self(), :messages)
{:messages, [{:user_update, %{id: 123, name: "Shane"}}]}

adapters

轉接器

Phoenix PubSub 被設計為彈性且支援多個後端。它有兩個官方支援的後端

  • Phoenix.PubSub.PG2 - 作為 Phoenix.PubSub 一部分的預設轉接器。它使用分散式 Elixir,在伺服器之間直接交換通知。它支援與名稱一起提供的 :pool_size 選項,預設為 1。請注意,整個叢集的 :pool_size 必須相同,因此不要根據 System.schedulers_online/1 設定叢集大小,特別是如果您使用的是具有不同規格的機器時。

  • Phoenix.PubSub.Redis - 使用 Redis 在伺服器之間交換資料。它需要 :phoenix_pubsub_redis 相依。

請參閱 Phoenix.PubSub.Adapter 來實作自訂轉接器。

custom-dispatching

自訂發送

Phoenix.PubSub 允許開發人員傳遞 dispatcher 模組來執行自訂發送,該模組負責傳遞本地訊息。

此 dispatcher 必須在執行 PubSub 系統的所有節點上都可用。已提供模組的 dispatch/3 函式將會與訂閱項目、廣播程式辨識碼(為 pid 或 :none)以及要廣播的訊息一起呼叫。

您可能希望使用 dispatcher 為某些訂閱執行特殊傳遞。這可透過在訂閱期間傳遞 :metadata 選項來達成。例如,Phoenix Channels 使用自訂 value 來提供「fastlaning」,允許對數千或甚至數百萬使用者廣播訊息編碼一次並直接寫入 socket,而不是讓每個頻道進行編碼。

連結至此部分 總結

函數

在整體叢集上廣播特定主題的訊息。

從特定程序在整體叢集上廣播特定主題的訊息。

傳回具有特定 options 的 pubsub 子規範。

僅針對目前節點廣播特定主題的訊息。

僅針對目前節點從特定程序廣播特定主題的訊息。

傳回 PubSub 伺服器的節點名稱。

讓呼叫者訂閱 PubSub 轉接器的主題。

讓呼叫者退訂 PubSub 轉接器的主題。

連結到此區段 類型

@type dispatcher() :: module()
@type message() :: term()
@type node_name() :: atom() | binary()
@type t() :: atom()
@type topic() :: binary()

連結到此區段 函數

連結到此函數

broadcast!(pubsub, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec broadcast!(t(), topic(), message(), dispatcher()) :: :ok

提升 broadcast/4 版本。

連結到此函數

broadcast(pubsub, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec broadcast(t(), topic(), message(), dispatcher()) :: :ok | {:error, term()}

在整體叢集上廣播特定主題的訊息。

  • pubsub - pubsub 系統的名稱
  • topic - 要廣播到的主題,例如:"users:123"
  • message - 廣播的負載量

也可以將自訂轉發器作為第四個選用引數。請參閱模組文件中「自訂轉發」區段。

連結到此函數

broadcast_from!(pubsub, from, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec broadcast_from!(t(), pid(), topic(), message(), dispatcher()) :: :ok

提升 broadcast_from/5 版本。

連結到此函數

broadcast_from(pubsub, from, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec broadcast_from(t(), pid(), topic(), message(), dispatcher()) ::
  :ok | {:error, term()}

從特定程序在整體叢集上廣播特定主題的訊息。

  • pubsub - pubsub 系統的名稱
  • from - 將傳送訊息的 pid
  • topic - 要廣播到的主題,例如:"users:123"
  • message - 廣播的負載量

預設轉發器會將訊息廣播到除了啟動廣播程序之外的所有訂閱者。

也可以將自訂轉發器作為第五個選用引數。請參閱模組文件中「自訂轉發」區段。

@spec child_spec(keyword()) :: Supervisor.child_spec()

傳回具有特定 options 的 pubsub 子規範。

:nameoptions 的必要部分。說明其餘選項如下。

options

選項

  • :name- 要啟動的 PubSub 的名稱
  • :adapter - 要使用的適配器(預設為 Phoenix.PubSub.PG2
  • :pool_size - 要啟動的 PubSub 分割區數量(預設為每個 4 個核心一個分割區)
連結到此函數

direct_broadcast!(node_name, pubsub, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec direct_broadcast!(node_name(), t(), topic(), message(), dispatcher()) :: :ok

提升 direct_broadcast/5 版本。

連結到此函數

direct_broadcast(node_name, pubsub, topic, message, dispatcher \\ __MODULE__)

檢視原始碼

廣播特定主題的訊息到特定節點。

  • node_name - 目標節點名稱
  • pubsub - pubsub 系統的名稱
  • topic - 要廣播到的主題,例如:"users:123"
  • message - 廣播的負載量

請勿在希望廣播到當前節點時使用此函數,因為它總是序列化,請改用 local_broadcast/4

也可以將自訂轉發器作為第五個選用引數。請參閱模組文件中「自訂轉發」區段。

連結到此函數

local_broadcast(pubsub, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec local_broadcast(t(), topic(), message(), dispatcher()) :: :ok

僅針對目前節點廣播特定主題的訊息。

  • pubsub - pubsub 系統的名稱
  • topic - 要廣播到的主題,例如:"users:123"
  • message - 廣播的負載量

也可以將自訂轉發器作為第四個選用引數。請參閱模組文件中「自訂轉發」區段。

連結到此函數

local_broadcast_from(pubsub, from, topic, message, dispatcher \\ __MODULE__)

檢視原始碼
@spec local_broadcast_from(t(), pid(), topic(), message(), dispatcher()) :: :ok

僅針對目前節點從特定程序廣播特定主題的訊息。

  • pubsub - pubsub 系統的名稱
  • from - 將傳送訊息的 pid
  • topic - 要廣播到的主題,例如:"users:123"
  • message - 廣播的負載量

預設轉發器會將訊息廣播到除了啟動廣播程序之外的所有訂閱者。

也可以將自訂轉發器作為第五個選用引數。請參閱模組文件中「自訂轉發」區段。

@spec node_name(t()) :: node_name()

傳回 PubSub 伺服器的節點名稱。

連結到此函數

subscribe(pubsub, topic, opts \\ [])

檢視原始碼
@spec subscribe(t(), topic(), keyword()) :: :ok | {:error, term()}

讓呼叫者訂閱 PubSub 轉接器的主題。

  • pubsub - pubsub 系統的名稱
  • topic - 要訂閱的主題,例如:"users:123"
  • opts - 選擇的選項清單。請參閱以下。

duplicate-subscriptions

重複訂閱

呼叫者應僅訂閱給定主題一次。允許多個 Pid/topic 組合的重複訂閱,這會導致傳送重複事件;然而,在使用 Phoenix.PubSub.unsubscribe/2 時,將會刪除所有重複訂閱。

options

選項

  • :metadata - 提供附加到此訂閱的元資料。元資料可用於自訂發送機制。請參閱模組文件中的「自訂發送」區段
連結到此函數

unsubscribe(pubsub, topic)

檢視原始碼
@spec unsubscribe(t(), topic()) :: :ok

讓呼叫者退訂 PubSub 轉接器的主題。