2017-10-14 114 views
1

我們做了一個R & D爲一個基本的兔子mq隊列與確認。我們現在想更進一步,通過用戶名使用類似路由鍵的方式來分割頻道。 (https://www.cloudamqp.com/blog/2015-09-03-part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html)。rabbitmq與基於屬性的自定義排序

但是我們需要爲每個用戶使用自定義排序,我們從上游獲得的json有一個名爲sequence的參數。將數據推送到rabbitmq的服務可能會從上游獲得第一個json,序列號爲2,之後得到1。有沒有辦法將json的seuqence號碼2推送到隊列中,但是隻有在隊列接收到json和1併發送後才能發送。

基本上我們想知道的是,是否有一種方法可以使用基於此sequence參數的rabbitmq上的消息傳遞的自定義排序,而無需使用單獨的服務來維護此訂單。

回答

1

基本上我們想知道的是,是否有一種方法可以基於此序列參數使用rabbitmq上的自定義排序來發送消息,而無需使用單獨的服務來維護此順序。

號見https://www.rabbitmq.com/semantics.html

從RabbitMQ的釋放2.7.0,消息總是在發佈順序的隊列中保留,即使在重新排隊或通道閉合的存在。

因此,看起來你的用例不容易支持。

當然,如果你真的想重新排隊(和你不想在你的消費者保留的郵件),你可以實現這樣的僞代碼爲您的消費:

expected_message_id = 0 
while (true) { 
    m = receive_message(queue) 
    if (m.id == expected_message_id) { 
     process(m) 
     m.acknowledge() 
     expected_message_id++ 
    } else { 
     republish_to_queue(m, queue) // might use old exchange, or pick a new-one for this type of back-channel 
    } 
} 

顯然,這意味着額外的網絡/處理負載 - 消息可能會被多次傳遞和丟棄。

+0

有點偏離主題,但你知道是否有任何其他隊列產品支持這一點,你也會建議使用服務中的username參數來打破隊列,以減少隊列交換的數量 – MilindaD

相關問題