rabbitmq channel 应该为消费者预留?
rabbitmq channel should be reserved for consumers?
我有一个 Rabbitmq 池 channels
,还有一些 queues
和 consumers
。
这样我可以得到一个频道:
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 是传达。 (为您突出显示了创建频道的位置)
我有一个 Rabbitmq 池 channels
,还有一些 queues
和 consumers
。
这样我可以得到一个频道:
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 是传达。 (为您突出显示了创建频道的位置)