主頁 > 後端開發 > 訊息中間件RabbitMQ

訊息中間件RabbitMQ

2021-08-31 18:01:31 後端開發

1. MQ 的相關概念

1.1 什么是MQ

MQ全稱為Message Queue,訊息佇列是應用程式和應用程式之間的通信方法,

本質是個佇列,資料是先入先出,只不過佇列中存放的內容是 message 而已,還是一種跨行程的通信機制,用于上下游傳遞訊息,在互聯網架構中,MQ 是一種非常常 見的上下游“邏輯解耦+物理解耦”的訊息通信服務,使用了 MQ 之后,訊息發送上游只需要依賴 MQ,不 用依賴其他服務,

1.2 為什么要用MQ

我公司是跨境電商公司,我就用電商的系統為例吧,我公司通過自己開發的ERP系統和第三方電商平臺進行訂單、庫存、物流、支付等系統的資料對接,

就在19年的雙十一,公司的ERP掛了,十多萬訂單沒有導進ERP系統,導致公司倉庫物流基本癱瘓,研發部門全部受到了處罰,

開發中訊息佇列通常有如下應用場景:

1、任務異步處理
在專案中,可將一些無需即時回傳且耗時的操作提取出來,進行異步處理,而這種異步處理的方式大大的節省了服務器的請求回應時間,從而提高了系統的吞吐量,

例如 A 呼叫 B,B 需要花費很長時間執行,但是 A 需要知道 B 什么時候可 以執行完,以前一般有兩種方式,A 過一段時間去呼叫 B 的查詢 api 查詢,或者 A 提供一個 callback api, B 執行完之后呼叫 api 通知 A 服務,這兩種方式都不是很優雅,使用訊息總線,可以很方便解決這個問題, A 呼叫 B 服務后,只需要監聽 B 處理完成的訊息,當 B 處理完成后,會發送一條訊息給 MQ,MQ 會將此 訊息轉發給 A 服務,這樣 A 服務既不用回圈呼叫 B 的查詢 api,也不用提供 callback api,同樣 B 服務也不 用做這些操作,A 服務還能及時的得到異步處理成功的訊息,

2、應用程式解耦合

MQ相當于一個中介,生產方通過MQ與消費方互動,它將應用程式進行解耦合,

用戶創建訂單后,如果耦合呼叫庫存系統、物流系統、支付系統,任何一個子系統出了故障,都會造成下單操作例外,當轉變成基于訊息佇列的方式后,系統間呼叫的問題會減少很多,比如物流系統因為發生故障,需要幾分鐘來修復,在這幾分鐘的時間里,物流系統要處理的記憶體被快取在訊息佇列中,用戶的下單操作可以正常完成,當物流 系統恢復后,繼續處理訂單資訊即可,中單用戶感受不到物流系統的故障,提升系統的可用性,

3、削峰填谷

如訂單系統,在下單的時候就會往資料庫寫資料,但是資料庫只能支撐每秒1000左右的并發寫入,并發量再高就容易宕機,低峰期的時候并發也就100多個,但是在高峰期時候,并發量會突然激增到5000以上,這個時候資料庫肯定卡死了,

訊息被MQ保存起來了,然后系統就可以按照自己的消費能力來消費,比如每秒1000個資料,這樣慢慢寫入資料庫,這樣就不會卡死資料庫了,

 

但是使用了MQ之后,限制消費訊息的速度為1000,但是這樣一來,高峰期產生的資料勢必會被積壓在MQ中,高峰就被“削”掉了,但是因為訊息積壓,在高峰期過后的一段時間內,消費訊息的速度還是會維持在1000QPS,直到消費完積壓的訊息,這就叫做“填谷”

 

2. RabbitMQ

2.1 RabbitMQ的概念

RabbitMQ 是一個訊息中間件:它接受并轉發訊息,你可以把它當做一個快遞站點,當你要發送一個包 裹時,你把你的包裹放到快遞站,快遞員最侄訓把你的快遞送到收件人那里,按照這種邏輯 RabbitMQ 是 一個快遞站,一個快遞員幫你傳遞快件,RabbitMQ 與快遞站的主要區別在于,它不處理快件而是接收, 存盤和轉發訊息資料,

RabbitMQ官方地址:http://www.rabbitmq.com/

RabbitMQ提供了6種模式:簡單模式,work模式,Publish/Subscribe發布與訂閱模式,Routing路由模式,Topics主題模式,RPC遠程呼叫模式(遠程呼叫,不太算MQ;暫不作介紹);

官網對應模式介紹:https://www.rabbitmq.com/getstarted.html

2.2 四大核心概念

生產者

產生資料發送訊息的程式是生產者

交換機

交換機是 RabbitMQ 非常重要的一個部件,一方面它接收來自生產者的訊息,另一方面它將訊息 推送到佇列中,交換機必須確切知道如何處理它接收到的訊息,是將這些訊息推送到特定佇列還是推送到多個佇列,亦或者是把訊息丟棄,這個得有交換機型別決定

佇列

佇列是 RabbitMQ 內部使用的一種資料結構,盡管訊息流經 RabbitMQ 和應用程式,但它們只能存盤在佇列中,佇列僅受主機的記憶體和磁盤限制的約束,本質上是一個大的訊息緩沖區,許多生產者可以將訊息發送到一個佇列,許多消費者可以嘗試從一個佇列接收資料,這就是我們使用佇列的方式

消費者

