【问题标题】:Does the RabbitMQ client have to request a heartbeat timeout, or does the server default to 60?RabbitMQ 客户端是否必须请求心跳超时,还是服务器默认为 60?
【发布时间】:2019-07-08 15:47:36
【问题描述】:

根据 RabbitMQ 文档:

心跳超时值定义了对等点经过多长时间 RabbitMQ 应该认为 TCP 连接不可达(关闭),并且 客户端库。这个值是在客户端和客户端之间协商的 连接时的 RabbitMQ 服务器。客户必须是 配置为请求心跳。在 RabbitMQ 3.0 及更高版本中, 默认情况下,代理将尝试协商心跳(尽管 客户仍然可以否决它们)。超时以秒为单位,并且 默认值为 60(3.5.5 版本之前为 580)。

(https://www.rabbitmq.com/heartbeats.html)

我在解码“客户端必须配置为请求心跳”语句时遇到问题。

这是否意味着如果客户端不请求心跳,则不会发送心跳消息?如果是这样,服务器默认的意义何在?

我查看了 Java 和 C# 客户端,它们的客户端默认值都是 60 秒。有没有默认这个的客户端?

【问题讨论】:

  • 或者心跳是双向的吗?

标签: rabbitmq heartbeat


【解决方案1】:

来自文档:

请注意,如果 RabbitMQ 服务器有非零心跳超时 配置(这是从 3.6.x 开始的版本中的默认设置), 客户只能降低价值,不能增加价值。

在任何情况下,服务器指定默认值都没有什么坏处。在协商心跳时,服务器会向客户端发送其首选项,并且可以将客户端配置为考虑服务器默认值。

https://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune

https://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune-ok

【讨论】:

  • 那么明确一点:如果服务端有默认值,客户端不发送心跳请求值,那么心跳就不会发生?
  • 客户端必须发送一个值,这是协商阶段的一部分。但是,客户端可以在 tune-ok 帧中发送零作为心跳值来禁用心跳超时。据我所知,rabbitmq 中没有其他超时机制,因此,如果您禁用心跳超时,则只能在操作系统发出 TCP 连接中断信号时检测到连接中断(这可能永远不会发生)
  • 好的,谢谢。您如何解释此 javascript 客户端的文档:squaremobius.net/amqp.node/channel_api.html#heartbeating 即“如果您提供 0 作为心跳参数(或默认为 0),则使用服务器值。这意味着您只能在服务器值为也是 0。有关详细信息,请参见此处。”
  • 哦,抱歉,客户端实现中似乎有一个约定,为了禁用心跳超时,客户端和服务器都必须将其设置为零。这是js客户端github.com/squaremo/amqp.node/blob/master/lib/…中的行这里是java客户端github.com/rabbitmq/rabbitmq-java-client/issues/163中的同一行@
  • 应该注意,服务器需要这个,因为它会耗尽资源来跟踪断开的连接,否则
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2017-02-05
相关资源
最近更新 更多