Kafka、RocketMQ、RabbitMQの導入および使用経験

序文

最近、私はさまざまなメッセージキューソリューションを研究していますが、直感的なエクスペリエンスを得るために、Kafka、RocketMQ、およびRabbitMQをそれぞれ展開し、最も基本的なプロダクションおよびコンシュームメッセージング機能を使用しました。展開プロセス中にいくつかの問題が発生しました。これはここに記録されます。この記事は、メッセージキューを使用したことがなく、まだインストールと展開の段階にある初心者ユーザーのみを対象としています。ソフトウェアを理解するには、ソフトウェアを使い始めることから直感的な印象を得ることが最善の方法です。この記事はここでも役割を果たします。より詳細なアーキテクチャと詳細を理解する必要があるため、他のドキュメントをクエリする必要がありますが、この記事の目的ではありません。ここで使用するオペレーティングシステムはCentos 6.xであり、ハードウェア構成で通常は十分です。

Kafkaの展開と使用

公式サイトの手順を参考にKafkaを起動しましたが、クイックスタートの章を直接参照してください。

手順1:インストールパッケージをダウンロードして解凍する

#wget https://mirror.bit.edu.cn/apache/kafka/2.4.1/kafka_2.12-2.4.1.tgz
# tar -xzf kafka_2.12-2.4.1.tgz
# cd kafka_2.12-2.4.1

問題:ダウンロードで次のエラーが報告される場合があります(エラーが報告されない場合は無視してください):
mirrors.tuna.tsinghua.edu.cnに安全に接続するには、「-no-check-certificate」を使用します。
エラー通知のパラメーターを追加するだけです
Wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.1/kafka_2.12-2.4.1.tgz

ステップ2:サーバーを起動する

上記の最初のステップの実行後、現在ディレクトリkafka_2.12-2.4.1で、次のコマンドを実行してzookeeperサービスを開始します。Kafkaはzookeeperサービスに依存しているため、zookeeperサービスを個別にインストールする必要があるため、最初にzookeeperサービスを開始する必要があります。Kafkaインストールパッケージは、Kafkaサービスの迅速な実行を容易にするためのシンプルな単一ノードzookeeperインスタンスを提供します。正式な環境で使用する場合は、Kafka用のzookeeperサービス(通常、単一ノードではなく分散クラスター)を個別にインストールする必要があります。 。

# bin/zookeeper-server-start.sh config/zookeeper.properties

我在运行此命令时候报下面的错误:
認識されないVMオプション '+ UseGCLogFileRotation'
Java仮想マシンを作成できませんでした。

プロンプトから、それはJava仮想マシンがパラメーターUseGCLogFileRotationをサポートしていないためですデータを確認し、このパラメーターは削除できると言いました。bin/zookeeper-server-start.sh 脚本中调用了 bin/kafka-run-class.sh ,真正起作用的代码在这个脚本中 kafka-run-class.sh,打开这个脚本找到上述参数所在的地方,去掉 -XX:+UseGCLogFileRotation , 如下图所示:
UseGCLogFileRotation报错

继续运行上面的脚本,继续报错:
認識されないVMオプション 'NumberOfGCLogFiles = 10'
Java仮想マシンを作成できませんでした。

以前と同様に、以下に示すように、-XX:NumberOfGCLogFiles = 10の削除を続行します。
NumberOfGCLogFilesパラメータエラー

実行を続けるとエラーが発生します:
認識されないVMオプション 'GCLogFileSize = 100M'
Java仮想マシンを作成できませんでした。

以下に示すように、スクリプトで-XX:GCLogFileSize = 100Mを削除し続けます。
GCLogFileSizeエラー

実行を続けると、次のエラーが発生します。
UnsupportedClassVersionError错误

プロンプトメッセージから、javaバイトコードの互換性の問題であることがわかります。Java.lang.UnsupportedClassVersionErrorは、現在実行中のzookeeperのバイトコードがJavaコンパイラの高バージョンによってコンパイルされ、現在のランタイム環境が低いことを意味しますバージョンなので、互換性がありません。次のコマンドを実行して、Javaバージョンを表示し
ます#java -version

javaバージョン "1.6.0_24"
OpenJDKランタイム環境(IcedTea6 1.11.8)(rhel-1.56.1.11.8.el6_3-x86_64)
OpenJDK 64ビットサーバーVM(ビルド20.0-b12、混合モード)

