遇到RabbitMQ 的 `channel_max` 限制报错

raise exception aiormq.exceptions.ConnectionNotAllowed: NOT_ALLOWED -
number of channels opened (2047) has reached the negotiated
channel_max (2047)

这个错误表明你遇到了 RabbitMQ 的 channel_max 限制。RabbitMQ 服务器与客户端在建立连接时会“协商”一个最大通道数(channel_max),默认通常是 2047。当你的应用创建的通道数量达到这个上限时,就会抛出 NOT_ALLOWED - number of channels opened (2047) has reached the negotiated channel_max (2047) 错误。

问题分析:

这个问题是另一个层面的问题:通道(Channel)的生命周期管理不当

存在一个关键误解:

通道(Channel)不应该被复用或“池化”。

每次使用完通道后,它应该被 关闭,而不是放回连接池。如果你反复从同一个连接创建新通道但不关闭它们,通道计数就会不断累积,最终达到 channel_max 限制。


✅ 正确的做法

  1. 每个操作使用一个新通道
  2. 操作结束后,通道必须被关闭
  3. 连接可以复用,但通道不能

🔧 修复方案:修改 get_channel() 上下文管理器

你需要确保每次 get_channel() 使用完毕后,通道被关闭,而连接被放回池中。

@asynccontextmanager
async def get_channel(self) -> AsyncGenerator[AbstractRobustChannel, None]:
    """
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓仙生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值