1. 程式人生 > >RabbitMQ學習筆記七:交換機、佇列、訊息的持久化

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, __newindexrawsetrawget

重要:在表和元表的__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中StringStringBuilderStringBuffer類的區別

不斷地學習,不斷地填充自己的技術庫,學習Java已經有一段時間了,由一開始的不適應到後來的足以靈活應對,不僅僅取決於老師的精緻講課,還有就是依靠我的學習祕籍:記錄自己的學習筆記。今天給大家分享的技術學習筆記是JAVAString,StringBuilder以及StringBuffer這三個類之間的區

csdn學習筆記meta元表元方法 __index, __newindexrawsetrawget

重要:在表和元表的__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

深度學習筆記1end-to-endanchor 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/  這裡主要記錄一下我常用的幾個遷移,還要其他的很多命令,我不去弄了 常用的就