![](/img/trans.png)
[英]Why does trying to understand delegates feel like trying to understand the nature of the universe?
[英]Trying to understand the nature of consumer queues with RabbitMq
RabbitMq 3.8.5、C# RabbitMqClient v6.1.0、.Net Core 3.1
我覺得我對RabbitMq
有誤解,所以我正在尋找澄清:
如果我有一個客戶端向交換器發送消息,而另一端沒有消費者,那會發生什么?
我曾認為它應該排在隊列中,直到它被拾起,但我遇到的問題是,現在交換的另一端沒有隊列(這很可能是我的問題)。
這是我的聲明代碼:
channel.ExchangeDeclare(name, exchangeType, durable, autoDelete);
var queueName = ret._channel.QueueDeclare().QueueName;
channel.ConfirmSelect();
這是我的出版商:
channel.BasicPublish(exchangeName, routingKeyOrTopicName, messageProperties, message);
但是,這樣做會給我一個用於出站交換的隊列名稱,另一個用於入站消費者。
有人會幫助這個可憐的白痴理解這是如何工作的嗎? 如果另一端沒有消費者,預期的行為是什么? 我確實有一個可以工作的 RPC 機制,但不確定這是否是處理這個問題的正確方法。
如果我讓我的消費者首先運行,一切正常,但是如果我在客戶端之后啟動我的消費者,那么消息就會丟失。
編輯
為了進一步澄清,我設置了一個簡單的 RPC 類型測試; 我在客戶端有兩個Direct
Exchange,一個用於出站 Exchange,另一個用於入站 RPC 使用者。
兩者都有自己的隊列。
Exchange queue name = amq.gen-fp-J9-TQxOJ7NpePEnIcGQ
Consumer queue name = amq.gen-wDFEJ269QcMsHMbAz-t3uw
當消費者應用程序啟動時,它會聲明自己的Direct
交換和自己的隊列。
Consumer queue name = amq.gen-o-1O2uSczjXQDihTbkgeqA
但是,如果我這樣做,消息就會丟失。
如果我先啟動消費者,那么我仍然總共得到三個隊列,但消息得到了正確處理。
這是我用來發送 RPC 消息的代碼:
messageProperties.ReplyTo = _rpcResponder._routingKeyOrTopicName;
messageProperties.Type = "rpc";
messageProperties.Priority = priority;
messageProperties.Persistent = persistent;
messageProperties.Headers = headers;
messageProperties.Expiration = "3600000";
查看管理 GUI,我看到所有三個隊列最終都被標記為Exclusive
,但我並沒有這樣聲明它們。 事實上,我自己並沒有創建任何隊列,而是讓 Client 庫為我處理,例如,這就是我定義我的Consumer
的方式:
channel.ExchangeDeclare(name, exchangeType, durable, autoDelete);
var queueName = ret._channel.QueueDeclare().QueueName;
Console.WriteLine($"Consumer queue name = {queueName}");
channel.QueueBind(ret.QueueName, name, routingKeyOrTopicName, new Dictionary<string, object>());
在 RabbitMQ 中,消息保留在隊列中,但它們會發布到交換器。 將交換鏈接到隊列的方法是通過綁定(有一些默認綁定)。
如果沒有隊列,或者交換機的策略沒有找到任何隊列來轉發消息,則消息將丟失。
一旦消息在隊列中,該消息將被發送到該隊列的消費者之一。
也許您正在使用獨占隊列? 當它們的聲明連接消失時,這些隊列將被刪除。
發現問題:我允許庫生成隊列名稱,而不是使用特定名稱。 這意味着RabbitMq
都必須處理不斷變化的目標。
如果我使用“定義明確的”隊列名稱並且消費者至少啟動了一次以在RabbitMq
上定義隊列,那么我確實看到消息被放入隊列並留在那里,即使消費者沒有運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.