gpt4 book ai didi

ruby-on-rails - ActionCable 超时 - Heroku 上的 "Idle Connection"

转载 作者:行者123 更新时间:2023-12-04 01:14:57 26 4
gpt4 key购买 nike

我们在 Heroku 上使用 ActionCable 已经有一段时间了,总体来说效果很好。但是,我们看到了 H15 Idle Connection每天错误很多次。他们总是有 path=/cable和一个长 service时间,所以连接肯定是活跃和健康的。

Dec 2016 08:32:22.057 heroku router - - at=error code=H15 desc="Idle connection" 
method=GET path="/cable" host=<our host> dyno=web.2 connect=1ms service=928755ms status=503

我相信我们的设置非常标准,并且严格遵循 ActionCable 的 Rails 文档:
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user

def connect
self.current_user = find_verified_user
end

protected

def find_verified_user
if current_user = User.find_by(id: cookies.signed[:user_id])
current_user
else
# reject_unauthorized_connection
end
end
end
end

我们有三个简单的 channel ,如下所示:
class ActivitiesChannel < ApplicationCable::Channel  

def subscribed
stream_from "activities_#{current_user.id}" if current_user
end
end

编辑添加 - Javascript 代码:
app/assets/javascripts/channels/setup.js :
//= require cable

this.App || (this.App = {});
App.cable = ActionCable.createConsumer();
app/assets/javascripts/channels/notifications.js :
App.notifications = App.cable.subscriptions.create('NotificationsChannel', {  
received: function(data) {
return this.showMessage(data);
},
showMessage: function(data) {
showNotice(data.message);
}
});

我对 ActionCable 和 WebSockets 还很陌生,所以我不确定如何解决这个问题。我们正在使用 Ruby 2.3.1 运行 Rails 5.0.0.1

任何帮助、上下文或故障排除提示将不胜感激!

最佳答案

编辑:我刚刚意识到这是一个老问题。不知道为什么这会出现在我的提要上。无论如何,它可能会在 future 帮助某人。

我相信当有人在 channel 上没有任何事件的情况下保持页面打开并且连接保持打开但空闲 55 秒时,Heroku 会关闭连接并显示错误 Idle connection .您必须通过实现某种 ping 系统来保持连接处于事件状态,该系统会定期向服务器发送消息,服务器只需发送 ok作为回应。一个简单的例子是:
app/assets/javascripts/channels/notifications.js :

App.notifications = App.cable.subscriptions.create('NotificationsChannel', {  
received: function(data) {
// ignore the data when the type is 'pong' as it is just server's response to our 'ping'
if(data.type !== 'pong'){
return this.showMessage(data);
}
},
showMessage: function(data) {
showNotice(data.message);
},
ping: function() {
return this.perform('ping', {
message: {"event": "ping"}
});
}
});
document.addEventListener("DOMContentLoaded", function(event) {
// this will send a ping event every 30 seconds
setInterval(function(){
App.notifications.ping()
}, 30000);
});

在服务器端,您需要向“ping”事件发送响应消息,例如“pong”。您可以将该响应发送给同一用户,或广播给所有用户,具体取决于您的 channel 设置和要求。
class NotificationsChannel < ApplicationCable::Channel  

def subscribed
stream_from "notifications_#{current_user.id}" if current_user
end

# data is not required, you can choose to ignore it or not send it at all from the client-side.
def ping(data)
NotificationsChannel.broadcast_to("notifications_#{current_user.id}", { message: 'pong' })
end
end

即使用户空闲,这也应该使连接保持事件状态。

自从第一次发布以来,我就没有使用过 ActionCable。如果某些东西不起作用或有任何语法错误,请告诉我,我会尝试修复。

关于ruby-on-rails - ActionCable 超时 - Heroku 上的 "Idle Connection",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40960920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com