【问题标题】:List of active websocket connections with puma and tubesock与 puma 和 tubesock 的活动 websocket 连接列表
【发布时间】:2016-01-10 05:00:29
【问题描述】:

我正在使用 Puma 和 Tubesock 处理 websocket 消息,并希望访问处理发送消息的库文件中的已连接 websocket 列表。我要做的是检查用户是否通过 websocket 连接,如果没有通过推送通知发送消息。

用户使用包含其用户 ID 的路径连接到 websocket:

# config/routes.rb
Rails.application.routes.draw do
  get 'ws/:user_id', to: 'socket#ws', as: :socket
end

并在控制器内部使用 Tubesock

class SocketController < ApplicationController
  include Tubesock::Hijack

  def ws
    hijack do |tubesock|
      @wsTube = tubesock

      tubesock.onopen do
        socket_user = User.find_by_user_id(params[:user_id])
        # setup to send/receive messages through /lib/notification.rb
      end

      tubesock.onclose do
        # cleanup when connection closes
      end
    end
  end
end

我曾考虑在数据库中为用户添加一个属性,但我担心连接是否突然结束,例如在重新启动期间,然后该属性会说已连接,如果事实并非如此。理想情况下,我想检查活动连接,而不是在打开和关闭期间切换属性。

【问题讨论】:

    标签: ruby-on-rails ruby websocket puma


    【解决方案1】:

    考虑到您的问题,而不是您问题的标题,在我看来,您应该只在 Tubesock#send_data 返回真实值时将消息标记为“已读”。

    阅读源代码,Tubesock#send_data 似乎会在成功时返回一个数字,或者在失败时返回 nil(请注意,如果 websocket 具有 onclose 回调,它可能会返回一个未确定的值)。

    至于将 Tubesock 套接字存储在数据库中,这是不可能的,因为 Tubesock 包含套接字对象,它是一个打开的文件描述符,不能以持久方式存储到数据库中。

    您可能应该将数据存储在本地内存中,例如在哈希中。

    如果 Tubesock 支持连接的 UUID,那就另当别论了,它还允许您从单个进程扩展并使用 Redis...但快速浏览一下(我不是 Tubesock 用户),好像不是这样的。

    【讨论】:

    • 所以如果我明白你在说什么,而不是查看打开的 websocket 连接列表,我应该总是尝试通过 websocket 发送数据,如果它不成功,做一个推送通知.
    • 有两种可能的情况: 1. 无法定位用户打开的套接字。或者 2. websocket 发送(写入)消息失败。在这两种情况下,您都可以恢复推送通知...我还会考虑可伸缩性的问题...看来这只有在所有 websocket 都在同一个进程上时才有效。一旦你开始通过添加进程或服务器来扩展你的应用程序,你要么需要在 Tubesock 之上编写自己的 Pub/Sub 层,要么切换到不同的 websocket 解决方案。
    猜你喜欢
    • 2021-01-20
    • 2017-05-03
    • 2012-01-03
    • 1970-01-01
    • 2017-07-05
    • 2015-07-13
    • 1970-01-01
    • 2021-12-09
    • 2015-07-08
    相关资源
    最近更新 更多