2017-10-16 53 views
1

我有一個應用程序,它存儲了一個到一個actioncable通道的所有連接的計數,在subscribed上遞增,並在unsubscribed上遞減。然而,我發現當服務器(Puma)關閉時,部署到Heroku的問題不會成爲活動連接unsubscribed。因此,當新版本的應用程序啓動時,連接計數比應該高。如何強制ActionCable在Heroku中部署新代碼時斷開所有客戶端

代碼爲我的特殊通道:

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的所有活動連接?

回答

0

你可以定義一個rake任務斷開所有客戶端,然後用Heroku的釋放DYNOS運行(所以它會在您每次部署時間):

procfile:

release: bundle exec rake reset_action_cable_consumers 

耙子任務:

# reset_action_cable_consumers.rake 

# This should work 
ActionCable.server.remote_connections.disconnect 

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

是的,這是我想到的解決方案,我會給它一個 – JeremyKirkham

+0

但它不會重新連接用戶,除非他們刷新頁面? –

+1

@NicolasMaloeuvre這個問題沒有問,所以不會。 –