2017-04-12 101 views
0

我是rabbitmq消息傳遞的完全新手,如果這個問題很傻或者我的設置完全是梨形的,我很抱歉。丟棄rabbitmq消息沒有人在聽

我使用rabbitmq的設置是從某些探測器發送消息。每個探針都有一個唯一的名稱。然後我有一個集中的服務器來處理數據 - 如果有需要的話。

我使用與探測器名稱相對應的直接交換和路由鍵。

我宣佈我的客戶(服務器)如​​下(這是或多或少從RabbitMQ的教程):

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) 
channel = connection.channel() 
channel.exchange_declare(exchange="foo", type="direct") 
result = channel.queue_declare(exclusive=True) 
queue_name = result.method.queue 

如果在某些時候,我產生興趣的是什麼探針是報告,我發出

channel.queue_bind(exchange="foo", queue=queue_name, routing_key="XXX") 

其中XXX是探針的名稱。

我在探頭出版商聲明如下:

connection = pika.BlockingConnection(pika.ConnectionParameters(host="foo.bar.com")) 
channel = connection.channel() 
channel.exchange_declare(exchange="foo", type="direct") 

,當我發送郵件,我用

channel.basic_publish(exchange="foo", routing_key="XXX", body=data) 

其中XXX是探測器的名稱。

這一切工作正常。但是,我該如何做到這一點,使得沒有人正在聽的路由密鑰消息立即被丟棄?現在,如果我的客戶停止收聽路由密鑰或根本沒有運行,探測器發送的消息就開始堆積起來。當我啓動消費者或讓它聽一段時間沒有聽到路由密鑰時,我可能會有數以萬計的消息積壓在那裏。這不是我需要的,積壓必然會導致資源耗盡。

有沒有一種方法可以修改它,以便在消息到達交換機時沒有人監聽消息而不是排隊等待消息?我會假設有一種方法,但谷歌和pika文件沒有幫助。

在此先感謝。

回答

0

但我該如何使郵件路由到沒有人聽到的密鑰 立即被丟棄?

默認情況下,Rabbitmq已經實現了這一點。您只需確保沒有綁定到該路由鍵的隊列。

現在,如果我的消費者停止偵聽到路由鍵或不運行 所有,由探測器發送的郵件開始堆積如山

如果沒有該路由鍵的隊列中,所有的消息都會被丟棄。

有沒有修改這個辦法,這樣的消息被丟棄,而不是排隊,如果沒有一個聽他們時,他們在 交換到達 ?

RabbitMQ的defualt行爲本身支持這種(對直接交換)

https://www.rabbitmq.com/tutorials/tutorial-four-python.html

+0

OK Go的通過網頁,所以只要我關閉監聽隊列,消息應該被丟棄。我會接受這個答案。有沒有一種方法可以用rabbitmqctl來檢查那裏是否有排隊的消息,以驗證它是否有效? – Hannu

+1

要查看排隊消息,您可以使用rabbitmq管理插件。更多詳細信息,請參閱http://stackoverflow.com/questions/10709533/is-it-possible-to-view-rabbitmq-message-contents-directly-from-the-command -線 –