我有一个应用程序,用于存储与可操作 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/