無法被路由的消息,去了哪里?
如果沒有任何設置,無法路由的消息會被直接丟棄。
無法路由的情況:Routing key不正確。
解決方案:
1.使用mandatory=true配合ReturnListener,實現消息回發。
2.聲明交換機時,指定備份交換機。
多個消費者監聽一個隊列時,消息如何分發?
1.Round-Robin(輪詢)
默認的策略,消費者輪流、平均地收到消息。
2.Fair dispatch(公平分發)
如果要實現根據消費者的處理能力來分發消息,給空閑地消費者發送更多消息,可以用basicQos(int prefetch_count)來設置。prefetch_count含義:當消費者有多條消息沒有響應ACK時,不再給這個消費者發送消息。
消息在什么時候會變成Dead Letter(死信)?
1.消息被拒絕并且沒有設置重新入隊:(NACK || Reject ) && requeue == false
2.消息過期(消息或者隊列的TTL設置)
3.消息堆積,并且隊列達到最大長度,先入隊的消息編程DL。
解決方案:可以在聲明隊列時,指定一個Dead Letter Exchange,來實現Dead Letter的轉發,保證消息不會丟失。
如何進行消息持久化?
所謂持久化,就是RabbitMQ將內存中的數據(比如交換機、隊列、消息等)固化到磁盤,以防止異常情況的發生時造成數據丟失。
| 持久化分類 | 說明 |
|---|---|
| 交換機持久化 | 在創建Exchange時設置durable參數參數。channel.exchangeDeclare(EXCHANGE_NAME, "direct", true); |
| 隊列持久化 | 同樣也是設置設置durable參數。持久化的隊列會存盤,在服務器重啟的時候可以保證不丟失相關信息。channel.queueDeclare(QUEUE_NAME, true, false, false, null); |
| 消息持久化 | 即使交換機、隊列持久化不會因為重啟丟失,但是存儲在隊列中的消息仍然會丟失。解決的辦法就是設置消息的投遞模式為2,即代表持久化(JAVA)。理論上,可以將所有的消息都設置為持久化,但是這會嚴重影響RabbitMQ性能,因為寫入到磁盤的速度可比寫入到內存的速度慢非常多。因此,在選擇是否要持久化消息時,需要在可靠性和吞吐量之間做一個權衡。 |
RabbitMQ專享實例是否支持公網訪問?
RabbitMQ專享實例支持公網訪問。
在創建RabbitMQ專享實例的“更多”選項中,選擇開啟“公網訪問”可自主控制是否進行公網訪問,并選擇已購買的彈性IP及帶寬。或創建完后,在實例詳情頁中將公網訪問開關打開。
RabbitMQ實例是否支持跨VPC和跨子網訪問?
RabbitMQ實例支持跨VPC和子網訪問,可以通過創建VPC對等連接,將兩個VPC的網絡打通,實現跨VPC訪問實例。
SSL方式連接RabbitMQ實例失敗?
首先排查安全組的入方向規則,是否放開了端口5671(SSL方式訪問)或5672(非SSL訪問)。
其次,參考如下內容配置SSL單向認證:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(host);
factory.setPort(port);
factory.setUsername(user);
factory.setPassword(password);
factory.useSslProtocol();
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
客戶端是否可以通過DNAT方式訪問RabbitMQ實例?
可以。
為什么RabbitMQ集群只有一個連接地址?
RabbitMQ集群實例的連接地址,實際上是實例的LVS節點地址(負載均衡地址),客戶端連接實例時,通過負載均衡器將客戶端請求分發到集群實例的各個節點。

RabbitMQ實例集群的隊列是否有備份?
RabbitMQ實例默認開啟了鏡像隊列,會在集群中多個代理上備份隊列的副本,當某個代理故障,集群會從其他正常的代理中選擇一個代理,用來同步隊列數據。
RabbitMQ支持雙向認證嗎?
不支持。
RabbitMQ實例是否支持擴容?
不支持。
RabbitMQ實例是否支持修改可用區?
不支持,您可以重新購買實例,以滿足可用區要求。
RabbitMQ客戶端連接報錯原因分析?
RabbitMQ客戶端連接失敗,可能原因包括地址、端口填錯、用戶名或者密碼填錯。
連接地址不正確
Exception?in?thread?"main"java.net.SocketTimeoutException:?connect?timed?out
at?java.net.PlainSocketImpl.socketConnect(NativeMethod)
at?java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
端口不正確
Exception?in?thread?"main"java.net.ConnectException:Connection?refused?(Connection?refused)
at?java.net.PlainSocketImpl.socketConnect(NativeMethod)
at?java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at?java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
用戶名或密碼錯誤
Exception?in?thread?"main"com.rabbitmq.client.AuthenticationFailureException:?ACCESS_REFUSED?-Login?was?refused?using?authentication?mechanism?PLAIN.?For?details
?see?the?broker?logfile.
at?com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:351)
at?com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:64)
RabbitMQ實例是否支持不同的子網?
支持。
客戶端與實例在相同VPC內,可以跨子網段訪問。同一個VPC內的子網默認可以進行通信。
客戶端與實例在不同VPC時,需建立VPC對等連接。
客戶端是否可以連接同個RabbitMQ下多個Vhost?
客戶端可以連接同個RabbitMQ下多個Vhost。
Vhost(Virtual Hosts虛擬主機)是RabbitMQ的基本特性,每個Vhost相當于一個獨立的虛擬消息服務器,每個Vhost數據目錄不同,擁有自己的隊列、交換器和權限控制機制。性能上,連接多個Vhost和單獨使用一個Vhost差別不大。
消息創建時間在哪設置?
消息創建時間是在生產消息時由生產客戶端設置。
RabbitMQ是否支持跨Region部署?
不支持跨Region部署。
如何清空隊列數據?
(1)進入“分布式消息服務RabbitMQ”控制中心;
(2)在“實例列表”頁面點擊對應的RabbitMQ實例;
(3)在“隊列管理”頁面點擊要清空的隊列;
(4)在“清除消息”頁面點擊清空隊列。


RabbitMQ支持升級CPU和內存嗎?
RabbitMQ支持擴容規格。
如何設置Message ID?
如需追蹤和識別消息,可以在分布式消息服務RabbitMQ的Producer客戶端設置Message ID屬性,為每條消息設置唯一標識符。
在分布式消息服務RabbitMQ的Producer客戶端設置Basic.Properties的messageid屬性。示例代碼如下:
AMQP.BasicProperties?props?=newAMQP.BasicProperties.Builder().messageId("messageid").build();
channel.basicPublish("ExchangeName","RoutingKey",true,?props,("消息發送Body").getBytes());
Message ID(消息標識符)是消息的可選屬性,類型為String。Message ID在業務上通常被設置為唯一,適用于追蹤和識別銷售單、工單等需要保證消息唯一的場景。分布式消息服務RabbitMQ服務端不會對消息進行冪等處理。如需實現消息冪等,即如果消息重試多次,消費者端對該重復消息消費多次與消費一次的結果是相同的,并且多次消費沒有對系統產生副作用,在為每條消息設置唯一Message ID的基礎上,還需要在分布式消息服務RabbitMQ的Consumer客戶端對消息進行冪等處理。
RabbitMQ使用的版本是多少?
服務端RabbitMQ的版本有3.8.9和3.8.35。
RabbitMQ實例SSL連接的協議版本號是多少?
服務端支持協議版本號:SSL v3、TLS v1、TLS v1.1、TLS v1.2、TLS v1.3。