2017-07-07 2 views
0

我們在我們的系統中使用了Docker,Spring和RabbitMq。我是AMQP的新手,我試圖弄清楚交換,隊列,綁定和連接是如何在我們的系統中工作的。 我們有多個dockerized應用程序。RabbitMQ,docker,單個隊列,多個使用者

簡而言之,當應用程序啓動時,它們每個都開始聽同一個隊列,我不明白他們都希望如何接收相同的消息。在stackoverflow中有一些類似的問題,給我的印象是我們目前的系統可能存在缺陷。

的詳細信息:

當搬運工容器開始,在不同的容器的多個應用程序使用RabbitAdmin到

declare the same exchange: rabbitAdmin.declareExchange(exchange) 
declare the same queue: rabbitAdmin.declareQueue(queue) 
bind those together: rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exhange).with("theSameKey"); 

,因爲他們要聽相同的消息,他們做到這一點。 據我所知,只有一個dockerized程序管理創建交換和隊列,其餘的嘗試,但沒有任何效果。

之後,這些應用程序的創建和啓動隊列SimpleMessageContainers:

simpleMessageContainer.setMessageListener(messageListener) 
simpleMessageContainer.addQueueNames(queue.getName()) 
simpleMessageContainer.start() 

使用rabbitmqctl和RabbitMQ的網絡界面,我可以看到一個隊列不同通道上有多個消費者,分別對應不同碼頭集裝箱。

是不是這樣,messageListener駐留在應用程序中,但是當調用addQueueNames時,RabbitMq爲代理中的隊列創建一個Consumer,然後這個Consumer然後通過連接轉發消息到應用程序本地messageListener?

由於不同Docker容器中的多個應用程序也這樣做,因此同一隊列中有多個Consumers,就像我在rabbitmqctl中看到的一樣。

我不明白的是,不RabbitMQ的傳遞,在一個循環的方式結束了在隊列中的信道/消費者信息,所以只有dockerized申請的人會接受呢? 這些呼叫是直接和主題​​類型,沒有扇出交換。 如果所有dockerized應用程序想要接收相同的消息,那麼不應該爲它們自己創建一個擁有自己的隊列名稱但帶有相同路由密鑰的exhance的隊列嗎?

我看不出當前實現可能正常工作。

回答

0

總之,當應用程序開始,他們各自開始聽同一隊列,我不知道他們都怎麼能指望收到同一消息

他們永遠不會收到相同的信息。只有一個會選擇一條消息。

要執行什麼你問 - 都收到同樣的信息 - 它必須是一個主題,不是隊列

順便說一句:沒有什麼關於Docker或容器的具體信息,多個消費者可以以多種方式運行。以典型的集羣環境爲例。

相關問題