如何在不重启的情况下更改 RabbitMQ 心跳

How to change RabbitMQ Heartbeat without restart

这里有几个关于 RabbitMQ 心跳的问题,但我还没有找到一个解决如何实际更改 60 seconds(以前版本中的 580 seconds)的默认心跳值的问题。

如果消费者 运行ning 的时间超过 60 seconds 并且无法产生任何可以算作心跳的流量(例如 PHP consumers),RabbitMQ 将考虑到消费者已死,关闭连接,但消费者可能会继续 运行,当它尝试生成 ACK 时,连接将关闭,您会收到如下错误消息:

Broken pipe or closed connection

consumer端的heartbeat可以设置大一点,比如1800 seconds,但是如果broker的配置没有改变,那么会使用小一点的值,如果是默认值然后 60 seconds。来自 RabbitMQ 文档:

The broker and client will attempt to negotiate heartbeats by default. When both values are non-0, the lower of the requested values will be used. If one side uses a zero value (attempts to disable heartbeats) but the other does not, the non-zero value will be used.

要更改心跳值,可以在 /etc/rabbitmq/rabbitmq.conf 中添加以下行(使用 new configuration format

heartbeat = 1800

这个需要重启,所以问题是:如何在不重启的情况下更改rabbitmq心跳值?

我正在回答我自己的问题,因为我花了一些时间才找到如何做到这一点,documentation on how to use eval 不是很有帮助。

可以使用 eval 更改 RabbitMQ 配置值:

Evaluate an arbitrary Erlang expression.

然后使用 rabbitmqctl eval 可以在不重新启动的情况下更改心跳值,如下所示:

# Set
rabbitmqctl eval 'application:set_env(rabbit, heartbeat, 1800).'

# Get 
rabbitmqctl eval 'application:get_env(rabbit, heartbeat).'