Phoenix websocket套接字.disconnect()与channel.leave()的比较
我正在通读有关断开插座或离开频道的方法 我天真的理解是,Phoenix websocket套接字.disconnect()与channel.leave()的比较,websocket,elixir,phoenix-framework,Websocket,Elixir,Phoenix Framework,我正在通读有关断开插座或离开频道的方法 我天真的理解是,频道#离开 取消订阅服务器事件,并指示通道在服务器上终止 和socket#disconnect保持通道服务器端,允许重新连接 所以,我的问题是什么时候使用其中一个和另一个 听起来有两种情况需要考虑: 还有其他客户端订阅了同一频道,因此#leave会切断它们的连接,倾向于#disconnect 但是,如果存在用户/帐户损耗,从不调用leave会在服务器上维护“死”通道,对于长时间运行的进程,这可能是一个问题吗 我想得对吗?如果我们选择仅使用#
频道#离开
取消订阅服务器事件,并指示通道在服务器上终止
和socket#disconnect
保持通道服务器端,允许重新连接
所以,我的问题是什么时候使用其中一个和另一个
听起来有两种情况需要考虑:
#leave
会切断它们的连接,倾向于#disconnect
leave
会在服务器上维护“死”通道,对于长时间运行的进程,这可能是一个问题吗#disconnect
,是否应该执行定期清理任务以杀死长时间运行的“死”通道
谢谢 Phoenix的实时接口构建在两个默认的公共抽象上,一个套接字接口,客户端通过它进行连接-这通常是一个websocket(尽管它可以回退到longpolling或使用其他传输),这是在客户端和服务器之间创建的“连线”。通常,您通过令牌来调解此连接,以确定客户端是否能够打开该套接字连接。它在
user\u socket.ex
中指定
然后是channel interface,它是一个gen_服务器,具有特定的句柄(api),可以通过“wire”接收传入消息。您还可以使用授权逻辑来允许订阅某个频道(“加入”),并且它可以因频道(甚至主题)而异
每个客户端可以连接到1个套接字和0到N个通道。连接到下面某个频道的客户端只需(简化)将给定的套接字注册到发布者-订户接口(Phoenix的PubSub),并为订阅该特定组合的每个套接字的“channel:room”创建一个进程
如果您启动:observer.start
从您的iex
shell启动,并转到进程
选项卡,然后从两个不同的客户端加入相同的“channel:topic”,您将看到将有两个通道进程,而不是一个。如果您从Elixir.YourWeb.PubSub.Local0中看到应用程序树,您还将看到两个进程“连接”到它/从它连接到它
这意味着,当您从前端发出channel.leave()
时,您的服务器将从您刚刚“离开”的“channel”取消此客户端的订阅,并且处理它的进程将关闭。频道休假是从特定的channel:topic
组合取消订阅特定套接字(客户端)。这不会干扰连接到同一主题的其他客户端。在这种情况下,插座(“电线”)仍处于连接状态。您可以重新加入频道,也可以加入其他频道,而无需“请求”(协商)再次连接到套接字
另一方面,如果您发出socket.disconnect()
,您就是在“拔掉电线”,从而从以前订阅的所有频道中取消订阅该特定套接字(客户端)。这会关闭与给定套接字相关的所有进程,但也不会干扰其他客户端的套接字/连接/订阅
如果所有客户机都离开给定的通道(通过“离开”或“断开”它们的套接字),您将看到该给定通道将不会有任何进程运行。一旦另一个客户端加入该频道,就会为该特定客户端创建一个进程&channel:topic
tldr;回答你的问题:
- 1) 没有
- 2) 没有