1. 程式人生 > 其它 >訊息佇列之RocketMQ簡介及單機部署(一)

訊息佇列之RocketMQ簡介及單機部署(一)

二、RocketMQ

官方參考部署文件:https://rocketmq.apache.org/docs/quick-start/

1 RocketMQ各元件介紹

1.1 NameServer

NameServer是一個非常簡單的Topic路由註冊中心,其角色類似Dubbo中的zookeeper,支援Broker的動態註冊與發現。主要包括兩個功能:

Broker管理:NameServer接受Broker叢集的註冊資訊並且儲存下來作為路由資訊的基本資料。然後提供心跳檢測機制,檢查Broker是否還存活;

路由資訊管理:每個NameServer將儲存關於Broker叢集的整個路由資訊和用於客戶端查詢的佇列資訊。然後Produce和Conumser通過NameServer就可以知道整個Broker叢集的路由資訊,從而進行訊息的投遞和消費。NameServer通常也是叢集的方式部署,各例項間相互不進行資訊通訊。Broker是向每一臺NameServer註冊自己的路由資訊,所有每一個NameServer例項送上面都儲存一份完整的路由資訊。當某個NameServer因某種原因下線了,Broker任然可以向其他NameServer同步其路由資訊,Producer,Consumer仍然可以動態感知Broker的路由資訊。

1.2 Broker

Broker主要負責訊息的儲存、投遞和查詢以及服務高可用保證,為了實現這些功能,Broker包含了以下幾個重要子模組:

Remoting Module:整個Broker的實體,負責處理來自clients端的請求。

Client Manager:負責管理客戶端(Producer/Consumer)和維護Consumer的Topoc訂閱資訊。

Store Service:提供方便簡單的API介面處理訊息儲存到物理磁碟和查詢功能。

HA Service:高可用服務,提供Master Broker和Slvae Broker之間的資料同步功能。

Index Service:根據特定的Message Key對投遞到Broker的訊息進行索引服務,以提供訊息的快速查詢。

1.3 Producer(生產者)

訊息釋出者,支援分散式叢集部署。Produer 通過 MQ 負載均衡模組選擇相應 Broker 中的 queue 進行訊息投遞,投遞過程支援快速失敗並且低延遲。

1.4 Consumer(消費者)

訊息消費的角色,支援分散式叢集方式部署。支援以push推,pull拉兩種模式對訊息進行消費。同時也支援叢集方式和廣播方式的消費,它提供實時訊息訂閱機制,可以滿足大多數使用者的需求。

1.5 Topic

區分訊息的種類;一個傳送者可以傳送訊息給一個或者多個Topic;一個訊息的接收者可以訂閱一個或者多個Topic訊息。

1.6 Message Queue

相當於是Topic的分割槽;用於並行傳送和接收訊息。

2 RocketMQ的特點

1、是一個佇列模型的訊息中介軟體,具有高效能、高可靠、高實時、分散式等特點。

2、Producer、Consumer、佇列都可以分散式。

3、Producer向一些佇列輪流傳送訊息,佇列集合稱為Topic,Consumer如果做廣播消費,則一個Consumer例項消費這個Topic所有佇列,如果做叢集消費,則多個Consumer例項平均消費這Topic對應的佇列集合。

4、能夠保證嚴格的訊息順序。

5、支援拉(pull)和推(push)兩種訊息模式。

6、高效的訂閱者水平擴充套件能力。

7、實時的訊息訂閱機制。

8、億級訊息堆積能力。

9、支援多種訊息協議,如JMS、OpenMessaging等。

10、較少的依賴。

3 RocketMQ單機部署

官方參考地址:https://rocketmq.apache.org/docs/quick-start/

3.1 部署java環境

#建立java的目錄
mkdir -p /apps/java
#將下載好的檔案傳到目錄下解壓
tar xvf jdk-8u271-linux-x64.tar.gz
#建立軟連結
ln -sv jdk1.8.0_271/ jdk
#配置環境變數
vim /etc/profile.d/java.sh
#java環境變數
export JAVA_HOME=/apps/java/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#同步檔案
source /etc/profile.d/java.sh
#測試java環境變數是否配置成功
root@ubuntu-40:/apps# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

3.2 部署RocketMQ

#下載RocketMQ包
root@ubuntu-40:/apps/rocketMQ# wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.9.0/rocketmq-all-4.9.0-bin-release.zip
#解壓
root@ubuntu-40:/apps/rocketMQ# unzip rocketmq-all-4.9.0-bin-release.zip
#建立軟連結
root@ubuntu-40:/apps/rocketMQ# ln -sv rocketmq-all-4.9.0-bin-release/ rocketmq
#虛擬機器環境下,需要修改配置檔案中的記憶體大小
root@ubuntu-40:/apps/rocketMQ/rocketmq# vim bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn25m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
root@ubuntu-40:/apps/rocketMQ/rocketmq# vim bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn256m"
#啟動namesev
root@ubuntu-40:/apps/rocketMQ/rocketmq# nohup bash bin/mqnamesrv &
#啟動broker
root@ubuntu-40:/apps/rocketMQ/rocketmq# nohup sh bin/mqbroker -n localhost:9876 &
#驗證是否部署成功
root@ubuntu-40:/apps/rocketMQ/rocketmq# jps
33812 BrokerStartup
33783 NamesrvStartup
34011 Jps
#關閉namesev
root@ubuntu-40:/apps/rocketMQ/rocketmq# sh bin/mqshutdown namesrv
#關閉broker
root@ubuntu-40:/apps/rocketMQ/rocketmq# sh bin/mqshutdown broker

