gpt4 book ai didi

sockets - Phoenix Channels - 每个插槽有多个 channel

转载 作者:行者123 更新时间:2023-12-04 23:16:26 25 4
gpt4 key购买 nike

我正在编写一个使用 Elixir Channels 来处理实时事件的应用程序。我知道每个客户端将打开 1 个套接字,并且可以在其上多路复用多个 channel 。所以我的应用程序是一个聊天应用程序,其中用户是多个群聊的一部分。我有 1 个名为 MessageChannel 的 Phoenix Channel,其中 join 方法将处理动态主题。

def join("groups:" <> group_id, payload, socket) do
....

假设 John 加入了组/主题 A 和 B,而 Bob 只加入了组/主题 B。当 john 向组/主题 A 发送消息时, broadcast!/3还会将该消息发送给 Bob 是否太正确?因为 handle_in没有消息发送到哪个主题/组的上下文。

我将如何处理它,以使 Bob 不会收到发送到 A 组的事件。我的设计是否正确?

最佳答案

Because handle_in doesn't have a context of which topic/group the message was sent to.



Phoenix.Channel.broadcast/3被调用,显然它确实具有与消息关联的主题(从签名中并不明显)。可以看到以 on this line of channel.ex开头的代码:
def broadcast(socket, event, message) do
%{pubsub_server: pubsub_server, topic: topic} = assert_joined!(socket)
Server.broadcast pubsub_server, topic, event, message
end

所以当调用 broadcast/3使用套接字进行,它模式匹配当前主题,然后调用底层 Server.broadcast/4 .

(如果你像我一样好奇,这反过来会调用底层的 PubSub.broadcast/3 ,它会做一些分发魔法来将调用路由到你配置的 pubsub 实现服务器,很可能使用 pg2,但我离题了......)

所以,我在阅读 Phoenix.Channel docs 时发现这种行为并不明显。 ,但他们确实在 Incoming Events 的 phoenixframework channel 页面中明确说明了这一点:

broadcast!/3 will notify all joined clients on this socket's topic and invoke their handle_out/3 callbacks.



所以它只是在“关于这个套接字的主题”上广播。他们将同一页面上的主题定义为:

topic - The string topic or topic:subtopic pair namespace, for example “messages”, “messages:123”



因此,在您的示例中,“主题”实际上是主题:子主题对命名空间字符串: "groups:A""groups:B" . John 必须在客户端分别订阅这两个主题,因此您实际上会引用两个不同的 channel ,即使它们使用相同的套接字。因此,假设您使用的是 javascript 客户端, channel 创建看起来像这样:
let channelA = this.socket.channel("groups:A", {});
let channelB = this.socket.channel("groups:B", {});

然后,当您从客户端在 channel 上发送消息时,您仅使用具有主题的 channel ,该主题在服务器上得到模式匹配,如我们上面所见。
channelA.push(msgName, msgBody);

关于sockets - Phoenix Channels - 每个插槽有多个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40414566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com