如何在动作电缆轨道中更改ping间隔

时间:2016-05-20 09:36:26

标签: ruby-on-rails websocket ping actioncable

我使用ActionCable并在每3秒间隔(在ActionCable库中提到)接收来自服务器的ping。 我的问题是:如何在订阅时更改ping间隔?

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

扩展@BoraMa的答案:

你可以像这样覆盖后端的常量:

# config/initializers/action_cable.rb
module ActionCable
  module Server
    module Connections
      BEAT_INTERVAL = 5
    end
  end
end

在客户端,您还需要覆盖值:

// this should be after //= require action_cable
// but before any App.cable.subscriptions.create call
// the value here *must* be 2 times the backend's value
ActionCable.ConnectionMonitor.staleThreshold = 10;

请注意,这种方法通常是一个非常糟糕的主意:弄乱内部变量是导致错误和问题的直接方法之一。

事实上,红宝石甚至会警告你:

config/initializers/action_cable.rb:7: warning: already initialized constant ActionCable::Server::Connections::BEAT_INTERVAL

如果您知道自己在做什么,请仅使用

答案 1 :(得分:2)

有趣的是,从Rails 5.0.0.rc1开始,似乎你无法配置ping间隔。它被定义为ActionCable::Server::Connections module中的常量。

您可能在初始化程序中重新定义此常量以使服务器以不同的间隔发送ping但最终仍然无法帮助您,因为接收ping 的客户端代码也具有静态定义的超时(设置为6秒,即从服务器丢失两次ping)。当它在没有来自服务器的ping的情况下达到6秒超时时,它会尝试重新连接。我不确定你如何能够覆盖this constant in the Javascript client code

this github issue判断,有一些相关的争论正在进行,关于改善ping行为的可行方法更有用,例如:通过考虑网络延迟。

但实质上,此时间隔是不可配置的,除非您希望ping间隔小于3秒,否则我现在看不到在Rails中覆盖它的简单方法。