python实时连接rabbitmq_如何重新连接RabbitMQ?

RabbitMQ使用心跳来检测和关闭“死”连接,并防止网络设备(防火墙等)终止“空闲”连接。从版本3.5.5开始,默认超时设置为60秒(以前为~10分钟)。从docs:Heartbeat frames are sent about every timeout / 2 seconds. After two missed heartbeats, the peer is considered to be unreachable.

Pika的阻塞连接的问题是,在进行某些API调用(例如,channel.basic_publish(),connection.sleep()等)之前,它无法响应心跳。

到目前为止我发现的方法是:

增加或取消超时

RabbitMQ在建立连接时与客户端协商超时。理论上,应该可以使用heartbeat_interval参数用更大的值覆盖服务器默认值,但是当前的Pika版本(0.10.0)在服务器和客户端提供的值之间使用min值。此问题已在当前的master上修复。

另一方面,可以通过将heartbeat_interval参数设置为0来完全停用heartbeat功能,这可能会使您陷入新问题(防火墙断开连接等)

重新连接

扩展@itsafire的答案,您可以编写自己的publisher类,以便在需要时重新连接。一个简单的实现示例:import logging

import json

import pika

class Publisher:

EXCHANGE='my_exchange'

TYPE='topic'

ROUTING_KEY = 'some_routing_key'

def __init__(self, host, virtual_host, username, password):

self._params = pika.connection.ConnectionParameters(

host=host,

virtual_host=virtual_host,

credentials=pika.credentials.PlainCredentials(username, password))

self._conn = None

self._channel = None

def connect(self):

if not self._conn or self._conn.is_closed:

self._conn = pika.BlockingConnection(self._params)

self._channel = self._conn.channel()

self._channel.exchange_declare(exchange=self.EXCHANGE,

type=self.TYPE)

def _publish(self, msg):

self._channel.basic_publish(exchange=self.EXCHANGE,

routing_key=self.ROUTING_KEY,

body=json.dumps(msg).encode())

logging.debug('message sent: %s', msg)

def publish(self, msg):

"""Publish msg, reconnecting if necessary."""

try:

self._publish(msg)

except pika.exceptions.ConnectionClosed:

logging.debug('reconnecting to queue')

self.connect()

self._publish(msg)

def close(self):

if self._conn and self._conn.is_open:

logging.debug('closing queue connection')

self._conn.close()

其他可能性

我还没有探索的其他可能性:将RabbitMQ连接和“publish”代码保持在后台线程上,后台线程定期调用connection.sleep()来响应服务器的心跳。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值