ruby-on-rails - 将新代码部署到 Heroku 时如何强制 ActionCable 断开所有客户端的连接

标签 ruby-on-rails heroku actioncable

我有一个应用程序,用于存储与可操作 channel 的所有连接的计数,在订阅时递增,在取消订阅时递减。但是,我发现了一个问题,即当服务器 (Puma) 出现故障时,部署到 Heroku 不会取消订阅事件连接。因此,当新版本的应用程序启动时,连接计数会高于应有的数量。

我的特定 channel 的代码:

class PostChannel < ApplicationCable::Channel
  attr_reader :subscribers

  def subscribed
    channel_name = "TestChannel#{params[:post_id]}"
    stream_from channel_name
    user_ids = active_users channel_name
    user_ids << connection.current_user.id
    update_users channel_name, user_ids
  end

  def unsubscribed
    channel_name = "TestChannel#{params[:post_id]}"
    user_ids = active_users channel_name
    user_ids.delete_at(user_ids.index(connection.current_user.id) ||
                       user_ids.length)
    update_users channel_name, user_ids
  end

  def active_users(channel_name)
    JSON.parse(Redis.current.hget('actioncable', channel_name) || '[]')
  end

  def update_users(channel_name, user_ids)
    Redis.current.hset('actioncable', channel_name, user_ids.to_json)
    ActionCable.server.broadcast(
      channel_name,
      users: user_ids,
      action: 'UsersChanged'
    )
  end
end

如何强制 ActionCable 取消订阅 Heroku 部署上的所有事件连接?

最佳答案

您可以定义一个 rake 任务,断开所有客户端的连接,然后使用 heroku release dynos 运行它(以便它在每次部署时运行):

进程文件:

release: bundle exec rake reset_action_cable_consumers

rake 任务:

# reset_action_cable_consumers.rake

# This should work
ActionCable.server.remote_connections.disconnect

# Other solution
App.cable.subscriptions.each{|subscription| subscription.unsubscribe()}

关于ruby-on-rails - 将新代码部署到 Heroku 时如何强制 ActionCable 断开所有客户端的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46763966/

相关文章:

docker - 如何通过 app.json 在 Heroku 上运行 Docker Hub 容器?

ruby-on-rails - 如何更改 Action 电缆 rails 中的 ping 间隔

ruby-on-rails - 收不到广播

ruby-on-rails - Rails 语义 UI 模态创建附加 Dom 元素

python - 运行 heroku local 时出错

ruby-on-rails - Rails heroku 部署错误

jquery - 如何使用 jQuery 将值传递到 coffescript ActionCable

ruby-on-rails - 如何让自定义 Rake 任务在 Sinatra 中运行?

ruby-on-rails - 自动刷新 <div> 无需重新加载整个页面

ruby-on-rails - Rails - 阻止除某些 IP 地址之外的所有 IP 地址