RabbitMQのメッセージングミドルウェア初心者
著者:月、6月、出典:Nodejs技術スタック
決して時間の無駄、時間の不足を訴えるための時間がありません。 - ジェファーソン
RabbitMQのは、オープンソース(MPL)メッセージキューサービスソフトウェアで、アーランが書か知ら堅牢でスケーラブルな、LSHIFT、高性能が提供する高度なメッセージキュープロトコル(AMQP)のオープンソース実装です。
著者について:若き王の後に月90、Nodejs開発、認定のムーのクラスのネットワーク、共有したいとの愛の技術、してください注意を払うNodejsテクノロジ・スタックとオープンソースプロジェクトhttps://www.nodejs.redのGithub
何がBenpianで学んだことができますか?
-
なぜRabbitMQのを使うのか?
-
RabbitMQのシナリオ?
-
MQの空間と時間は、それが何であるかをデカップリング?
-
人気の主流のメッセージングミドルウェアは何を持っていますか?
-
インストールRabbitMQのサービスを開始するには?
-
生産者と消費者の単純なモデルを構築する方法?
なぜRabbitMQのを使うのか?
概念の多くについて話をする2年近くのマイクロサービスは、大規模な業務システムアーキテクチャでは、業務システム間の通信を確立する方法を、多くの中小企業のシステムに分割されますか?よく知られているHTTP、RPCは、異なるシステムで実施することができる、異なる言語間の通信は、これらに加えて、これらのシステムをリンクするために、メッセージキュー(RabbitMQの、ActiveMQの、Kafafa等)を使用する傾向があり、各部門が達成システム間のデカップリング。
また、Node.jsのは、少しでも大きなバックエンドシステムを開発し使用して、メッセージキューを使用すると、注意を払うに学ぶ知識の価値があります。例えば、私はNode.jsのは、キューにデータの一部を生産する生産面を使用することができ、別のセグメントは、私はPythonや他の言語を達成するために必要に応じて使用することができます。
RabbitMQのシナリオ
1.同期非同期転送
プロジェクト内のいくつかが同期する必要はありませんでしたために、それは非同期処理のためにMQを利用することができ、例えば、私たちのメッセージは、MQキューによって行うように送信することができます。
デカップリングの適用に関する事項
このようなモールのビジネスシナリオ、発注システムと在庫管理システムとして、単一の同期も、在庫を減らしたいことがあり、夫婦はロジックの部分がメッセージ・キューを介して行うことができ、システムはその利点こと、在庫がメッセージングシステムをサブスクライブ、受注を発表していました一般的な在庫システムの問題は、注文システムには影響しません。
3.交通クリッピング
いくつかのマーケティング活動におけるトラフィッククリッピングは、シーンのスパイク活動は、アプリケーションの非常に広い範囲で、短時間のトラフィックの量は、制限されたサービスの容量に応じて制限されたメッセージやメッセージの閾値設定処理部を設定することにより、脱落することができれば、後にも個別に説明します。
MQの空間と時間のデカップリング
スペースの観点から、生産者は、消費者が両者の間のデカップリングを得ることもあるのに対し、それは達成するためには強い依存ではありません、事前にニュース消費者の存在を知っている必要はありませんスペースでデカップリング。
消費者が消費者に行くために何時間を気にしないの後、時間の面では、生産者のメッセージは、データキューへの生産データのための唯一の責任があり、消費者は両方持っている、彼らのビジネスニーズに応じてリアルタイムまたは遅延の消費を消費することもできます達成するために彼らのライフサイクル、時間のデカップリングを。
主流のメッセージングミドルウェア一覧
-
ActiveMQのは:Apacheは生産、早起き非常に人気の同時シーンが多数のメッセージの蓄積の問題をブロックしている直面している主に中小企業で使用されています。
-
カフカが住んでいた:Apache Software Foundationのでスカラ座とJavaで書かれたオープンソースのストリーム処理プラットフォームを開発するために、分散型パブリッシュ・サブスクライブ・メッセージングシステムの高スループットである毎秒サポート同時シングルメガビットいます。当初は主に大規模なデータオブジェクトの方向ログの収集、伝達のために。重複メッセージが失われたように、0.8バージョンはサポートの複製に始まった、物事がサポートされていない、エラーは厳格な要件ではありません。
-
RocketMQ:アリオープンソースのメッセージングミドルウェア、ミドルウェアメッセージング、低レイテンシ、高い信頼性、拡張性があり、使いやすいアイデアにはカフカの起源。最大の問題は電荷の商用版、一部の機能が開いていません。
-
RabbitMQの:オープンソースのメッセージキューAMQPプロトコルに基づくアーランである(ネイティブソケットは、同じ低遅延を有する)言語開発システム。メッセージの信頼性、安定性、およびセキュリティを確保するために。
インストールガイド
マックのインストール
直接経由HomeBrew
のインストールは、次のコマンドを実行し
-
brew install rabbitmq
スタートRabbitMQの
-
# 进入安装目录
-
$ /usr/local/Cellar/rabbitmq/3.7.8
-
-
# 启动
-
$ sbin/rabbitmq-server
ブラウザと入力しhttp://localhost:15672/#/
、デフォルトのユーザー名とパスワードのゲストを
Linuxシステムのインストール
インストールが依存します
-
apt-get install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz lsof
インストールパッケージの場合
RabbitMQのとErlangのインストールパッケージは、細部に対応して対応関係を参照する必要があり、公式ウェブサイトでは、命令がRabbitMQのErlangのバージョン要件があります
-
パッケージのerlangをインストールゲット
-
sudo wget http://www.rabbitmq.com/releases/erlang/erlang-18.3-1.el6.x86_64.rpm
-
インストールパッケージを入手socatに関する
socatに関するプロトコル処理のためのマルチプロトコルサポート、ポートフォワーディング、RabbitMQのはそれに依存します。
-
sudo wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
-
RabbitMQのサーバーインストールパッケージを入手 RabbitMQのサーバを
安装包列表
-
sudo wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm
インストールを開始します
-
キーのインストールCentOSに回転数
ここでは、RPMキーのインストール、CentOSの実行]を使用してrpm-ivh erlang-18.3-1.el6.x86_64.rpm
でubuntu
、このコマンドをサポートしていないrpm
、使用しrpm
、次のメッセージが表示されました:
-
rpm: RPM should not be used directly install RPM packages, useAlien instead!
-
rpm: However assuming you know what you are doing...
-
error: Failed dependencies:
-
ubuntu
システムキー・ソリューションをインストールするRPM
-
インストールは
alien
、コマンドを実行しますsudo apt-getinstall alien
-
変換
rpm
のためのパッケージ.deb
フォーマットは、コマンドを実行し 、あなたのパッケージ名ですがsudo alienpackage.rpm
package.rpm
-
dpkgのインストールすることで、
sudo dpkg-ipackage.deb
-
インストールの次の順番(以下、システムのインストールをCentOSの基づいています)
-
rpm -ivh erlang-18.3-1.el6.x86_64.rpm
-
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
-
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
-
設定ファイルを変更します。
-
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
-
{loopback_users, [<<"guest">>]}, // 修改为 {loopback_users, [guest]},
操作とスタート
-
オープンRabbitMQの
-
rabbitmqctl start_app
-
オープン管理プラグ
-
rabbitmq-plugins enable rabbitmq_management
-
状態をチェック
-
$ lsof -i:5672# 看到以下提示则开启成功
-
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
-
beam 4678 rabbitmq 49uIPv62941580t0 TCP *:amqp (LISTEN)
-
オープンは、管理ステーションに通知 ターミナルのアクションコマンドを、以下の記述があり、ナビゲーション領域を入力し
http://host:15672
、管理コンソールを開くには
-
複数のポートの違いを説明
-
5672
:コミュニケーションデフォルトのポート番号 -
15672
:管理コンソールのデフォルトのポート番号 -
25672
:クラスタ通信ポート番号
注意:
開いているポートソリューションは、RabbitMQのインストールが成功した場合に表示された問題は、セキュリティグループではありませんので、アリクラウドECSサーバーは、外部ネットワークにアクセスすることはできません
操作コマンド
ここでは、共通端子の動作コマンドの例をいくつか示します。
-
whereisはRabbitMQの:ビューRabbitMQのインストール場所
-
rabbitmqctlのstart_app:アプリケーションを起動します
-
whereisはアーラン:ビューのerlangインストール場所
-
rabbitmqctlのstart_app:アプリケーションを起動します
-
rabbitmqctlのstop_app:アプリケーションを閉じます
-
rabbitmqctlステータス:ノードステータス
-
rabbitmqctl ADD_USERユーザー名パスワード:追加ユーザー
-
rabbitmqctlのlist_users:リストのすべてのユーザー
-
rabbitmqctlのDELETE_USERのユーザ名:ユーザの削除
-
rabbitmqctlのadd_vhostのvhostpath:仮想ホストを作成します
-
rabbitmqctlのlist_vhosts:リストのすべての仮想ホスト
-
rabbitmqctlのlist_queuesは:すべてのキューを見ます
-
rabbitmqctl -p vhostpath purge_queue青:クリアメッセージキュー
生産者と消費者の単純なモデルを構築します
プロデューサー - 消費者モデルは、パーティプロデュースデータ消費量データ、その当事者です。バッファに、仲介者としてプロデューサーのデータ2との間に緩衝地帯があるでしょう、消費者は、バッファからデータを取り出します。また、生産者 - 消費者モデルは、設計パターンにおけるプロセス指向プログラミングです。
生産者と消費者段階の建設
ここでは、プロセスの実現に各言語の実装におけるモデルに関する生産者と消費者へのいくつかのステップは非常にも同じされています。
プロデューサーのステップ
-
リンクファームを作成します。
-
リンクファームでリンクを作成します。
-
リンクを介してチャネル(チャネル)を作成します。
-
データ伝送チャネル
-
閉じるリンク
消費者の手順
-
リンクファームを作成します。
-
リンクファームでリンクを作成します。
-
リンクを介してチャネル(チャネル)を作成します。
-
キューを宣言
-
消費者の作成
-
設定されたチャンネル
Node.jsのバージョン
amqplibクライアント
Githubの:https://github.com/squaremo/amqp.node
-
$ npm install amqplib
プロデューサーの構築
交換は、指定された交換機(空の)デフォルトの点のない限り、場合プロデューサは、メッセージを指定する必要がありAMQPdefault
、スイッチ、AMQPdefault
ルーティングルールはroutingKeyとMQ上の同じ名前のキューが存在しない一致に従ってルーティングされます。
-
const amqp = require('amqplib');
-
-
async function producer() {
-
// 1. 创建链接对象
-
const connection = await amqp.connect('amqp://localhost:5672');
-
-
// 2. 获取通道
-
const channel = await connection.createChannel();
-
-
// 3. 声明参数
-
const routingKey = 'helloworldQueue';
-
const msg = 'hello world';
-
-
for(let i=0; i<5; i++) {
-
// 4. 发送消息
-
await channel.publish('', routingKey, Buffer.from(`${msg} 第${i}条消息`));
-
}
-
-
// 5. 关闭链接
-
await channel.close();
-
}
-
-
producer();
消費者の構築
-
const amqp = require('amqplib');
-
-
async function consumer() {
-
// 1. 创建链接对象
-
const connection = await amqp.connect('amqp://localhost:5672');
-
-
// 2. 获取通道
-
const channel = await connection.createChannel();
-
-
// 3. 声明参数
-
const queueName = 'helloworldQueue';
-
-
// 4. 声明队列,交换机默认为 AMQP default
-
await channel.assertQueue(queueName);
-
-
// 5. 消费
-
await channel.consume(queueName, msg => {
-
console.log('Consumer:', msg.content.toString());
-
channel.ack(msg);
-
});
-
}
-
-
consumer();
Node.jsのサンプルコード
-
源码地址如下:
-
https://github.com/Q-Angelo/project-training/tree/master/rabbitmq/helloworld
Javaのバージョン
Mavenの依存関係を追加
ではSpringBoot
、プロジェクトのpom.xml
導入ファイルamqp-client
ランチャ
-
<dependency>
-
<groupId>com.rabbitmq</groupId>
-
<artifactId>amqp-client</artifactId>
-
<version>5.6.0</version>
-
</dependency>
プロデューサーの構築
-
package com.may.rabbitmq.helloworld;
-
-
import com.rabbitmq.client.Channel;
-
import com.rabbitmq.client.Connection;
-
import com.rabbitmq.client.ConnectionFactory;
-
-
publicclassProducer{
-
publicstaticvoid main(String[] args) throwsException{
-
// 1. 创建链接工厂
-
ConnectionFactory connectionFactory = newConnectionFactory();
-
connectionFactory.setHost("127.0.0.1");
-
connectionFactory.setPort(5672);
-
connectionFactory.setVirtualHost("/");
-
-
// 2. 通过链接工厂创建链接
-
Connection connection = connectionFactory.newConnection();
-
-
// 3. 通过链接创建通道(channel)
-
Channel channel = connection.createChannel();
-
-
// 4. 通过 channel 发送数据
-
// exchange:交换机,如果不传默认为 AMQP default
-
channel.basicPublish("", "helloworldQueue", null, "hello world".getBytes());
-
-
// 5. 关闭链接
-
channel.close();
-
connection.close();
-
}
-
}
消費者の構築
-
package com.may.rabbitmq.helloworld;
-
-
import com.rabbitmq.client.*;
-
-
import java.io.IOException;
-
import java.util.concurrent.TimeUnit;
-
-
publicclassConsumer{
-
publicstaticvoid main(String[] args) throwsException{
-
// 1. 创建链接工厂
-
ConnectionFactory connectionFactory = newConnectionFactory();
-
connectionFactory.setHost("127.0.0.1");
-
connectionFactory.setPort(5672);
-
connectionFactory.setVirtualHost("/");
-
-
// 2. 通过链接工厂创建链接
-
Connection connection = connectionFactory.newConnection();
-
-
// 3. 通过链接创建通道(channel)
-
Channel channel = connection.createChannel();
-
-
// 4. 声明一个队列
-
String queueName = "helloworldQueue";
-
channel.queueDeclare(queueName, true, false, false, null);
-
-
// 5. 创建消费者
-
// springboot 从 1.5.9 升级到 2.0.0,QueueingConsumer 报错(Cannot resolve symbol 'QueueingConsumer')没有这个类,改为使用 DefaultConsumer
-
DefaultConsumer consumer = newDefaultConsumer(channel) {
-
@Override
-
publicvoid handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throwsIOException{
-
super.handleDelivery(consumerTag, envelope, properties, body);
-
-
String message = newString(body, "UTF-8");
-
System.out.printf("in consumer B (delivery tag is %d): %s\n", envelope.getDeliveryTag(), message);
-
// System.out.printf("d%: s%\n", envelope.getDeliveryTag(), message);
-
-
try{
-
TimeUnit.MILLISECONDS.sleep(200);
-
} catch(InterruptedException e) {
-
-
}
-
-
channel.basicAck(envelope.getDeliveryTag(), false);
-
}
-
};
-
-
-
// 6. 设置 channel
-
channel.basicConsume(queueName, false, consumer);
-
-
System.out.println("消费端启动成功!");
-
}
-
}
テストを実行
Javaサンプル・コード
-
小项目大思想 — SpringBoot实战系列
-
https://github.com/Q-Angelo/SpringBoot-Course
-
-
源码地址如下:
-
https://github.com/Q-Angelo/SpringBoot-Course/tree/master/chapter8/chapter8-1
このトップで生産-消費者の場合、あなたはまた、生産者と消費者の間でのメッセージはマッチが渡さ不思議に思っているか感じるようにする必要がありますでしょうか?以降に詳細RabbitMQのスイッチは、それらがメッセージの配信を一致させるために働いている方法、導入されます。
概要
消費者モデル-この記事を学ぶことで、私はあなたがあなた自身のMQサービスでそれをインストールして、単純なプロデューサを構築しようとすることができ、あなたはMQシーンに適用されるものを把握することができる願っています。それは非常に重要であるため、インターネット企業の一つは、通常、必要な基本的なコンポーネントは、そのフォローアップもメッセージ配信メカニズムの異なるスイッチ、リミットなど遅延キュー、再試行、高可用性設計を含む一連の記事をしてください書くことを計画していますこの「へんが世間の注目Nodejsテクノロジ・スタックは、」最新のニュースを取得していません