明确几个事情

前提知识

Q:为什么 rabbitmq server 需要一个心跳机制

A:首先,我们要知道 amqp 是基于 tcp 的,tcp 是有心跳机制的。那么为什么不用 tcp 的心跳来保证『可靠性』呢?答案就是 tcp 的心跳,从 amqp 层面是无法介入的,我们需要一个应用层心跳机制。比如使用 tcp 心跳发现『网络不可达』需要十几分钟,这在一些场景下,太长了,不可接受。

参考:
rabbitmq 消费者为什么需要心跳
生产者需要和 rabbitmq 保持心跳吗?
TCP 连接断开之后,为什么对端需要 10 分钟往上才能知道?
rabbitmq 消费消息的时候如何保持心跳

Q:rabbitmq 的心跳机制使用的是 pull 还是 push 模型?

A:是 push 模型。首先,rabbitmq server 会发一个心跳包到 client。然后 client 收到这个 heartbeat 之后要回复一个 heartbeat 给 rabbitmq server。这样一来一回,一个心跳检查就完成了。

如图所示,192.168.31.245 是 rabbitmq server,192.168.31.103 是 rabbitmq client

图片.png

使用 kombu 编写相关代码

生产者心跳

使用 nameko 的时候,发现 producer,一般是关闭心跳的。

如果想开启 producer 的 心跳,可以看下面的链接

参考:connection.heartbeat_check does not seem to heartbeat?

消费者心跳

参考:kombu 维护消费者心跳


universe_king
3.4k 声望678 粉丝