1. 程式人生 > >RabbitMQ入門學習

RabbitMQ入門學習

一、訊息佇列學習

MQ是一個網際網路架構中常見的解耦利器。
什麼時候不使用MQ?
上游實時關注執行結果
什麼時候使用MQ?
1)資料驅動的任務依賴,多個任務需要輪流執行,輪流訂閱上一個任務。
2)上游不關心多下游執行結果,上游執行完傳送到MQ,多下游訂閱MQ。
3)非同步返回執行時間長
這裡寫圖片描述
死信佇列多了一個過期的機制,到期會自動去嘗試消費,通過死信交換機做匹配,選擇想要的消費失敗的訊息。
https://ke.qq.com/course/288116#term_id=100341172 入門視訊
訊息中介軟體是在訊息傳輸過程中儲存訊息的容器。佇列的主要目的是提供路由並保證訊息的傳遞。
特點


1非同步處理模式
2多個應用程式呼叫關係為鬆耦合關係
傳遞模型:
1、點多點模型PTP
每個訊息只用一個消費者
傳送者和接收者沒有時間依賴
接受者確認訊息接受和處理成功
2、釋出-訂閱模型Pub/Sub
一對多關係,通過訂閱主題,釋出者建立一個訂閱,訂閱者保持持續的活動狀態以接收訊息。
每個訊息可以有多個訂閱者
客戶端只有訂閱後才能接收到訊息,有時間依賴。
持久訂閱 訂閱關係建立後,訊息不會消失,不管訂閱者是否都線上
非持久訂閱 訂閱者為了接受訊息,必須一直線上

典型的應用案例
1、註冊時傳送郵件或傳送簡訊
2、日誌分析使用,多個服務產生的資料傳送到中介軟體傳送到分析服務。
3、訊息複製,用於跨機房資料傳輸、搜尋、離線資料計算等。
4、延遲訊息傳送和暫存,把中介軟體當成可靠的訊息暫存地。接受訊息,暫時先不傳送。

二、RabbitMQ的安裝

一、安裝erlang,環境變數配置
這裡寫圖片描述
這裡寫圖片描述
輸入erl –version檢視安裝是否成功。

二、rabbitMQ的安裝
下載exe,安裝。cd到其sbin目錄。
這裡寫圖片描述
執行外掛命令rabbitmq-plugins enable rabbitmq_management 開啟管理後臺的外掛
這裡寫圖片描述

三、JAVA操作佇列

連線工具,配置資訊
這裡寫圖片描述
1、簡單佇列
此時為匿名傳送,不指定交換機,則直接傳送到佇列中。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
2、工作佇列WorkQueue
模型(訊息輪流被多個消費者消費)
這裡寫圖片描述
此時有兩個消費者同時監聽一個的佇列。
其中一個執行緒sleep2秒,另一個消費者執行緒sleep1秒,但是處理的訊息是一樣多。
這種方式叫輪詢分發(round-robin)

不管誰忙,都不會多給訊息,總是你一個我一個。

想要做到公平分發(fair dispatch),必須關閉自動應答ack,改成手動應答。
使用basicQos(perfetch=1)限制每次只發送不超過1條訊息到同一個消費者,消費者必須手動反饋告知佇列,才會傳送下一個。
這裡寫圖片描述
這裡寫圖片描述

ACK(Message acknowledgment)預設是true
autoACK=true時,訊息分發給消費者,則訊息就會從記憶體中刪除。如果正在執行的消費者宕機,則會丟失正在處理的訊息。
所以autoACK=false時,則需要等待訊息應答後才刪除,如果消費者宕機,則會交付給其他消費者。

如果rabbitMQ宕機,則記憶體中的訊息全部丟失。所以需要將訊息持久化。(已經宣告好的佇列不能更改)

注意:RabbitMQ不允許重新定義一個已經存在的佇列。控制檯刪除或者重新定義一個佇列。
這裡寫圖片描述
durable:持久化,本來宣告在記憶體,持久化會儲存到本地,重啟mq不會消失
Exclusive:排外,如果是,兩個消費者不能同時消費,一般就只有一個消費者
autoDelete:自動刪除,最後一個消費者斷開的時候自動刪除佇列

3、訂閱者模式
這裡寫圖片描述
一個生產者,多個消費者,消費者都有自己的佇列,訊息先發送到交換機exchange,每個佇列都繫結到交換機。實現一個訊息被多個消費者消費。
佇列如果不繫結到交換機,訊息丟失,交換機沒有儲存能力。
交換機:一方面是接收生產者的訊息,另一方面是向佇列推送訊息。生產者在釋出的時候不指定交換機,則為匿名傳送。交換機型別如下
Fanout(不處理路由鍵),佇列繫結到交換機,直接轉發到所有佇列。
Direct(處理路由鍵)
Topic()

