У меня есть приложение, которое хранит количество всех подключений к каналу actioncable, увеличивая его на subscribed
и уменьшая на unsubscribed
. Однако я обнаружил проблему, из-за которой развертывание в Heroku не будет unsubscribed
активных соединений, когда сервер (Puma) выйдет из строя. Таким образом, когда новая версия приложения запускается, количество подключений выше, чем должно быть.
Код для моего конкретного канала:
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?