7

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

任何想法?

4

2 回答 2

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;

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

事实上,ruby 甚至会警告你:

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

当您知道自己在做什么时才使用它。

于 2016-10-19T08:08:55.323 回答
3

有趣的是,从 Rails 5.0.0.rc1 开始,您似乎无法配置 ping interval。它在ActionCable::Server::Connections 模块中被定义为一个常量。

您可能可以在初始化程序中重新定义此常量,以使服务器以不同的时间间隔发送 ping,但这最终仍然对您没有帮助,因为接收 ping 的客户端代码也具有静态定义的超时(设置为 6 秒,即两个服务器错过了 ping)。当它达到 6 秒超时而没有来自服务器的 ping 时,它会尝试重新连接。而且我不确定您如何能够在 Javascript 客户端代码中覆盖此常量

这个 github 问题来看,关于改进 ping 行为以使其更有用的可能方法正在进行一些相关的辩论,例如通过考虑网络延迟。

但本质上,这个时间间隔目前是不可配置的,除非你想要一个小于 3 秒的 ping 时间间隔,否则我现在看不到在 Rails 中覆盖它的简单方法。

于 2016-05-20T10:16:05.747 回答