【问题标题】:rabbitmq channel should be reserved for consumers?rabbitmq频道应该留给消费者吗?
【发布时间】:2021-08-30 15:50:56
【问题描述】:

我有一个 Rabbitmq channels 池,还有一些 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);

我在我的 dotnet 核心应用程序上将此池用作服务,因此我需要一个通道池。

【问题讨论】:

    标签: c# asp.net-core rabbitmq


    【解决方案1】:

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

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

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

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

    有很多不错的开源库可供您查看和学习。 Here 是 NServiceBus 与通道一起使用,here 是 Convey。 (为您突出显示创建频道的地方)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      相关资源
      最近更新 更多