それはjdk1.6です、このバージョンは低すぎます、私たちはjdk1.8以上をインストールする必要があります、それをインストールする方法、ここで私は最初にシステムのインストールソースを検索します、もしあれば、オペレーティングシステムによって提供されるソースから直接インストール、そうでない場合は、ソースコードなどの他の方法でインストールする必要があります。次のコマンドを実行して表示します。

#yum検索openjdk

結果は次のとおりです。
yum-search-openjdk

次の開発環境をインストールします。違いは、開発環境にはjavacなどのコンパイルツールがあり、ランタイム環境にはないことです。ランタイム環境には、javacを使用して後でコンパイルする必要があるため、Javaプログラムの実行に必要なツールのみが含まれます。開発環境をインストールし、次のコマンドを使用してインストールを完了します。

#yum install java-1.8.0-openjdk-devel.x86_64

成功後、また走ります bin/zookeeper-server-start.sh config/zookeeper.properties 以启动zookeeper服务,没有任何错误,最后停留在如下界面:
run zookeeper

Kafkaサービスを開始します。bin/kafka-server-start.sh config/server.properties 没有任何报错,中间会打印出Kafka的配置,输出比较多,我只截取了一部分,其中 INFO KafkaConfig values 后面就是kafka的配置:
カフカを実行

ステップ3:トピックを作成する

# bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic testtopic

Kafka サーバートピックのリストを作成できます。
#  bin/kafka-topics.sh --list --bootstrap-server localhost:9092
testtopicステップ4

:メッセージを送信します

# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic testtopic

> hello message
>
コマンドの実行>プロンプトは入力メッセージを待ち、文字列hello messageを入力してEnterを押します

ステップ5:消費者を開始する

# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testtopic --from-beginning
hello message

この時点で、送信メッセージ側でメッセージを入力し続け、Enterキーを押します。コンシューマは受信したメッセージを引き続き印刷しますこれで、Kafkaの単純なメッセージの送受信が完了しました。

RocketMQの展開と使用

公式ウェブサイトのドキュメントの「クイックスタート」セクションのプロンプトに従って、引き続き操作を開始します。公式ウェブサイトでは、64ビットLinux / Unix / Macオペレーティングシステムの使用を推奨しています。64ビットCentos 6.xを使用しています。JDK1.8+を使用することをお勧めします。 Kadkaはすでにjdk1.8をインストールしていて、maven3.2.xが必要ですが、私のシステムにはないので、最初にmavenをインストールする必要があります。

mavenをインストールします。

1. mavenインストールパッケージをダウンロードしますここでより高いバージョンを使用しています:
#wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5。 4-bin.tar.gz

2. Mavenのインストールパッケージを解凍します:
#タール-zxvfアパッチ-maven -3.5 。4 -bin の.tar が.gz

3. mavenをプロファイルファイルに設定して、起動時に環境変数vim / etc / profileを自動的に設定します。次の2行を追加します:
export MAVEN_HOME = / data / rocket_mq / apache-maven-3.5.4
export PATH = $ MAVEN_HOME / bin:$パス

ここで、対応する独自のディレクトリに変更する必要があることに注意してください

4.環境変数を有効にします。
#source / etc / profile

5.正常かどうかを確認し
ます#mvn -version

Apache Maven 3.5.4(1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14 + 08:00)
Mavenホーム:/data/rocket_mq/apache-maven-3.5.4
Javaバージョン:1.8.0_212、ベンダー:Oracle Corporation、ランタイム:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el6_10.x86_64/jre
デフォルトロケール:en_US、プラットフォームエンコーディング:UTF-8
OS名: "linux"、バージョン: " 4.1.0-32.el6.ucloud.x86_64 "、arch:" amd64 "、family:" unix "

RocketMQのソースコードをダウンロードしてコンパイルします。


#wget https://archive.apache.org/dist/rocketmq/4.7.0/rocketmq-all-4.7.0-source-release.zip#unzip rocketmq-all-4.7.0-source-release.zip
#cd rocketmq-all-4.7.0 /
#mvn -Prelease-all -DskipTests clean install -U
#cd distribution / target / rocketmq-4.7.0 / rocketmq-4.7.0

コンパイルが成功した後のスクリーンショットは次のとおりです。
rocketmqをコンパイルする

ネームサーバーサービスを実行します。

#sh bin / mqnamesrv
エラー:環境にJAVA_HOME変数を設定してください。java (x64)が必要です!!!

