テクノロジーの学習は2段階のプロセスです。
-
環境をセットアップする
-
こんにちは世界
私も例外ではなく、直接やってください。
1つは、RocketMQのインストールです。
1.ドキュメント
公式サイト
http://rocketmq.apache.org
GitHub
https://github.com/apache/rocketmq
2.ダウンロード
wget https://mirror.bit.edu.cn/apache/rocketmq/4.7.0/rocketmq-all-4.7.0-bin-release.zip
私たちはCentos8に基づいており、公式ドキュメントを学習しているため、ダウンロードアドレスも当然公式です。
公式ウェブサイトにアクセスして、ダウンロードするのに適したバージョンを見つけてください。現在、ここにある最新バージョンはバージョン4.7.0です。
http://rocketmq.apache.org/dowloading/releases/
https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.0/rocketmq-all-4.7.0-bin-release.zip
3.準備
3.1、解凍
unzip rocketmq-all-4.7.0-bin-release.zip
3.2、jdkをインストールします
sudo yum install java-1.8.0-openjdk-devel
4.開始
4.1、namesrvを開始します
cd rocketmq-all-4.7.0-bin-release/bin
./mqnamesrv
4.2、ブローカーを起動します
cd rocketmq-all-4.7.0-bin-release/bin
./mqbroker -n localhost:9876
一般的なエラーと解決策:
一般的なエラー:ブローカーの開始に失敗しました Cannot allocate memory
[root@node-113b bin]# ./mqbroker -n localhost:9876
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed
; error='Cannot allocate memory' (errno=12)#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/rocketmq/bin/hs_err_pid1997.log
解決:
これは、デフォルトのメモリ割り当てが大きすぎて、ローカルメモリと直接OOMを超えているためです。
bin /ディレクトリにある次の2つのスクリプトを変更します
runbroker.sh
runserver.sh
これらの2つのスクリプトを検索して-server -Xms
、メモリを小さく割り当てます。自分でプレイする場合は、512MBで十分です。
4.3。スタートアップを成功させるためのロゴ
namesrvは正常な識別を開始します。
ブローカーの起動成功フラグ:
2.RocketMQコンソールのインストール
現在、コンソールを入手するには2つの方法があります。
-
サードパーティのWebサイトにアクセスして、csdnなどの既製のものをダウンロードします。
-
公式のソースコードパッケージはそれ自体でコンパイルされており、公式の既製のものはありません。
ここでは確かに公式の方法を採用しています。
1.公式文書
githubリポジトリ
https://github.com/apache/rocketmq-externals
中国語ガイド
https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md
2.ソースコードをダウンロードします
https://codeload.github.com/apache/rocketmq-externals/zip/master
3.構成を変更します(オプション)
ダウンロードおよび解凍後のファイルディレクトリは次のとおりです。
rocketmq-console\src\main\resources\application.properties
ファイルserver.port
を変更するものは大丈夫です。デフォルトは8080です。
4.コンパイルしてパッケージ化します
を入力しrocketmq-console
、mavenを使用してコンパイルおよびパッケージ化します
mvn clean package -DskipTests
パッケージ化後、ターゲットの下にSpring Boot jarプログラムを生成し、直接java -jar
起動します。
5.コンソールを起動します
コンパイルおよびパッケージ化されたspringbootプログラムをサーバーにスローし、次のコマンドを実行して開始します
java -jar rocketmq-console-ng-1.0.1.jar --rocketmq.config.namesrvAddr=127.0.0.1:9876
バックグラウンドで開始したい場合は、nohup&
効果を確認するには、次のURLにアクセスしてください。
3、テスト
Rocketmqは、インストール後に簡単にテストできるテストツールとテストクラスを提供します。
0、準備
rocketmqが提供するデフォルトのテストツールは、と呼ばれるbinディレクトリにありtools.sh
ます。テストする前にこのスクリプトを構成し、彼のnamesrvアドレスを指定する必要があります。そうしないと、メッセージの送信/消費をテストするときに次のエラーが発生します。null への接続に失敗しました:
22:49:02.470 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
java.lang.IllegalStateException: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to null failed
構成は次のとおりです。
vim tools.sh
# 在export JAVA_HOME上面添加如下这段代码
export NAMESRV_ADDR=localhost:9876
1.メッセージを送信します
./tools.sh org.apache.rocketmq.example.quickstart.Producer
成功すると、このクラスはTopicTestに1000個のメッセージを送信するため、急いでいるログが表示されます。
2.消費者ニュース
./tools.sh org.apache.rocketmq.example.quickstart.Consumer
成功すると、このクラスはTopicTestの下のすべてのメッセージを消費するため、急いでいるログが表示されます。送信されたばかりの1000が消費されます。
3.コンソール
送信が成功すると、当然、コントロールコンソールにアクセスして、ニュースや消費情報などを確認できます。
4、アーキテクチャ図と役割
1.アーキテクチャ図
2.役割
2.1、ブローカー
-
RocketMQ自体として理解する
-
ブローカーは主にプロデューサーとコンシューマーがメッセージを送受信するために使用されます
-
ブローカーは定期的にその情報をネームサーバーに送信します
-
メッセージミドルウェアのメッセージ保存・転送サーバーです
-
各ブローカーノードが起動すると、ネームサーバーリストをトラバースし、各ネームサーバーとの長い接続を確立し、独自の情報を登録して、定期的にレポートします。
2.2、ネームサーバー
-
動物園の飼育係の効果を理解しましたが、彼はzkを使用せず、代わりにzkの代わりにネームサーバーを作成しました。
-
最下層は、ルーティング管理、サービス登録、およびサービス検出機能を提供するnettyによって実装されます。これはステートレスノードです。
-
ネームサーバーはサービス検出器です。クラスター内の各ロール(プロデューサー、ブローカー、コンシューマーなど)は、お互いを検出するために、定期的にネームサーバーにステータスを報告する必要があります。タイムアウトが報告されない場合、ネームサーバーはそれを削除します。リストから。
-
複数のネームサーバーを展開できます。複数のネームサーバーが存在する場合、他のロールが同時に情報をレポートして、高可用性を確保します。
-
ネームサーバークラスターは相互に通信せず、アクティブとスタンバイの概念はありません
-
ネームサーバーのメモリストレージ、ブローカー、トピック、およびネームサーバー内の他の情報はデフォルトで永続化されないため、ステートレスノードです。
2.3、プロデューサー
-
メッセージプロデューサー
-
ネームサーバーノードの1つをランダムに選択して、長い接続を確立し、トピックルーティング情報(トピックの下のキュー、これらのキューが分散されているブローカーなど)を取得します。
-
次に、トピックサービスを提供するマスターへの長い接続を確立し(マスターのみがrocketmqにメッセージを書き込むことができるため)、定期的にマスターにハートビートを送信します
2.4、消費者
-
メッセージ消費者
-
ネームサーバークラスターを介してトピックルーティング情報を取得し、対応するブローカーに接続してメッセージを消費します
-
マスターとスレーブの両方がメッセージを読み取ることができるため、コンシューマーはマスターとスレーブの両方との接続を確立してメッセージを消費します
3.コアプロセス
-
ブローカーはネームサーバーに登録されています
-
プロデューサーがメッセージを送信すると、ネームサーバーからメッセージのトピック情報を取得します。
-
プロデューサーは、サービスを提供するすべてのマスターとの長い接続を確立し、定期的にマスターにハートビートを送信します
-
コンシューマーは、ネームサーバークラスターを介してトピックルーティング情報を取得します
-
コンシューマーは、すべてのマスターおよびすべてのスレーブとの接続を確立して、新しいメッセージを監視します
5つのコアコンセプト
1、メッセージ
メッセージキャリア。メッセージを送信または消費するときにトピックを指定する必要があります。メッセージには、メッセージをフィルタリングするためのオプションのタグアイテムがあり、追加のキーと値のペアを追加できます。
2、トピック
メッセージの論理分類メッセージを送信する前に、送信するトピックを指定する必要があります。つまり、メッセージはこのトピックに送信されます。メッセージを消費するときに消費するこのトピックを指定します。論理的な分類です。
3、キュー
トピックはN個のキューに分割され、その数は構成可能です。メッセージ自体は実際にはキューに格納されており、コンシューマーが消費するのはキュー上のメッセージでもあります。これについて詳しく説明します。たとえば、トピックが1つとキューが4つあり、5つのコンシューマーがこのトピックを消費している場合、1つのコンシューマーが無駄になります。負荷分散戦略により、各コンシューマーは1つのキューを消費します(5> 4)。 、オーバーフロー1はい、これは機能しません。
4、タグ
タグは、名前が示すように、トピックのさらなる細分化です。各メッセージは、送信時にタグ付けでき、消費時にタグに従ってフィルタリングでき、選択的に消費できます。
5、メッセージモデル
メッセージモデル:クラスタリングとブロードキャスト
6、メッセージオーダー
メッセージの順序:order(Orderly)およびconcurrent(Concurrently)
7、プロデューサーグループ
メッセージプロデューサーグループ
8、消費者グループ
メッセージ消費者グループ
シックス、ACK
最初に明確にする必要があるのは、ACKメカニズムはプロデューサー側ではなくコンシューマー側で発生するということです。つまり、コンシューマーはメッセージを消費した後にACKを確認する必要があります。確認されない場合は、消費が失敗したことを意味します。このとき、ブローカーは再試行戦略を実行します(クラスターモードのみが再試行します)。 )。ACKの意味:消費者は言った:わかりました、私は消費に成功しました。このメッセージを消費済みとしてマークします。
7.消費モデル
1.クラスターモード(クラスタリング)
1.1図
1.2。機能
-
各メッセージは1回だけ処理する必要があり、ブローカーはコンシューマークラスター内の1つのコンシューマーにのみメッセージを送信します。
-
メッセージが再投稿された場合、同じマシンにルーティングされるとは限りません。
-
消費状況はブローカーによって維持されます
2.ブロードキャストモード(ブロードキャスト)
2.1イラスト
2.2。機能
-
消費スケジュールは消費者によって維持されます
-
すべてのコンシューマーがメッセージを1回消費するようにします
-
消費に失敗したメッセージは再投稿されません
8. RocketMQ-API:https://blog.csdn.net/My_SweetXue/article/details/107381276