如何更改动作电缆导轨中的 ping 间隔

Posted

技术标签:

【中文标题】如何更改动作电缆导轨中的 ping 间隔【英文标题】:How to change ping interval in action cable rails 【发布时间】:2016-05-20 09:36:26 【问题描述】:

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

有什么想法吗?

【问题讨论】:

【参考方案1】:

扩展@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

在您知道自己在做什么的情况下使用。

【讨论】:

【参考方案2】:

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

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

从this github issue 来看,关于改进 ping 行为以使其更有用的可能方法正在进行一些相关的辩论,例如考虑到网络延迟。

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

【讨论】:

以上是关于如何更改动作电缆导轨中的 ping 间隔的主要内容,如果未能解决你的问题,请参考以下文章

fping ping 包间隔时间详解

调用 requestLocationUpdates 后如何更改 FusedLocationApi 更新间隔

如何使用推送通知等更改位置间隔

如何间隔更改样式组件的样式?

如何更改 LocationRequest 的间隔

shell之ping减少时间间隔&ping的次数&用IP1去ping IP2的技巧