3.3 使用systemctl管理RocketMQ

namesrv的service檔案

[Unit]
Description=namesrv
After=network.target
Documentation=http://rocketmq.apache.org/

[Service]
#啟動使用者
User=root
#這裡Type一定要寫simple
Type=simple
#java的位置
Environment=JAVA_HOME=/apps/java/jdk
#ExecStart和ExecStop分別在systemctl start和systemctl stop時候調動
ExecStart=/apps/rocketmq/rocketmq-all-4.9.0-bin-release/bin/mqnamesrv
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/apps/rocketmq/rocketmq-all-4.9.0-bin-release/bin/mqshutdown namesrv

[Install]
WantedBy=multi-user.target

broker的service檔案

[Unit]
Description=broker
After=network.target
Documentation=http://rocketmq.apache.org/

[Service]
#啟動使用者
User=root
#這裡Type一定要寫simple
Type=simple
#java的位置
Environment=JAVA_HOME=/apps/java/jdk
#ExecStart和ExecStop分別在systemctl start和systemctl stop時候調動
#注意:啟動時,需要在Broker.conf檔案中指定namesrv的ip和埠 ExecStart
=/apps/rocketmq/rocketmq-all-4.9.0-bin-release/bin/mqbroker -c /apps/rocketmq/rocketmq-all-4.9.0-bin-release/conf/broker.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/apps/rocketmq/rocketmq-all-4.9.0-bin-release/bin/mqshutdown broker [Install] WantedBy=multi-user.target

3.4 RocketMQ web管理介面 rocketMQ-console

下載地址:https://github.com/apache/rocketmq-externals

#先將RocketMQ-console的原始碼克隆下來
git clone https://github.com/apache/rocketmq-externals.git
#裡面會有很多個專案
root@ubuntu-001:/data/daima/rocketmq-externals-master# ll
total 132
drwxr-xr-x 30 root root 4096 Jun 10 12:48 ./
drwxr-xr-x  4 root root 4096 Jun 17 14:46 ../
drwxr-xr-x  2 root root 4096 Jun 10 12:48 .github/
-rw-r--r--  1 root root  154 Jun 10 12:48 .gitignore
-rw-r--r--  1 root root  349 Jun 10 12:48 .travis.yml
-rw-r--r--  1 root root 3425 Jun 10 12:48 README.md
drwxr-xr-x  2 root root 4096 Jun 10 12:48 dev/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 docs/
drwxr-xr-x  2 root root 4096 Jun 10 12:48 rocketmq-cloudevents-binding/
drwxr-xr-x  6 root root 4096 Jun 10 12:48 rocketmq-connect/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-connect-activemq/
drwxr-xr-x  4 root root 4096 Jun 10 12:48 rocketmq-connect-cassandra/
drwxr-xr-x  2 root root 4096 Jun 10 12:48 rocketmq-connect-console/
drwxr-xr-x  2 root root 4096 Jun 10 12:48 rocketmq-connect-es/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-connect-jdbc/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-connect-jms/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-connect-kafka/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-connect-mongo/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-connect-rabbitmq/
drwxr-xr-x  4 root root 4096 Jun 10 12:48 rocketmq-connect-redis/
drwxr-xr-x  5 root root 4096 Jun 10 12:48 rocketmq-console/
drwxr-xr-x  4 root root 4096 Jun 10 12:48 rocketmq-flink/
drwxr-xr-x  5 root root 4096 Jun 10 12:48 rocketmq-flume/
drwxr-xr-x  5 root root 4096 Jun 10 12:48 rocketmq-hbase/
drwxr-xr-x  7 root root 4096 Jun 10 12:48 rocketmq-iot-bridge/
drwxr-xr-x  5 root root 4096 Jun 10 12:48 rocketmq-jms/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-knative/
drwxr-xr-x  5 root root 4096 Jun 10 12:48 rocketmq-mysql/
drwxr-xr-x  4 root root 4096 Jun 10 12:48 rocketmq-redis/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-replicator/
drwxr-xr-x  3 root root 4096 Jun 10 12:48 rocketmq-sentinel/
drwxr-xr-x  7 root root 4096 Jun 10 12:48 rocketmq-serializer/
drwxr-xr-x  4 root root 4096 Jun 10 12:48 rocketmq-spark/
#進入到console原始碼目錄,使用mvn進行編譯
cd rocketmq-console
mvn clean package -Dmaven.test.skip=true
#啟動前需要指定namesrv的地址,所以需要設定環境變數
export NAMESRV_ADDR="localhost:9876"
#後臺啟動rocketMQ-console
nohup java -jar rocketmq-console-ng-2.0.0.jar &

在瀏覽器中輸入訪問,預設地址ip:8080