簡體   English   中英

在Rabbit MQ中切換路由

[英]Toggle routing in Rabbit MQ

在RabbitMQ中,有沒有辦法以原子方式切換隊列的綁定以進行交換,如下面的設置。 Q1和Q2交替綁定。

X -> Q1
  -> Q2

通過交替綁定,如果Q1和Q2在切換期間同時綁定,則會產生重復消息的問題,如果兩者都沒有,則會丟失。 要求是不丟失或復制郵件。 我意識到丟失消息的窗口將非常小,但我寧願不處理隨之而來的邏輯問題。

實際上我想要實現的是從交換X到隊列(Q1或Q2)的路由形式,但不要將其作為發布消息的應用程序的關注點,該消息發布到交換機X.

實現此目的的一種方法是使進程消耗中間隊列Q的消息,並通過給Q1和Q2各自交換它們來實現該過程中的切換路由。

這讓我覺得效率低下,並且引入了更多動作部件出錯。

另一種方法是編寫一個自定義交換,當沒有隊列(X - > Q1或X - > Q2)綁定時,它充當緩沖區/隊列,但我的Erlang不存在。

最簡單的方法是切換X - > Q1和X - > Q2之間的綁定,但是(afaik)沒有原子切換綁定,消息可能會丟失(解除綁定Q1,然后綁定Q2)或重復(綁定Q2) ,然后解開Q1)。

我能想到的唯一解決方法是在綁定切換之前暫時使交換X不可用(ACL?重命名?),並希望客戶端處理錯誤條件。

是否有一種開箱即用的方式來實現這一目標? 如果沒有,你會推薦什么方法?

也許你想要像rabbitmq分片插件 (也在同一個鏈接)提供的一致哈希交換或模數哈希交換。

這些插件負責對流進行分區,這似乎是您想要實際執行的操作。

切換綁定可以在Alternate Exchangs RabbitMQ擴展的幫助下完成:

  1. 創建額外的交換,例如X-AE並將Q2綁定到X-AE
  2. X交換機上將X-AE設置為備用交換機(將所有消息(無法處理的消息)路由到Q2隊列)。
  3. X取消綁定Q1 (消息來自將通過X-AE流向Q2 )。
  4. Q2綁定到X
  5. X交換中刪除備用交換X-AE策略。
  6. X-AE取消綁定Q2並移除X-AE交換。

請注意,如果您的X交換上有其他備用交換,確切的步驟可能會有所不同,但這個想法仍然相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM