Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Phoenix websocket套接字.disconnect()与channel.leave()的比较_Websocket_Elixir_Phoenix Framework - Fatal编程技术网

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) 没有

    但是,如果您有从通道本身内部派生的长时间运行的进程,当没有客户端连接到特定的通道:topic时,应该关闭这些进程,那么您当然需要确保清理它们。除了Erlang的常规监控功能外,Phoenix还有一个状态界面,允许您跟踪它