2017-01-19 60 views
3

我有一個應用程序,它可以提供很多線程。每個線程通過masstransit/rabbitmq提交相同的消息類型。我創建了一個單例來存儲IBus的一個實例。應用程序僅發佈消息,因此沒有端點在配置中。Masstransit rabbitMQ發佈在很多線程上

單發消息總線是唯一發布時才正確的事情嗎?我通過設置循環來不斷髮布消息來進行性能測試。當運行只有一個線程52000消息在60秒內添加到隊列中。當5個線程在運行時,每個線程執行相同的循環,只有8000個消息在60秒內添加到隊列中。

爲什麼運行5個線程的性能差得多?每個線程應該有自己的總線實例嗎?

回答

1

單個總線實例將創建到RabbitMQ的單個連接。對大多數情況來說這通常足夠了。如果要擴展連接,則需要創建額外的總線實例。

但是,您應該能夠以相當高的速度發佈,特別是如果您有多個線程可以很好地與TPL(任務並行庫)配合使用。您還可以將多個Publish調用組合到一個Task.WhenAll()中,以避免每條消息之間的延遲。

一個好的測試是使用MassTransit-Benchmark項目來了解經紀人的吞吐量。通常情況下,我會發現通過RabbitMQ發佈和消費的每秒8000-12000條消息(非持久,禁止發行商確認)。添加持久性和確認可以減慢單線程發佈,但不應該顯着影響多個源線程。對磁盤的持久寫入可以減慢速度。

我很好奇你在多線程運行速度較慢時使用的代碼。我發現最好使用Task.Run()而不是Thread.Create()(或者現在的語法,我再也不使用線程了)。