まず、RocketMQをコンパイルしたときに、cd distribution / target / rocketmq-4.7.0 / rocketmq-4.7.0にディレクトリを配置しました。このディレクトリでネームサーバーサービスを実行すると、エラーが発生します。プロンプトに従って、JAVA_HOME環境変数を次のように設定する必要があります(変更後あなた自身の住所の場合):

export JAVA_HOME = / usr / lib / jvm / java-1.8.0-openjdk-1.8.0.212.b04-0.el6_10.x86_64 /
export CLASSPATH =。:$ JAVA_HOME / jre / lib / rt.jar:$ JAVA_HOME / lib /dt.jar:$JAVA_HOME/lib/tools.jar 
export PATH = $ PATH:$ JAVA_HOME / bin

次に、もう一度実行します。

#sh bin / mqnamesrv 

OpenJDK 64ビットサーバーVMの警告:CMSコレクターでのDefNew若いコレクターの使用は非推奨であり、将来のリリースで削除される可能性があります
OpenJDK 64ビットサーバーVMの警告:UseCMSCompactAtFullCollectionは非推奨であり、将来のリリースで削除される可能性があります。
ネームサーバーの起動に成功しました。serializeType = JSON

ネームサーバーが正常に実行されていることがわかります。ここで、ネームサーバーはRocketMQにネームサービスを提供するモジュールであり、その役割はKafkaのzookeeperの役割と似ています。

Brokerサービスを開始します。

ブローカーを起動するときにここで注意する必要があるのは、ここでコマンドを実行するディレクトリは、ネームサーバーが上で実行されるディレクトリと同じであることです。これらはすべて、distribution / target / rocketmq-4.7.0 / rocketmq-4.7.0ディレクトリで実行されます。上記でインポートする必要があるJAVA_HOMEなどの環境変数がここで必要ですさらに、現在のディレクトリ(ディストリビューション/ターゲット/ rocketmq-4.7.0 / rocketmq-4.7.0)でブローカーを実行するように構成ファイルを変更する必要がありますvim conf / broker.confファイルは、ファイルの後に次の構成行を追加します。

brokerIP1 = 127.0.0.1

ブローカーのIPを設定します(設定されていない場合)。マシンに内部および外部IPと外部ネットワークIPなどの複数のネットワークカードがある場合、ブローカーは最初のIPアドレスを構成し、プロデューサーの起動時に後で書き込む可能性があります。メッセージの入力に失敗すると、次のエラーが報告されます。
RemotingTooMuchRequestException

テストの便宜上、BrokerIP1をローカルループバックIPアドレス127.0.0.1として直接設定し、構成ファイルを使用してBrokerを起動します。

#bin / mqbroker -n localhost:9876 -c conf / broker.conf
ブローカー[broker-a、127.0.0.1 :10911 ]のブート成功。serializeType = JSONで、ネームサーバーはlocalhost:9876です

プロデューサーを起動してメッセージを送信します。

ブローカーの起動が完了したら、次にプロデューサーを起動してメッセージを送信します(これも、distribution / target / rocketmq-4.7.0 / rocketmq-4.7.0を見つけて、JAVA_HOMEおよびその他の環境変数をインポートするためです)。

#エクスポートNAMESRV_ADDR = localhost:9876
#sh bin / tools.sh org.apache.rocketmq.example.quickstart.Producer

