檢視原始碼 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 子規範。
提升 direct_broadcast/5
版本。
僅針對目前節點廣播特定主題的訊息。
僅針對目前節點從特定程序廣播特定主題的訊息。
傳回 PubSub 伺服器的節點名稱。
讓呼叫者訂閱 PubSub 轉接器的主題。
讓呼叫者退訂 PubSub 轉接器的主題。
連結到此區段 類型
連結到此區段 函數
@spec broadcast!(t(), topic(), message(), dispatcher()) :: :ok
提升 broadcast/4
版本。
@spec broadcast(t(), topic(), message(), dispatcher()) :: :ok | {:error, term()}
在整體叢集上廣播特定主題的訊息。
pubsub
- pubsub 系統的名稱topic
- 要廣播到的主題,例如:"users:123"
message
- 廣播的負載量
也可以將自訂轉發器作為第四個選用引數。請參閱模組文件中「自訂轉發」區段。
@spec broadcast_from!(t(), pid(), topic(), message(), dispatcher()) :: :ok
提升 broadcast_from/5
版本。
從特定程序在整體叢集上廣播特定主題的訊息。
pubsub
- pubsub 系統的名稱from
- 將傳送訊息的 pidtopic
- 要廣播到的主題,例如:"users:123"
message
- 廣播的負載量
預設轉發器會將訊息廣播到除了啟動廣播程序之外的所有訂閱者。
也可以將自訂轉發器作為第五個選用引數。請參閱模組文件中「自訂轉發」區段。
@spec child_spec(keyword()) :: Supervisor.child_spec()
傳回具有特定 options
的 pubsub 子規範。
:name
是 options
的必要部分。說明其餘選項如下。
options
選項
:name
- 要啟動的 PubSub 的名稱:adapter
- 要使用的適配器(預設為Phoenix.PubSub.PG2
):pool_size
- 要啟動的 PubSub 分割區數量(預設為每個 4 個核心一個分割區)
@spec direct_broadcast!(node_name(), t(), topic(), message(), dispatcher()) :: :ok
提升 direct_broadcast/5
版本。
廣播特定主題的訊息到特定節點。
node_name
- 目標節點名稱pubsub
- pubsub 系統的名稱topic
- 要廣播到的主題,例如:"users:123"
message
- 廣播的負載量
請勿在希望廣播到當前節點時使用此函數,因為它總是序列化,請改用 local_broadcast/4
。
也可以將自訂轉發器作為第五個選用引數。請參閱模組文件中「自訂轉發」區段。
@spec local_broadcast(t(), topic(), message(), dispatcher()) :: :ok
僅針對目前節點廣播特定主題的訊息。
pubsub
- pubsub 系統的名稱topic
- 要廣播到的主題,例如:"users:123"
message
- 廣播的負載量
也可以將自訂轉發器作為第四個選用引數。請參閱模組文件中「自訂轉發」區段。
@spec local_broadcast_from(t(), pid(), topic(), message(), dispatcher()) :: :ok
僅針對目前節點從特定程序廣播特定主題的訊息。
pubsub
- pubsub 系統的名稱from
- 將傳送訊息的 pidtopic
- 要廣播到的主題,例如:"users:123"
message
- 廣播的負載量
預設轉發器會將訊息廣播到除了啟動廣播程序之外的所有訂閱者。
也可以將自訂轉發器作為第五個選用引數。請參閱模組文件中「自訂轉發」區段。
傳回 PubSub 伺服器的節點名稱。
讓呼叫者訂閱 PubSub 轉接器的主題。
pubsub
- pubsub 系統的名稱topic
- 要訂閱的主題,例如:"users:123"
opts
- 選擇的選項清單。請參閱以下。
duplicate-subscriptions
重複訂閱
呼叫者應僅訂閱給定主題一次。允許多個 Pid/topic 組合的重複訂閱,這會導致傳送重複事件;然而,在使用 Phoenix.PubSub.unsubscribe/2
時,將會刪除所有重複訂閱。
options
選項
:metadata
- 提供附加到此訂閱的元資料。元資料可用於自訂發送機制。請參閱模組文件中的「自訂發送」區段
讓呼叫者退訂 PubSub 轉接器的主題。