RabbitMQ基礎概念和高階特性

2021-10-24 21:23:58 字數 2904 閱讀 6925

rabbitmq是實現了高階訊息佇列協議(amqp)的開源訊息**和佇列伺服器。rabbitmq伺服器是用erlang語言編寫的。

exchange型別

direct – 直連的方式,訊息會被**routekey中指定的queue中

topic – exchange將routekey和topic進行模糊匹配,此時佇列需要繫結乙個topic。可以使用萬用字元繼續匹配,「#」匹配乙個或者多個詞。「*」只能匹配乙個詞。

fanout – 不處理路由鍵,只需要簡單的將佇列繫結到交換機。傳送到該交換機的訊息都會被**到該交換機繫結的佇列上。fanout交換機**訊息是最快的。

confirm確認訊息:訊息的確認,是指生產者投遞訊息後,如果broke收到訊息會給生產者乙個應答

實現流程:

在channel上開啟確認模式:channel.confirmselect();

在channel上新增監聽:channel.addconfirmlistener,根據成功和失敗結果進行後續的處理。

connectionfactory connectionfactory = new connectionfactory();

connectionfactory.sethost("192.168.1.221");

connectionfactory.setport(5672);

connectionfactory.setvirtualhost("/");

connection collection = connectionfactory.newconnection();

channel channel = collection.createchannel();

string exchangename = "test_confirm_exchange";

string routingkey = "confirm.a";

//開啟訊息確認

channel.confirmselect();

channel.addconfirmlistener(new confirmlistener()

//訊息失敗ack

@override

public void handlenack(long deliverytag, boolean multiple) throws ioexception

});string msg = "this is a confirm message !!!";

channel.basicpublish(exchangename,routingkey,null,msg.getbytes());

return訊息:return listener用於處理一些不可路由的訊息,exchange或者routingkey找不到。

實現流程:mandatory:設定為true,則***會接收路由不可達的訊息。如果為false,那麼broker端會自動刪除該訊息。在channel上新增addreturnlistener監聽。

public class returnsender 

});string msg = "this is a confirm message !!!";

boolean mandatory = true;

channel.basicpublish(exchangename,routingkey1,mandatory,null,msg.getbytes());

channel.basicpublish(exchangename,routingkey2,mandatory,null,msg.getbytes());

}}

消費端限流:rabbitmq提供一種qos(服務質量保證)功能,在非自動確認訊息時,如果一定數目的訊息未被確認,不進行消費新的訊息,會阻塞狀態。

實現流程:channel.basicqos(int prefetchcount,boolean global)方法

prefetchcount:一次有prefetchcount沒被ack,消費者阻塞,直到有訊息ack

消費端ack和重回佇列

消費端可以進行手動ack和nack,當nack時可以讓訊息重回佇列,訊息會重新投遞到broker佇列尾部。一般關閉,不然容易一直迴圈。

//生成端**

public static void main(string args) throws ioexception, timeoutexception

}//消費端**

public static void main(string args) throws ioexception, timeoutexception, interruptedexception else

}}

死信佇列:dlx,dead-letter-exchange。利用dlx,乙個訊息變為死信後,會被重新publish到另乙個exchange,這個exchange就是dlx。

訊息變為死信的幾種情況

訊息被拒絕,並且requeue=false

訊息ttl過期

佇列達到最大長度

dlx也是乙個普通的exchange,只是設定了佇列屬性(新增x-dead-letter-exchange),當這個佇列有死信時,rabbitmq就會自動將這個訊息發布到設定的exchange上,進而被路由到另乙個佇列。

訊息如何保障100%的投遞成功?

什麼是生產端的可靠性投遞

解決方案:訊息落庫,對訊息狀態進行打標

消費端-冪等性保障

主流的冪等性操作:業務唯一id(或)指紋碼機制,利用資料庫主鍵去重

RabbitMQ的基礎概念

目錄 什麼是rabbitmq rabbitmq 管理命令列 rabbitmq的web管理介面介紹 rabbimq訊息傳送流程 一款基於amqp通訊協議,erlang語言開發的,部署及其廣泛的訊息中介軟體 1.服務啟動相關 systemctl start restart stop status rab...

RabbitMQ學習筆記(二) 基礎概念

queue 佇列 是rabbitmq的內部物件,用於訊息的消費,用下圖表示。rabbitmq中的訊息都只能儲存在queue中,生產者 下圖中的p 生產訊息並最終投遞到queue中,消費者 下圖中的c 可以從queue中獲取訊息並消費。多個消費者可以訂閱同乙個queue,這時queue中的訊息會被平均...

高階演算法 基礎概念梳理

1 整合學習 整合方法是將幾種機器學習技術組合成乙個 模型的元演算法,以達到減小方差 偏差或改進 的效果,通過弱學習器組合成強學習器。序列整合方法 adaboost,gbdt,模型之間強依賴 並行整合方法 隨機森林,模型之間無依賴 2 個體學習器 個體學習器整合學習的單元學習器,是整合學習的基礎學習...