2016-03-17 109 views
2

我正在使用RabbitMQ構建一個系統。我希望能夠做的事情之一是根據記錄的消息的嚴重性將消息直接記錄到不同的隊列中。錯誤和異常應該到一個隊列立即處理; Trace跟蹤日誌等不太重要的消息應該到別的地方,所以它們不會堵塞關鍵日誌記錄。有沒有辦法在AMQP路由鍵中指定「不匹配」?

我想處理這個問題的方法是建立一個Topic交換並將兩個隊列綁定到交換。然後,我的日誌消息將使用其路由密鑰中的日誌級別發送到正確的隊列。但是,我有一個問題,我不知道設置路由密鑰的最佳方式。

將我的錯誤排入正確的隊列非常簡單 - 將兩個隊列綁定到交換機,一個使用Error路由密鑰,然後將帶有Error路由密鑰的消息發送給它。我希望發送給這個交換機的其他類型的消息轉到另一個隊列。但我認爲你不能描述像!Error之類的路由鍵,或者至少它不會出現在我能看到的RabbitMQ教程或AMQP規範中。如果我使用通配符綁定,那麼我的錯誤消息會傳遞到兩個隊列。

它看起來像我可以使用備用交易所(http://www.rabbitmq.com/ae.html)做到這一點,但我寧願用直AMQP如果可能的話堅持和配置不良事件增加了複雜性的另一層我的系統 初始化。

我也可以在我的系統定義路由鍵日誌級別,而不是Error低級別的隊列明確路線的一切。但是這似乎過於冗長,並增加了維護開銷。

有沒有比使用AE更好的方式來實現我的目標?

+0

的AE也失敗了/是一個貧窮的choce因爲任何的匹配就會阻止一個AE消息 - 觀察與另一個結合,等等,將改變交流的非常行爲預期的行爲。 – user2864740

+0

從現在開始,鍵*必須*用於小的區分集合,並且這些*必須*被明確綁定:無論是或者無法'限制'綁定。這是非常不幸的,我很驚訝這沒有適當的解決方案。雖然有人會認爲它不是「AMQP 0-9-1」,但具有形成負值集的能力在真實代碼中非常非常方便。擁有更靈活的路由器非常方便,我很樂意交易更多的ms /消息。 – user2864740

+0

(也就是說,不幸的是沒有可以應用於比賽的'後衛'條件:擴展可能能夠做到這一點?) – user2864740

回答

2

基本上答案是否定的,用路由密鑰是不可能的;它只是一個「匹配」的東西,而不是正則表達式或類似的東西。

路由錯誤一方面,另一方面的一切(包括錯誤)呢?我的意思是,我想你的錯誤信息會少於跟蹤信息(我希望至少)。你將不得不「跳過」他們的業務,但我認爲它比RabbitMQ擴展更容易管理。

PS:我可以提出的最接近的是主題交換,但它會遭受同樣的限制。檢查this以獲取更多文檔。 PPS:如果你願意的話,還有其他的SO答案this

希望它能幫助:)