2016-04-04 50 views
1

我們正在使用RabbitMQ向Apache Camel發送消息。當系統以錯誤的順序啓動時,不會持續顯示消息

我們有一個「發件人」和一個處理由發件人發送的RabbitMQ消息的駱駝路線。

我們正在部署有關係統的哪一端首先出現的問題。

我們的系統體積小。我一次發送100封郵件。消息的要點是減少主數據庫中發生的事情與將數據記錄到不同數據庫之間的「時間凝聚力」。我們不希望我們的前端需要等待。

「發件人」將創建一個交易所,如果它不存在。

該問題導致部署問題。

這是我看到:

如果我下來發件人,跌幅駱駝,刪除交換(洗涮),啓動發送者,然後開始駱駝,併發送100條短信,該系統的工作原理。 (我認爲是因爲發送者必須手動運行以進行測試,所以Exchange正在由駱駝路由創建...)

如果我清理slate併發送消息,然後再向上爬駱駝,我可以看到消息登陸RabbitMQ(使用網絡工具)。沒有隊列綁定。一旦我開始駱駝,我可以看到它綁定到Exchange的綁定隊列。但這些信息已經失去了時間和命運;他們顯然已經被拋棄了。

如果從目前的狀態,我發送更多的消息,他們正常流動。

我認爲,如果被丟棄的消息被持續存在,我會沒事的。我錯過了什麼?

+0

你爲什麼要刪除交換?交換,隊列和消息是否持久? – cantSleepNow

+0

@cantSleepNow刪除交換確實是一個壞主意。我們正在手動嘗試讓消息流動。在正常情況下我們不會那樣做。 –

+0

一般來說,如果您遇到流程問題,通常意味着隊列被「淹沒」 - 即代理商無法跟上發佈商的步伐,因此它會限制郵件「發送」的速度(發佈商 - >代理) 。你可以增加消費者的數量,並最終排隊。 https://www.rabbitmq.com/blog/2014/04/14/finding-bottlenecks-with-rabbitmq-3-3/ – cantSleepNow

回答

1

對我來說,很難說什麼是錯的,但我會嘗試提供一些指針。

您應該設置all exchanges and queues to be durable,並且消息持久。你不應該刪除任何這些實體(除非它們是空的,你不再使用它們),並且可能將它們看作數據庫中的表。這是您的基礎架構,與數據庫一樣,您不希望第一個DB客戶端創建它所需的表(這當然適用於您的用例,至少這是我看來的)。 在我提到的流量狀態的評論中,有100條消息,這可能永遠不會發生。

關於消息傳遞 - 持續性與否,代理(服務器)維持直到它們與確認多數民衆贊成由消費者發送回(在此是自動完成的API大量的消耗,但它實際上是一個最重要的概念)。

如果消息發佈到的交換被刪除,它們就消失了。如果服務器被殺死或重新啓動,並且消息被保留 - 再一次,它們消失了。消息可能會丟失的情況可能還會多一些(如果我想到一些問題,我將編輯答案)。

如果你沒有在創建控制(從那是沒有的事恕我直言最好的事實除外)(通常在API聲明)的交流和隊列,比它可能會非常棘手,因爲聲明的實體是冪等即,如果已經存在具有相同名稱的非持久隊列,則無法創建持久隊列q1。這也可能是一個問題在你的情況,因爲你提到系統的哪個部分第一個事情 - 也許東西沒有在兩邊同樣的參數聲明...

+0

我無法確認,如果沒有消費者,發送的消息會被保留。他們似乎去了點滴。如果發件人創建並綁定一個隊列,那麼它們將被傳遞到該隊列。但截至目前,我無法讓駱駝路線使用該隊列。所以這些消息是惰性的。 –

+0

我認爲被丟棄的消息是一個有詳細記錄的pub-sub功能。交換是一個扇出。 –