2012-02-16 27 views
1

我還沒有找到一種方法來確定由於tcp背壓(流量控制)而導致發佈者何時掛起。對於我的應用程序,掛任何線程幾乎是不可接受的。如果發生不快,我需要能夠中止發佈操作。我注意到Pika客戶端對此有一個回調,但在c#客戶端文檔中找不到任何東西。有沒有人有這個解決方案?我可以創建一個後臺任務來完成發佈,並在一段時間後中止線程,但這看起來很重要,thread.abort有它自己的問題。當TCP Backpressure激活時,RabbitMQ c#客戶端回調?

回答

4

RabbitMQ從顯式流量控制切換到通過TCP反壓節流的原因是爲了支持更多的客戶端(其中很多客戶端無法處理像channel.flow這樣的異步方法)。不幸的是,它的完成方式以及可以說是應該完成的方式對發佈商而言是完全透明的 - 對於發行商來說,限制它的時間是沒有辦法的。

如果您確實有一個硬實時保證發佈,您的唯一選擇是實現手動超時。當然,這並不能解決RabbitMQ超載的基本問題,所以停止發佈,終止連接並打開新連接不會讓你更接近發佈。

所以,你要麼1)需要修改爲什麼你需要這樣嚴格的出版保證或2)增加更多的節點到RabbitMQ cluster(這是死 - 簡單,旨在改善這種情況)。

+1

我認爲天真的是認爲阻止發佈者(和線程)對某個企業應用程序來說是透明的。如果您有一些業務活動(比如說用戶登錄),並且您想要將發生的事件發佈到系統的其他部分,但您不能在主應用程序線程中可靠地執行此操作,除非您確定永遠不會超出節流水印。添加服務器很好,但是如果你的負載都在spikey中,有時很難預測這種需求。阻止線程可能會對Web應用程序的可伸縮性產生災難性影響。謝謝回覆。 – Brad 2012-02-23 16:43:16

+0

姆姆。我懂了。不幸的是,RabbitMQ並沒有提供實時的保證。 – scvalex 2012-02-24 20:02:35