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 個體學習器 個體學習器整合學習的單元學習器,是整合學習的基礎學習...