消費與接收具有相似的含義,消費者大多時候是一個等待接收訊息的程式,請注意生產者,消費 者和訊息中間件很多時候并不在同一機器上,同一個應用程式既可以是生產者又是可以是消費者,

2.3 RabbitMQ核心部分

2.4 各個名詞介紹

 

Broker:接收和分發訊息的應用,RabbitMQ Server 就是 Message Broker

Virtual host:出于多租戶和安全因素設計的,把 AMQP 的基本組件劃分到一個虛擬的分組中,類似 于網路中的 namespace 概念,當多個不同的用戶使用同一個 RabbitMQ server 提供的服務時,可以劃分出 多個 vhost,每個用戶在自己的 vhost 創建 exchange/queue 等

Connection:publisher/consumer 和 broker 之間的 TCP 連接

Channel:如果每一次訪問 RabbitMQ 都建立一個 Connection,在訊息量大的時候建立 TCP Connection 的開銷將是巨大的,效率也較低,Channel 是在 connection 內部建立的邏輯連接,如果應用程 序支持多執行緒,通常每個 thread 創建單獨的 channel 進行通訊,AMQP method 包含了 channel id 幫助客 戶端和 message broker 識別 channel,所以 channel 之間是完全隔離的,Channel 作為輕量級的 Connection 極大減少了作業系統建立 TCP connection 的開銷

Exchange:message 到達 broker 的第一站,根據分發規則,匹配查詢表中的 routing key,分發 訊息到 queue 中去,常用的型別有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)

Queue:訊息最終被送到這里等待 consumer 取走

Binding:exchange 和 queue 之間的虛擬連接,binding 中可以包含 routing key,Binding 資訊被保 存到 exchange 中的查詢表中,用于 message 的分發依據 

2.5 安裝 

1.官網地址

https://www.rabbitmq.com/download.html

安裝大家百度就行了,這個要看你是什么系統,只要注意版本不要沖突就行了

 

 

 

 可以看到我的版本是沒有沖突的

 2.常用命令(按照以下順序執行)

添加開機啟動 RabbitMQ 服務

chkconfig rabbitmq-server on

service rabbitmq-server start–開啟

service rabbitmq-server stop–關閉

service rabbitmq-server status–查看當前運行狀態

3. 開啟 web 管理插件

rabbitmq-plugins enable rabbitmq_management

此時通過ip:15672就能打開web 管理頁面

 

如果沒有的話,可能是防火墻沒關閉,直接關閉瀏覽器就行了,

如果還不行,那么問題可能就有點麻煩了

輸入rabbitmq-plugins list
正常啟動的服務應該是這樣,E和e分別表示顯性和隱性啟動:

 如果不是這個樣子,輸入rabbitmq-plugins enable rabbitmq_management啟動插件通常即可解決80%的問題.如果還是解決不了或者是本來就已經啟動插件的情況繼續第2步.
2.繼續輸入rabbitmqctl start_app

顯示錯誤可能有三種:
1)目標節點無法訪問(例如,由于主機名決議,TCP連接或防火墻問題)
2)CLI工具無法通過服務器進行身份驗證(例如,由于CLI工具的Erlang cookie與服務器不匹配)
3)目標節點未運行
對應的解決辦法:
1)ping一下主機地址看能不能ping通,不通就是地址有問題或者主機有問題,;檢查防火墻是否攔截以及mq需要的埠號能否使用(方法請自行百度,因為一般都不是這個問題就不贅述了)
2)身份驗證沒有通過,都有哪些情況我不清楚
3)此外可以查詢官方檔案https://www.rabbitmq.com/plugins.html

4.添加一個新的用戶

用默認賬號密碼(guest)訪問地址 http://47.115.185.244:15672/出現權限問題

 我們先查看下當前已有的用戶

查詢當前用戶和角色

rabbitmqctl list_users

 

創建賬號

rabbitmqctl add_user admin 123

 

設定用戶角色

rabbitmqctl set_user_tags admin administrator

設定用戶權限 set_permissions [-p <vhostpath>] <user> <conf> <write> <read>

執行下面這句話就行

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

用戶 user_admin 具有/vhost1 這個 virtual host 中所有資源的配置、寫、讀權限

 

5.再次利用 admin 用戶登錄

 

6. 其他命令

關閉應用的命令為rabbitmqctl stop_app

清除的命令為 rabbitmqctl reset

重新啟動命令為 rabbitmqctl start_app

3. Hello World

這是MQ中最簡單的一種模式了,我們就用這個模式來入門,

在下圖中,“ P”是我們的生產者,“ C”是我們的消費者,中間的框是一個佇列-RabbitMQ 代 表使用者保留的訊息緩沖區

 

3.1 依賴

maven專案大家總會創建吧,這里就隨便你們發揮了,

<!--指定 jdk 編譯版本-->
<build>
 <plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <configuration>
 <source>8</source>
 <target>8</target>
 </configuration>
 </plugin>
 </plugins>
</build>
<dependencies>
 <!--rabbitmq 依賴客戶端-->
 <dependency>
 <groupId>com.rabbitmq</groupId>
 <artifactId>amqp-client</artifactId>
 <version>5.8.0</version>
 </dependency>
 <!--操作檔案流的一個依賴-->
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.6</version>
 </dependency>
</dependencies>

 

1

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295986.html

標籤:Java

上一篇:Java執行緒的優先級在什么時候可以重新設定?

下一篇:并發編程之:ThreadLocal

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more