查看源代码 Phoenix.PubSub (Phoenix.PubSub v2.1.3)

实时发布/订阅服务。

入门

入门

您可以在您的监督树中直接启动 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"}}]}

适配器

适配器

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 以实现自定义适配器。

自定义调度

自定义调度

Phoenix.PubSub 允许开发者通过传递一个 dispatcher 模块来执行自定义调度,该模块负责本地消息传递。

调度程序必须在运行 PubSub 系统的所有节点上可用。给定模块的 dispatch/3 函数将使用订阅条目、广播程序标识符(一个 pid 或 :none)以及要广播的消息来调用。

您可能希望使用调度程序为某些订阅执行特殊传递。这可以通过在订阅期间传递 :metadata 选项来完成。例如,Phoenix Channels 使用自定义 value 来提供“快速通道”,允许广播给数千甚至数百万用户的消息被编码一次并直接写入套接字,而不是每个通道被编码一次。

链接到本节 摘要

函数

在给定主题上向整个集群广播消息。

从给定进程在整个集群上广播给定主题上的消息。

返回使用给定 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 - 可选的选项列表。见下文。

重复订阅

重复订阅

调用者只应该订阅一个给定主题一次。Pid/主题对的重复订阅是允许的,并将导致发送重复事件;但是,当使用 Phoenix.PubSub.unsubscribe/2 时,所有重复订阅都将被删除。

options

选项

  • :metadata - 提供要附加到此订阅的元数据。元数据可以被自定义调度机制使用。请参阅模块文档中的“自定义调度”部分
链接到此函数

unsubscribe(pubsub, topic)

查看源代码
@spec unsubscribe(t(), topic()) :: :ok

从 PubSub 适配器的主题取消订阅调用者。