簡體   English   中英

嘗試使用 RabbitMq 了解消費者隊列的性質

[英]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.

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