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
