rabbitmq通道应该为消费者保留吗?



我有一个Rabbitmqchannels池,我有一些queuesconsumers

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

当我完成channel的工作时我调用concurrentChannelPool.Return(channel);

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

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

当我们注册一个消费者,然后删除用于该消费者的通道时会发生什么?消费者是否收到了信息?

下面是注册消费者的方法:

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);

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

只要通道没有关闭,您就可以返回它。这是有危险的,因为如果你的渠道关闭了,所有的消费者都会停止购买。

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

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

通道池主要用于发布,当你想重用通道来绕过。net中rabbitmq的线程安全方面

有很好的开源库,你可以看看并从中学习。这里是NServiceBus消费一个通道,这里是传达。(为您突出显示创建通道的位置)

最新更新