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