這裡寫圖片描述
消費者1和2分設定兩個佇列名稱,繫結到交換機上,可以實現一個訊息兩個消費者訂閱。
這裡寫圖片描述

4、路由模式
宣告交換機為direct,傳送路由key為error的訊息。
根據繫結的路由key,訊息帶哪個key,就路由到哪個佇列。可以一個佇列繫結多個key
這裡寫圖片描述
這裡寫圖片描述

宣告交換機為topic 可以實現模式匹配
#匹配一個或多個 *匹配一個
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

四、訊息確認機制 事務+confirm

可以通過持久化資料解決rabbitMQ伺服器異常的資料丟失問題。但此時生產者並不知道訊息是否發到rabbitMQ伺服器中。如果生產者要確認訊息已傳送到MQ,可以通過兩種方式。
1、通過AMQP協議方式,實現事務機制
txSelect—txCommit提交事務 txRollback回滾事務
使用者將當前channel設定成transation模式 此時會導致大量的請求,極大的降低了吞吐量
這裡寫圖片描述
2、生產者端引入confirm模式
佇列如果已宣告為tx不能重新設定為confirm
實現原理
這裡寫圖片描述
好處:非同步的處理
channel.setConfirmSelect()
程式設計模式
1、普通,發一條會呼叫waitForConfirm()
2、批量,每傳送一批訊息後再呼叫
3、非同步的confirm模式,提供回撥
單條或者批量(序列)傳送confirm的生產者如下:
這裡寫圖片描述
非同步的confirm 集合存每一個未confirm的訊息,confirm了,就從中刪除
這裡寫圖片描述

public class Send {
    private static  final  String QUEUE_NAME = "test_queue_confirm2";
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        Connection connection = ConnectionUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);
        //開啟confirm模式
        channel.confirmSelect();

        //未確認的訊息放入
        SortedSet<Long> confirmSet = Collections.synchronizedSortedSet(new TreeSet<Long>());

        //新增監聽通道
        channel.addConfirmListener(new ConfirmListener() {
            //沒有問題的handleAck 成功
            @Override
            public void handleAck(long deliveryTag, boolean multiple) throws IOException {
                if(multiple){   //多個的
                    System.out.println("handleAck:multiple");
                    confirmSet.headSet(deliveryTag+1).clear();
                }else{          //單個的
                    System.out.println("handleAck:multiple false");
                    confirmSet.remove(deliveryTag);
                }
            }
            //有問題的反饋Nack 失敗
            @Override
            public void handleNack(long deliveryTag, boolean multiple) throws IOException {
                if(multiple){
                    System.out.println("handleNack:multiple");
                    confirmSet.headSet(deliveryTag+1).clear();
                }else{
                    System.out.println("handleNack:multiple false");
                    confirmSet.remove(deliveryTag);
                }
            }
        });

        String msg = "hello Confirm11111111";
        while(true){
            long seqNo = channel.getNextPublishSeqNo();
            channel.basicPublish("",QUEUE_NAME,null,msg.getBytes());
            confirmSet.add(seqNo);
        }
    }
}

五、SpringBoot整合RabbitMQ

在application.yml做mq配置
這裡寫圖片描述
宣告佇列,交換機,路由鍵
這裡寫圖片描述
生產者
這裡寫圖片描述
消費者

這裡寫圖片描述

相關推薦

RabbitMQ入門學習

一、訊息佇列學習 MQ是一個網際網路架構中常見的解耦利器。 什麼時候不使用MQ? 上游實時關注執行結果 什麼時候使用MQ? 1)資料驅動的任務依賴,多個任務需要輪流執行,輪流訂閱上一個任務。 2)上游不關心多下游執行結果,上游執行完傳送到MQ,多下游

RabbitMQ入門學習——Topics(主題)

在前面的章節中,我們改善了我們的日誌程式碼。我們使用direct直播代替fanout廣播,並且可以選擇性惡接受日誌。儘管使用direct直播改善了我們的日誌程式碼,但是它還有許多侷限性。比如:不能給予多種標準來路由。 在我們的日誌系統中,我們也許即希望按照日誌的嚴重程度來訂閱,也希望按照日誌的來源定於。你

AngularJS入門學習筆記一

rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

SQL Server 2008入門學習

學會 建表 一個數 安裝 新的 一個 學生 輸入 images 計應154張家浩:這學期學習了一門新的課程叫數據庫實用技術,主要是對軟件SQL Server 2008的學習,剛開始學的時候什麽都不懂一頭霧水,學習了一周之後,慢慢學會了如何建立數據庫,如何創建表格以及建立表格

機器學習最佳入門學習資料匯總

