【问题标题】:Masstransit rabbitMQ publishing on many threadsMasstransit rabbitMQ 在多线程上发布
【发布时间】:2017-01-19 00:13:41
【问题描述】:
我有一个启动很多线程的应用程序。每个线程通过 masstransit / rabbitmq 提交相同的消息类型。我创建了一个单例来存储一个 IBus 实例。应用程序仅发布消息,因此配置中没有端点。
单例消息总线在仅发布时是否正确?我通过设置循环来不断发布消息来进行性能测试。当只运行一个线程时,52000 条消息在 60 秒内添加到队列中。当运行 5 个线程时,每个线程执行相同的循环,60 秒内只有 8000 条消息添加到队列中。
为什么运行 5 个线程时性能会差很多?每个线程都应该有自己的总线实例吗?
【问题讨论】:
标签:
multithreading
rabbitmq
masstransit
【解决方案1】:
单个总线实例将创建到 RabbitMQ 的单个连接。对于大多数情况,这通常就足够了。如果您想扩展连接,目前需要创建额外的总线实例。
但是,您应该能够以相当高的速度发布,特别是如果您有多个线程可以很好地与 TPL(任务并行库)配合使用。您还可以将多个 Publish 调用合并到一个 Task.WhenAll() 中,以避免每条消息之间的延迟。
一个很好的测试是使用 MassTransit-Benchmark 项目来了解您的代理的吞吐量。通常,我看到通过 RabbitMQ 发布和使用的消息每秒 8000-12000 条(非持久,禁用发布者确认)。添加持久性和确认可以减慢单线程发布,但不应显着影响多个源线程。对磁盘的持久写入肯定会减慢速度。
我很好奇您在多线程速度较慢的情况下使用的代码。我发现最好使用 Task.Run() 而不是 Thread.Create() (或者现在的任何语法,我不再使用线程了)。