我有一个应用程序可以旋转很多线程。每个线程通过masstransit / rabbitmq提交相同的消息类型。我创建了一个单例来存储一个IBus实例。应用程序仅发布消息,因此配置中没有端点。
单独的消息总线在发布时是否正确?我通过设置循环来不断发布消息来进行性能测试。当只运行一个线程52000条消息时,在60秒内添加到队列中。当5个线程在运行时,每个线程执行相同的循环,只有8000条消息在60秒内添加到队列中。
为什么在运行5个线程时性能更差?每个线程应该有自己的总线实例吗?
答案 0 :(得分:1)
单个总线实例将创建与RabbitMQ的单个连接。对大多数情况来说,这通常就足够了。如果要扩展连接,则需要创建当前其他总线实例。
但是,您应该能够以相当高的速率发布,特别是如果您有多个与TPL(任务并行库)完美匹配的线程。您还可以将多个发布调用组合到一个Task.WhenAll()中,以避免每条消息之间的延迟。
一个好的测试是使用MassTransit-Benchmark项目来了解您的经纪人的吞吐量。通常我会看到通过RabbitMQ发布和使用的每秒8000-12000条消息(非持久性,禁用发布者确认)。添加持久性和确认可以减慢单线程发布的速度,但不应显着影响多个源线程。对磁盘的持久写入肯定会减慢速度。
我很好奇您使用的代码,其中多个线程较慢。我发现最好使用Task.Run()而不是Thread.Create()(或者现在的语法,我再也不会使用线程了。)