行程 view 概率 應該 mic 時有 挖掘 書包 發現 譯者:teyla 原文作者:Jasonb 發布:2014-06-05 13:54:15 挑錯 這篇文章的確很難寫,因為我希望它真正地對初學者有幫助。面前放著一張空白的紙,我坐下來問自己一個難題:面對一個對機器學習

express入門學習(一)

stat err 位置 中間 sta () some start status 一、安裝express cnpm || npm install express --save ; 1. Hello World var express = require(‘express

D3.js 入門學習(一)

min() 元素選擇器 eight 也會 127.0.0.1 暫時 網絡 doc 學習 一、安裝D3.js 1.網絡連接 <script src="https://d3js.org/d3.v4.min.js"></script> 2.命令行安裝

Linux入門學習

linux計算機系統一:先來認識一下計算機系統的組成計算機系統由硬件(Hardware )系統和軟件(software)系統組成二:計算機硬件計算機(Computer):俗稱電腦,是一種能接收和存儲信息,並按照存儲在其內部的程序對海量數據進行自動、高速地處理,然後把處理結果輸出的現代化智能電子設備發展歷史:第

linux 基礎入門學習

基礎知識 二進制 配置文件 學習計算機 linux程序 上節課學習計算機基礎以及liunx起源和自由軟件協議的相關規定,今天學習相關linux入門的基礎知識: 一、首先講解了linux程序包的管理 1、程序包的組成:(1)二進制文件(2) 配置文件(3)庫文件(4)幫助文件

RabbitMQ 應用學習隨筆

創建用戶 chang 可見 .cn hosts oca gem 綁定 per   1.安裝     Rabbit MQ 是建立在強大的Erlang OTP平臺上,因此安裝RabbitMQ之前要先安裝Erlang。     erlang:http://www.erlang.o

算法設計與分析入門學習練習之二

oid cnblogs 練習 find end 算法設計 for bsp 一行 //計算1/1!-1/3!+1/5!-1/7!+…+(-1)^(n+1)/(2n-1)! float mathTest(int n){ int sign = 1; float

Lucene入門學習

測試 oda 上下 可選 有意義 ioe director exe directory 參考博客: http://blog.csdn.net/ayi_5788/article/category/6348409 分頁: http://blog.csdn.net/hu94816

java入門學習筆記之1(類的定義,代碼的編譯執行)

spa hex nts 自動調用 [] alt vim 進制 技術 這篇文章講解Java代碼的基本執行過程 我們先拋開各種JAVA IDE,開發工具,只使用文本編輯器,以突出最本質的東西。 在Linux環境下,我們編輯一個文件: vim HelloWorld.java

JavaSE入門學習24:Java面向對象補充

ont 執行 pri img ack ima iss 類的構造函數 條件 一Java中的Object類 Object類是全部Java類的父類。假設一個類沒有使用extendskeyword明白標識繼承另外一個類,那麽這個類默認 繼

angualar入門學習-- 自定義指令 指令編譯執行過程

監聽 監聽器 註冊 sco lar scl $watch 學習 排序 3個階段: 一、加載階段 加載angular.js的源碼,找到ng-app確定應用邊界範圍。 二、編譯階段 compile 查找所有指令,保存在一個列表中 對所有指令按優先級(property屬性值)排序

RabbitMQ基礎學習筆記(C#代碼示例)

esp 輸出 出隊 csharp 實例代碼 為什麽 mode 規則 無需 一、定義: MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。應用程序通過讀寫入隊和出隊的消息來通信

zookeeper入門學習(一)

角色 延長 rop ado lower 不能 分享 視圖 服務器端 概述:   ZooKeeper是Hadoop的開源子項目(Google Chubby的開源實現),它是一個針對大型分布式系統的可靠協調系統,提供的功能包括:配置維護、命名服務、分布式同步、組服務等。  

python入門學習--模塊

image python語言 沒有 分享 特殊 math 過程 tro 年齡 1.模塊 可以把模塊想象成導入到python以增強其功能的擴展。需要使用特殊的命令import來導入模塊。用import導入了模塊,然後按照“模塊.函數”的格式使用這個模塊的函數, 它是這樣

python入門學習--程序運行、註釋

運行 即使 註釋 com 有意義 bsp .com 創建 png 1.程序運行 1.1 python解釋器運行 File-new File創建一個新的編輯窗口,輸入下圖中的內容 選擇File-save保存程序(為純文本文件)。建立一個專門存放pytho

JavaSE入門學習23:Java面向對象之構造方法

ons 抽象類 什麽 ont 機會 語法 好的 error return 學了JavaSE面向對象這一部分,也該對構造方法做一個總結了。 一構造方法 在多數情況下,初始化一個對象的終於步驟是去調用這個對象的構造方法。構造