03:08:05.769 [main] DEBUG inuilInternalLoggerFactory-デフォルトのロギングフレームワークとしてSLF4Jを使用
RocketMQLog:WARNロガー(io.netty.util.internal.PlatformDependent0)のアペンダーが見つかりませんでした。
RocketMQLog:WARNロガーシステムを適切に初期化してください。
SendResult [sendStatus = SEND_OK、msgId = 20020AB3FD9D000000000000000000017E931540E19D439EE28E0000、offsetMsgId = 7F00000100002A9F00000000000638E4、messageQueue = MessageQueue [topic = TopicTest、brokerName = broker-a
、queueId = 090000BIDA00000000EBDA00000000BIDA000000000000AID0000000000AID0000000000AID00000000B0000A0000A0000E0000A0000A0000E0000A0000E0000A0000E0000A000 、messageQueue = MessageQueue [topic = TopicTest、brokerName = broker-a、queueId = 1]、queueOffset = 500]
......

03:08:07.668 [NettyClientSelector_1] INFO RocketmqRemoting-closeChannel:リモートアドレスへの接続を閉じる[127.0.0.1:9876]結果:true
03:08:07.669 [NettyClientSelector_1] INFO RocketmqRemoting-closeChannel:リモートアドレスへの接続を閉じる[127.0 .0.1:10911]結果:true
途中で多くのログを省略していることがわかります。これらのログは、プロデューサーがサーバーに大量のメッセージを書き込んだことを示しています。出力が多すぎるため、2 つしかリストしていません

消費者消費ニュースを開始:

次に、コンシューマー消費メッセージを開始します(これも、distribution / target / rocketmq-4.7.0 / rocketmq-4.7.0を見つけて、JAVA_HOMEおよびその他の環境変数をインポートするためです)。

#エクスポートNAMESRV_ADDR = localhost:9876
#sh bin / tools.sh org.apache.rocketmq.example.quickstart.Consumer

03:11:37.229 [メイン]デバッグinuilInternalLoggerFactory-デフォルトのロギングフレームワークとしてSLF4Jを使用
コンシューマースタート。
ConsumeMessageThread_1新しいメッセージを受信:[MessageExt [brokerName = broker-a、queueId = 3、storeSize = 202、queueOffset = 500、sysFlag = 0、bornTimestamp = 1586804886200、bornHost = / 127.0.0.1:42523、storeTimestamp = 1586804886203、storeHost = / 127.0.0.1:10911、msgId=7F00000100002A9F0000000000063B42、commitLogOffset=408386、bodyCRC=1032136437、reconsumeTimes=0、preparedTransactionOffset=0、toString()=Message{topic='TopicTest'、flag=0、properties={MIN_OFFSET=0、MAX_OFFSET = 750、CONSUME_START_TIME = 1586805097731、UNIQ_KEY = 20020AB3FD9D000000000000000000017E931540E19D439EE2B80003、WAIT = true、TAGS = TagA}、body = [72、101、108、108、111、32、82、111、99、107、101、116、77、81 、32、51]、transactionId = 'null'
ConsumeMessageThread_3新しいメッセージを受信:[MessageExt [brokerName = broker-a、queueId = 2、storeSize = 202、queueOffset = 500、sysFlag = 0、bornTimestamp = 1586804886195、bornHost = / 127.0.0.1:42523、storeTimestamp = 1586804886196、storeHost = / 127.0.0.1:10911、msgId=7F00000100002A9F0000000000063A78、commitLogOffset=408184、bodyCRC=1250039395、reconsumeTimes=0、preparedTransactionOffset=0、toString()=Message{topic='TopicTest'、flag=0、properties={MIN_OFFSET=0、MAX_OFFSET = 750、CONSUME_START_TIME = 1586805097731、UNIQ_KEY = 20020AB3FD9D000000000000000000017E931540E19D439EE2B30002、WAIT = true、TAGS = TagA}、body = [72、101、108、108、111、32、82、111、99、107、101、116、77、81 、32、50]、transactionId = 'null'}]]

これは、大量の消費メッセージのログでもあります。ここでは、最初の2つの出力のみがリストされています。これまでのところ、RocketMQのデプロイメントとシンプルなメッセージングの使用

RabbitMQの展開と使用

RabbitMQの導入については、公式Webサイトに記載されている手順を参照し、公式Webサイトの[開始]ボタンを見つけて、[ダウンロード+インストール]ボタンをクリックします。RabbitMQには、Dockerイメージに基づいて実行できるさまざまな操作モードがあります。従来のデプロイ方法を使用します。RabbitMQはErlang言語で記述されており、Erlangランタイム環境を実行する必要があるため、最初にErlang環境をインストールする必要があります。RabbitMQチームは、RabbitMQの実行に必要なすべてのコンポーネントのみを含むErlangインストールパッケージを提供します。便宜上、簡単にインストールできる次のErlangインストールパッケージを使用します。

Erlang環境をインストールします。


#wget https://github.com/rabbitmq/erlang-rpm/releases/download/v22.3.1/erlang-22.3.1-1.el6.x86_64.rpm#yum install erlang-22.3.1-1.el6。 x86_64.rpm

エラーは報告されていません。ここに、ダウンロードされたCentosバージョンのバイナリインストールパッケージがあります。他のシステムは、RabbitMQ公式Webサイトにアクセスしてダウンロードできます。Erlangがインストールされたら、RabbitMQサービスをインストールできます。

RabbitMqをインストールします。


#wget https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc#rpm --import rabbitmq-release-signing-key.asc 
#wget http:/ /wangqiguoy.cn-bj.ufileos.com/rabbitmq-server-3.8.3-1.el6.noarch.rpm#yum
install rabbitmq-server-3.8.3-1.el6.noarch.rpm

インストールしたところ、エラーは発生しませんでした。インストールは直接完了しました。KafkaやRocketMQよりもはるかにスムーズでした。RabbitMQは、それを管理するためのWebインターフェイスを提供します。現在のキュー、チャネル情報、メッセージの蓄積などを確認できます。 、次のコマンドでプラグインを開きます。

Web管理プラグインを開きます。

#rabbitmq-pluginsはrabbitmq_managementを有効にします

ノードrabbit @ 10-179-253-157でプラグインを有効にする:
rabbitmq_management
次のプラグインが構成されました:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
プラグイン構成をrabbit @ 10-179-253-157に適用しています...
次のプラグインが有効になっています:
rabbitmq_management
rabbitmq_management
rabbitmq_web_dispatch

3つのプラグインを開始しました。

正常に開いたら、httpアドレスを使用してRabbitMQを管理するためのWebインターフェイスにアクセスできます。アドレスの形式は次のとおりです:http:// ip:15672 / ipアドレスを独自のサーバーのIPアドレスに置き換えます。
うさぎマネージャー

RabbitMQの構成ファイルを変更して、Webインターフェースにログインします。

#vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.3/ebin/rabbit.app
{loopback_users、[<< "guest" >>]}、
改成
{loopback_users、[guest]}

変更後、サービスを再起動して有効にします。上記のWebインターフェースからログインできます。ユーザー名とパスワードはどちらもゲストで、ログイン後のインターフェースは次のとおりです。
うさぎマネージャー

この機能は依然として非常に豊富で、接続、チャネル、交換、キューおよびその他の情報を表示でき、ユーザー権限を管理することもできます。Rabbitは、Webインターフェースを介してRabbitMQを管理するだけでなく、RabbitMQを管理するためのコマンドラインツールrabbitmqctlも提供します。このツールの特定の用途公式Webサイトのドキュメントを確認できるほか、RabbitMQの一般的な起動操作と停止操作については、次のコマンドを参照できます。

service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
service rabbitmq-server status

メッセージとコンシューマーメッセージを送信します。

次のように最初のノードの環境を準備し、RabbitMQのは、テストコマンドラインを提供していませんが、RabbitMQのは、私はnodejsを使用することを選択した多くのクライアントのために利用できるデモが用意されています
。#yumをインストールnodejs
#yumをインストールNPM
#NPM amqplibインストール
の最後amqplibのワンステップインストールは、nodejsで使用されるRabbitMQに関連するクライアントライブラリです。プロデューサーsend.jsコードは次のとおりです。

//send.js 
var amqp = require( 'amqplib / callback_api'); 
amqp.connect( 'amqp:// localhost'、function(error0、connection){ 
    if(error0){ 
        throw error0; 
    } 
    connection.createChannel(function(error1、channel){ 
        if(error1){ 
            throw error1; 
        } 
        var queue = 'hello'; 
        var msg = '{"name": "Hello World!"}'; 
        channel.assertQueue(queue、{ 
            durable:false 
        }); 
        channel.sendToQueue(queue、new Buffer(msg)); 
        コンソール。 log( "[x] Sent%s"、msg); 
    });
    }、500); 
});

コンシューマーreceive.jsのコードは次のとおりです。

//receive.js 
var amqp = require( 'amqplib / callback_api'); 
amqp.connect( 'amqp:// localhost'、function(error0、connection){ 
    if(error0){ 
        throw error0; 
    } 
    connection.createChannel(function(error1、channel){ 
        if(error1){ 
            throw error1; 
        } 
        var queue = 'hello'; 
        channel.assertQueue(queue、{ 
            durable:false 
        }); 
        console.log( "[*]%sでメッセージを待機しています。終了するには、Ctrl + Cキーを押してください;キュー); 
        channel.consume(queue、 function(msg){ 
            console.log( "[x] Received%s"、msg.content.toString()); 
        }、{ 
            noAck: 
        }); 
    }); 
});

分别运行send.jsとreceive.js取得以下の出力:
#node send.js
[x] Sent {"name": "Hello World!"}

#node receive.js
[*] Helloメッセージを待機しています。終了するにはCTRL + Cを押します
[x]受信{"name": "Hello World!"}

この時点で、RabbitMQの配備とシンプルなメッセージングの使用は完了しています。

おすすめ

転載: www.cnblogs.com/wangqiguo/p/12695373.html
おすすめ