RabbitMQ學習筆記七:交換機、佇列、訊息的持久化
一、概述
在生產過程中,難免會發生伺服器宕機的事情,RabbitMQ也不例外,可能由於某種特殊情況下的異常而導致RabbitMQ宕機從而重啟,那麼這個時候對於訊息佇列裡的資料,包括交換機、佇列以及佇列中存在訊息恢復就顯得尤為重要了。RabbitMQ本身帶有持久化機制,包括交換機、佇列以及訊息的持久化。持久化的主要機制就是將資訊寫入磁碟,當RabbtiMQ服務宕機重啟後,從磁碟中讀取存入的持久化資訊,恢復資料。(當然凡是都不是100%的,只能盡最大程度的保證訊息不會丟失吧)
二、交換機的持久化
在前面的示例中,我們使用常規的宣告交換機的方法
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
使用這種方法宣告的交換機,預設不是持久化的,在伺服器重啟之後,交換機會消失。我們在管理臺的Exchange頁簽下檢視交換機,可以看到使用上述方法宣告的交換機,Features一列是空的,即沒有任何附加屬性。
我們換用另一種方法宣告交換機
channel.exchangeDeclare(EXCHANGE_NAME, "fanout",true);
檢視一下方法的說明
/** * Actively declare a non-autodelete exchange with no extra arguments * @see com.rabbitmq.client.AMQP.Exchange.Declare * @see com.rabbitmq.client.AMQP.Exchange.DeclareOk * @param exchange the name of the exchange * @param type the exchange type * @param durable true if we are declaring a durable exchange (the exchange will survive a server restart) * @throws java.io.IOException if an error is encountered * @return a declaration-confirm method to indicate the exchange was successfully declared */ Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable) throws IOException;
我們可以看到第三個引數durable,如果為true時則表示要做持久化,當服務重啟時,交換機依然存在,所以使用該方法宣告的交換機是下面這個樣子的(做測試的時候,需要先在管理臺刪掉原來的同名交換機)D表示durable,滑鼠放在上邊會顯示為true
現在重啟RabbitMQ服務之後,可以看到我們宣告的交換機仍然存在。
三、佇列的持久化
與交換機的持久化相同,佇列的持久化也是通過durable引數實現的,預設生成的隨機佇列不是持久化的。前面示例中宣告的帶有我們自定義名字的佇列都是持久化的。
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
看一下方法的定義
/**
* Declare a queue
* @see com.rabbitmq.client.AMQP.Queue.Declare
* @see com.rabbitmq.client.AMQP.Queue.DeclareOk
* @param queue the name of the queue
* @param durable true if we are declaring a durable queue (the queue will survive a server restart)
* @param exclusive true if we are declaring an exclusive queue (restricted to this connection)
* @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use)
* @param arguments other properties (construction arguments) for the queue
* @return a declaration-confirm method to indicate the queue was successfully declared
* @throws java.io.IOException if an error is encountered
*/
Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments) throws IOException;
第二個引數跟交換機方法的引數一樣,true表示做持久化,當RabbitMQ服務重啟時,佇列依然存在。這裡說一下後邊的三個引數,exclusive是排他佇列,如果一個佇列被宣告為排他佇列,那麼這個佇列只能被第一次宣告他的連線所見,並在連線斷開的時候自動刪除。這裡有三點需要說明,1、同一個連線的不同channel,是可以訪問同一連線下建立的排他佇列的。2、排他佇列只能被宣告一次,其他連線不允許宣告同名的排他佇列。3、及時排他佇列是持久化的,當連線斷開或者客戶端退出時,排他佇列依然會被刪除。autoDelete是自動刪除,為true時,當沒有任何消費者訂閱該佇列時,佇列會被自動刪除。arguments:其它引數
四、訊息的持久化
訊息的持久化是指當訊息從交換機發送到佇列之後,被消費者消費之前,伺服器突然宕機重啟,訊息仍然存在。訊息持久化的前提是佇列持久化,假如佇列不是持久化,那麼訊息的持久化毫無意義。
通過如下程式碼設定訊息的持久化
channel.basicPublish(EXCHANGE_NAME,"",MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
其中MessageProperties.PERSISTENT_TEXT_PLAIN是設定持久化的引數
我們檢視basicPublish方法的定義
/**
* Publish a message
* @see com.rabbitmq.client.AMQP.Basic.Publish
* @param exchange the exchange to publish the message to
* @param routingKey the routing key
* @param props other properties for the message - routing headers etc
* @param body the message body
* @throws java.io.IOException if an error is encountered
*/
void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;
在看下BasicProperties的型別
public BasicProperties(
String contentType,
String contentEncoding,
Map<String,Object> headers,
Integer deliveryMode,
Integer priority,
String correlationId,
String replyTo,
String expiration,
String messageId,
Date timestamp,
String type,
String userId,
String appId,
String clusterId)
其中deliveryMode是設定訊息持久化的引數,等於1不設定持久化,等於2設定持久化。PERSISTENT_TEXT_PLAIN是例項化的一個deliveryMode=2的物件,便於程式設計。
public static final BasicProperties PERSISTENT_TEXT_PLAIN =
new BasicProperties("text/plain",
null,
null,
2,
0, null, null, null,
null, null, null, null,
null, null);
設定了佇列的持久化和訊息的持久化之後,當伺服器宕機重啟,存在佇列中未傳送的訊息會依然存在。
以上就是關於RabbitMQ中持久化的一些內容,但是並不會嚴格的100%保證資訊不會丟失,相關內容後續再說明。
五、總結
RabbitMQ的持久化有交換機、佇列、訊息的持久化。用於防止伺服器宕機重啟之後資料的丟失,其中交換機和佇列的持久化都是設定durable引數為true,訊息的持久化是設定Properties為MessageProperties.PERSITANT_TEXT_PLAIN,訊息的持久化基於佇列的持久化。持久化不是100%完全保證訊息的可靠性。相關推薦
RabbitMQ學習筆記七:交換機、佇列、訊息的持久化
一、概述 在生產過程中,難免會發生伺服器宕機的事情,RabbitMQ也不例外,可能由於某種特殊情況下的異常而導致RabbitMQ宕機從而重啟,那麼這個時候對於訊息佇列裡的資料,包括交換機、佇列以及佇列中存在訊息恢復就顯得尤為重要了。RabbitMQ本身帶有持久化機制
RabbitMQ學習筆記五:RabbitMQ之優先級消息隊列
-c virtual 調用 itl 3.5 rri color images 執行順序 RabbitMQ優先級隊列註意點: 1、只有當消費者不足,不能及時進行消費的情況下,優先級隊列才會生效 2、RabbitMQ3.5以後才支持優先級隊列 代碼在博客:RabbitMQ學習筆
Python學習筆記七:文件操作
dex enc 只讀 python nco 打印 如何 == continue 文件操作 對照一個word文件的操作方式,來體會文件操作的內容 打開文件:f=open(“file”),提示編碼錯誤,windows默認是GBK f=open(“file”,encoding=”
MYSQL初級學習筆記七:MySQL中使用正則表達式!(視頻序號:初級_44)
value opened 序號 eight 方式 字符 用戶 包括 學習 知識點九:MySQL中使用正則表達式(44) (1):REGEXP‘匹配方式’: (2):常用匹配方式: 模式字符 ^ 匹配字符開始的部分 $ 匹配字符串結尾的
分散式學習筆記七:基於zookeeper實現分散式鎖
一、分散式鎖介紹 分散式鎖主要用於在分散式環境中保護跨程序、跨主機、跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。 二、架構介紹 &nb
csdn學習筆記二:連結串列原型、do原型分析
設計連結串列,並設計其迭代函式 生成連結串列、列印連結串列 arr = {10, 20, 30, 100, 101, 88, 50}; head = nil; local i = 1 while true do if arr[i] then head = {va
csdn學習筆記三:meta元表、元方法 __index, __newindex、rawset、rawget
重要:在表和元表的__index 和 __newindex 都沒有需要操作的key時,賦值table操作會呼叫__newindex, 取值操作會呼叫__index 元表設定setmetatable t1 = {}; t2 = {}; print("t1=",
RabbitMQ學習筆記一:本地Windows環境安裝RabbitMQ Server
一:安裝RabbitMQ需要先安裝Erlang語言開發包,百度網盤地址:http://pan.baidu.com/s/1jH8S2u6。直接下載地址:http://erlang.org/download/otp_win64_18.3.exe。 安裝完成後需要配置環境變數: 新建系統變數:變數名 ERLAN
Java學習筆記1:計算機基礎知識、java語言基礎。
一、計算機基礎知識 1、 計算機是一種能夠按照程式執行,自動、高速處理海量資料的現代化智慧電子裝置。由硬體和軟體所組成,沒有安裝任何軟體的計算機稱為裸機。常見的形式有臺式計算機、筆記本計算機、大型計算機等。 硬體通常由CPU、主機板、記憶體、電源、主機箱、硬碟、顯示卡、鍵盤、滑鼠,顯示器等多
Java學習筆記總結:JAVA中String、StringBuilder、StringBuffer類的區別
不斷地學習,不斷地填充自己的技術庫,學習Java已經有一段時間了,由一開始的不適應到後來的足以靈活應對,不僅僅取決於老師的精緻講課,還有就是依靠我的學習祕籍:記錄自己的學習筆記。今天給大家分享的技術學習筆記是JAVAString,StringBuilder以及StringBuffer這三個類之間的區
csdn學習筆記三:meta元表、元方法 __index, __newindex、rawset、rawget
重要:在表和元表的__index 和 __newindex 都沒有需要操作的key時,賦值table操作會呼叫__newindex, 取值操作會呼叫__index 元表設定setmetatable t1 = {}; t2 = {}; print("t1=",t1);
TK1學習筆記七:配置SSH遠端訪問
有時候我們需要通過ssh遠端訪問TK1,這裡需要對TK1稍作配置 1.安裝ssh sudo apt-get install openssh-server 2.檢視ssh服務是否啟動  
Redis學習筆記七——向叢集節點新增、刪除和分配slot
上邊文章講了如何搭建redis叢集,這邊文章講叢集節點的新增、刪除和重新分配slot。 1、新增節點 新增節點:redis-trib.rb add-node 192.168.72.100:7006
深度學習筆記1:end-to-end、anchor box解釋、人體檢測程式碼
非end-to-end方法: 目前目標檢測領域,效果最好,影響力最大的還是RCNN那一套框架,這種方法需要先在影象中提取可能含有目標的候選框(region proposal), 然後將這些候選框輸入到CNN模型,讓CNN判斷候選框中是否真的有目標,以及目標的類別是什麼。在我們看到的結果中,往往是類似與下圖這種
Typescript 學習筆記七:泛型
中文網:https://www.tslang.cn/ 官網:http://www.typescriptlang.org/ 目錄: Typescript 學習筆記一:介紹、安裝、編譯 Typescript 學習筆記二:資料型別 Typescript 學習筆記三:函式 Type
Caffe學習筆記(七):使用訓練好的model做預測(mnist)
一、前言 在之前的筆記中,已經生成了訓練好的mnist.cafffemodel,接下來我們就可以利用這個model做預測了。在這之前,我們還需要一個檔案:deploy.prototxt。那麼,就讓我們從deploy.prototxt開始說起。 二
OpenGL學習筆記(七):建立第一個Qt5.9.3 OpenGL工程模版(與平臺無關)
main.cpp中輸入原始碼,原始碼如下: #include <iostream> #include <process.h> #include <GLFW/glfw3.h> #include <glad/glad.h> #include <
《機器學習實戰》學習筆記七:Logistics迴歸(梯度上升法)
1 Logistics迴歸概念 迴歸是指將一對資料擬合為一條直線的過程,而Logistics迴歸則是將回歸用於分類,其主要思想為:根據現有的資料對分類邊界線建立迴歸公式,依次為依據進行分類,在這裡最關鍵的一步是尋找最佳的擬合引數,這一步將會用到一些最優化的方法
RabbitMQ學習筆記八:RabbitMQ的訊息確認
來源: https://blog.csdn.net/chenxyt/article/details/79259838 一、概述 前文說到RabbitMQ的交換機、佇列、訊息的持久化並不能100%的保證訊息不會丟失。首先從生產者端,持久化的訊息在
EF6學習筆記七:程式碼遷移
要專業系統地學習EF前往《你必須掌握的Entity Framework 6.x與Core 2.0》這本書的作者(汪鵬,Jeffcky)的部落格:https://www.cnblogs.com/CreateMyself/ 這裡主要記錄一下我常用的幾個遷移,還要其他的很多命令,我不去弄了 常用的就