生产者需要和 rabbitmq 保持心跳吗?

消费这需要一直不停的和 rabbitmq server 保持心跳,来保证消息的正确消费。

假设我需要一个长连接来减少创建连接的开销!那投递消息的时候,生产者需要和 rabbitmq server 保持心跳吗?

毕竟主线程主要干正事。我想知道这个心跳机制是需要单独起一个心跳线程来做这件事情吗?

pika.exceptions.StreamLostError: Stream connection lost: ConnectionResetError(104, 'Connection reset by peer')

Rabbitmq 不同于 Mysql,后者不需要心跳机制。

rabbitmq 的心跳是双向的吗?是服务端会主动发给客户端,客户端也会主动发给服务端吗?

3327 36.310386435 192.168.31.203 → 192.168.31.245 AMQP 74 Heartbeat 
 5823 66.311137121 192.168.31.203 → 192.168.31.245 AMQP 74 Heartbeat 
 5991 68.314023421 192.168.31.245 → 192.168.31.203 AMQP 74 Heartbeat 
 8509 96.312153331 192.168.31.203 → 192.168.31.245 AMQP 74 Heartbeat 

我看到一个 nameko 的服务可以做心跳检测,但是我是用 netstat –nltp|grep 2053969 命令却看不到进程占用任何端口,这是如何接受到 server 发来的心跳请求的呢?


更新,可以看到端口占用:

─➤  sudo netstat -antup|grep 2053969                                                                               1 ↵
[sudo] bot 的密码: 
tcp        0      0 192.168.31.245:43124    192.168.31.203:5672     ESTABLISHED 2053969/python3.10  
阅读 2.9k
1 个回答

首先客户端要向服务端进行主动连接,然后心跳是单向的,是服务器向客户端发起的,客户端如果没有响应服务端就会视为连接无效,就会主动断开。
网络故障很多种,有时很微妙(比如,丢包比率和高)。 分布式的tcp连接采取适中的时间(比如Linux默认配置大约11分钟),方便操作系统检测。AMQP 0-9-1提供heartbeat(心跳)特性来确保应用服务层及时发现已崩溃的连接(和完全无相应的peers)。 心跳机制也能保证进程不被某些网络设备给杀掉。
心跳每 heartbeat timeout / 2 秒发送一次,服务器两次没有接收到则断开tcp连接,以前的连接将失效,客户端需要重新连接。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