1.1 NameServer
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)
#下載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
[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
#先將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