【问题标题】:Is it possible to publish multiple messages at once using the RabbitMQ client for C#?是否可以使用 C# 的 RabbitMQ 客户端一次发布多条消息?
【发布时间】:2015-02-11 09:57:17
【问题描述】:

现在,我们发布大量消息的代码如下所示:

foreach (var message in messages)
{
    publisher.Publish(message);
}

是否存在一次通过通道发送多个消息的能力?

publisher.Publish(messages);

或者如果我们分块

var chunks = messages.Chunk(100);
foreach (var chunk in chunks)
{
    publisher.Publish(chunk);
}

【问题讨论】:

  • 我环顾四周,我认为 RabbitMQ 不支持批处理。您的服务器和客户端之间的延迟真的很高吗?
  • @Asad 是的,就是这样。我们不经常发布,但当我们发布时,我们有大约 50 万条消息要发布。
  • 您是否真正分析并确定这是您系统中的瓶颈?我认为最好的办法就是像您现在所做的那样发布,并让 AMQP 在您的网络和消费者允许的范围内尽快处理它。如果您确实遇到性能问题,也许可以发送自定义的“分块”消息,就像您在上面所做的那样,然后让更接近消费者的东西接收它并发布组成消息。
  • @Asad 这不是瓶颈,但会导致超时。我的意思是对执行发布的服务的调用超时。也许我们需要重新审视我们是如何包装我们的发布代码的,因为我们目前有一个带有内部锁的单例发布者(因为通道不是线程安全的)。发送消息聚合也可以。
  • 多线程发布使用更多通道?为什么不呢?

标签: c# rabbitmq


【解决方案1】:

使用当前版本的 RabbitMq(3.8.2),您可以为 c# 客户端 sdk 发送如下批处理消息:

basicPublishBatch = channel.CreateBasicPublishBatch();
basicPublishBatch.Add("exchange", "routeKey", false, null, new byte[]{1});
basicPublishBatch.Add("exchange", "routeKey", false, null, new byte[]{1});
basicPublishBatch.Publish();

检查此 PR: https://github.com/rabbitmq/rabbitmq-dotnet-client/pull/368

【讨论】:

    【解决方案2】:

    对于 RabbitMQ,AMQP 协议对于生产和消费操作是异步的,因此尚不清楚如何从开箱即用的批处理消费者端点中受益。

    如果可以加快操作,您可以做的是为分块消息创建端点并在工作流中处理它们。因此,一种解决方案是例如在发布者类之前包含批处理组件并发送自定义消息。

    【讨论】:

      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多