rabbitmq channel 应该为消费者预留?

rabbitmq channel should be reserved for consumers?

我有一个 Rabbitmq 池 channels,还有一些 queuesconsumers

这样我可以得到一个频道: var channel = concurrentChannelPool.Get();

每当我用那个 channel 完成工作时,我都会打电话给 concurrentChannelPool.Return(channel);

由于我之前定义的某些原因,concurrentChannelPool 可能会在频道上调用 dispose

现在我的问题是,我可以return一个用于注册消费者的渠道吗?

当我们注册消费者然后删除用于该消费者的渠道时会发生什么。消费者是否收到消息?

这是我注册消费者的方式:

var consumer = new AsyncEventingBasicConsumer(channel);
consumer.Received += async (ch, ea) =>
{
    var body = ea.Body;
    // ... process the message
    var bodyString = Encoding.UTF8.GetString(body, 0, body.Length);

    await eventHandler(ea.BasicProperties, bodyString);

    if (!autoAck)
    {
        channel.BasicAck(ea.DeliveryTag, false);
    }

};
String consumerTag = channel.BasicConsume(queueName, autoAck, consumer);

我在我的 dotnet 核心应用程序上使用这个池作为服务,所以我需要一个通道池。

只要频道没有关闭,都可以return。这样做是有危险的,因为如果您的频道关闭,所有消费者都会因此停止。

通常,每个队列只需要一个通道,这意味着每个通道一个消费者。但是,您可以在同一队列的该通道上打开多个消费者,以增加吞吐量。

通常对于消费相关通道,您会在创建消费者的同一位置看到它们,因为您要处理错误事件、重新连接或断路器。

通道池主要用于当您想重新使用通道来绕过 .NET 中 rabbitmq 的线程安全方面时的发布

有一些不错的开源库,您可以在其中查看和学习。 Here is NServiceBus consuming with a channel and here 是传达。 (为您突出显示了创建频道的位置)