Rabbitmqは優れたオープンソースプロジェクトで、毎秒数十万のメッセージをアプリケーションに迅速かつ効率的に配信できます。 次のエントリは、3つの別々のホストからなるRabbitMQクラスターを配置する方法を示しています。 この目的のために、Dockerを使用し、nodeを使用して準備ができたクラスターに接続します。js”を発表した。

Rabbitmqについて

RabbitMQはAMQPプロトコルに基づくキューイングシステムであり、システム自体はErlangで書かれていました。 この言語の使用のおかげで、rabbitmqはmicroserviceアーキテクチャの中央データバスとしての使用に理想的に適しています。 そのような柵は適用に大きい基質を提供しDDDおよびCQRSの範例の開発の大きいダイナミック-レンジを許可する。 データバス(メッセージのキュー)はアーキテクチャのバックボーンであるため、常に利用可能であり、障害に耐性があることが重要です。 冗長アーキテクチャは、独立したエグゼクティブノードへのデータの複製、すなわち、自然な選択になります。

rabbitmqでのレプリケーションは、マスター-スレーブモードでネイティブにサポートされています。 これは、RabbitMQが作成された各キューに対して常に1つのノードを選択し、保存のためにすべてのメッセージをリダイレクトし、キューから読み取るためにメッ ノードが異なる物理マシンに分散している場合の最大の意味はレプリケーションですが、ここでは同じマシン内のレプリケーションの例を使用します。 RabbitMQは、その目的、つまり毎秒数十万のサポートされているメッセージのために、同じサーバーラックにないマシン上のレプリケーションモードでは好まれません。 これは、メッセージが非常に短いキューに滞在し、前提がRAMを超えて行くべきではないという事実によるものであり、データセンターの別の部分で、または完全に別のデータセンターにネットワーク接続に基づいてそれらを複製することは、パフォーマンスの大幅な低下を意味し、このシステムクラスでは与えることができません。 さらに、RabbitMQノードを互いに近くに配置することにより、いわゆるネットワークパーティション(一つのルーレットの場合は非常にありそうもない)のリスク、すなわちクラスタ全体の少なくとも2つのノードが自分自身をマスターとみなすようにノード間の通信を中断する現象を最小限に抑えることができます。 RabbitMQのコンテキストでのネットワークパーティションの詳細は、ここで読むことができます。

したがって、練習ベースのルールでは、RabbitMQを同じデータセンター内でのみレプリケーションモードにしています。

Docker imagesのダウンロード

Dockerとは何か、それを使用する方法を知っていると仮定します。

まず、適切なRabbitMQイメージ(管理パネルプラグインと一緒に)とノードをダウンローjsは、この目的のために、我々は次のコマンドを使用します:

docker pull 3.6.6-managementdocker pull node:11.10.1

Rabbitmqホストの設定

プレゼンテーションの目的のために、1つのRabbitMQイメージを起動し、docker execコマンドで接続し、bashシェルを呼び出して、設定を実行できるようにします。 コマンドを使用してみましょう:

docker run --hostname rabbit --name rabbit --rm -ti --net="host" rabbitmq:3.6.6-management /bin/bash

上記のコマンドは、シェルを離れた後に削除されるRabbitMQからイメージを実行します。 インスタンスはネットワークインターフェイスに接続されるため、ポート転送について心配する必要はありません。 シェル[email protected]:/#が私たちの目に現れたら、それはすべてがうまくいったことを意味します。

次のステップは、別々のポートで3つのRabbitMQプロセスを実行することで、各プロセスは一意の名前を受け取ります。

RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=rabbit rabbitmq-server -detachedRABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=hare rabbitmq-server -detachedRABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener " RABBITMQ_NODENAME=john rabbitmq-server -detached

次に、rabbitmqctlの助けを借りて、両方のノードをrabbitという名前でルートにアタッチします:

rabbitmqctl -n hare stop_apprabbitmqctl -n hare join_cluster [email protected]`hostname -s`rabbitmqctl -n hare start_apprabbitmqctl -n john stop_apprabbitmqctl -n john join_cluster [email protected]`hostname -s`rabbitmqctl -n john start_app

結局のところ、ブラウザを開いてアドレスhttp://localhost:15672を入力して、すべてがうまくいったことを確認することができます。

重要です。 Rabbitmqからコンテナシェルを無効にしないでください(Docker startupコマンドの–rmオプション)

最後に行うことがありますが、rabbitmqクラスターの準備ができていますが、適切なポリシーを設定する必要があります。 この関数は管理パネルを使用して実装されていますが、RabbitMQの高可用性(HA)に関する詳細はドキュメントを参照してください。上記の

は、HAポリシー設定の例です。 以下は検証方法です。 ノード名の数字+2は、キューがレプリケートされる個別のホストの数を意味します。

ノードでのamqpライブラリのインストールとダウンロード。js

次のステップは、ノードを使用してDockerコンテナインスタンスを起動することです。jsイメージは、この目的のために、また、ネットワークインターフェイスを共有する次のコマンドを実行します。

docker run -ti --rm --net="host" node:11.10.1 /bin/bash

次に、私たちのサイトで選択された場所(例えば/home)に、必要なスクリプトを配置し、ノードのレベルからRabbitMQ(またはAMQPプロトコルを実装する他のシステム)への接続を可能にするamqp-connection-managerライブラリをインストールするディレクトリを作成します。js”を発表した。

npm install --save amqp-connection-manager

さらに、ライブラリは複数のRabbitMQホストアドレスを追加することができ、ホストの障害が発生した場合に再接続するメカニズムを提供します。 これは、RabbitMQとの適切な接続を気にし、障害が発生した場合には、接続が戻ってくるまでメモリ内のメッセージを検出できるため、非常に便利な機能です。

サンプルproducer-consumer code

すべてのコンポーネントが準備されたので、メッセージの作成と受信を担当する単純なコードの作成を開始できます。 この目的のために、2つのファイルを作成し、それらにコードを入力します。

js-スクリプトはRabbitMQインスタンスに接続し、毎秒10メッセージの送信を開始します。

let q = 'tasks';let amqp = require('amqp-connection-manager');function sleep(ms) { if(ms setTimeout(resolve, ms));}let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); console.log('Starting message stream') while (true) { await channelWrapper.sendToQueue(q, { value: Math.random() }) await sleep(100) }}main()

js-スクリプトはRabbitMQインスタンスに接続し、キューからメッセージの読み取りを開始します。

let q = 'tasks';let amqp = require('amqp-connection-manager');let main = async () => { var connection = amqp.connect(); var channelWrapper = connection.createChannel({ json: true, setup: function(channel) { return channel.assertQueue(q, { durable: true }); } }); channelWrapper.addSetup(function(channel) { return Promise.all() });}main()

この方法で作成されたファイルは、Nodeを使用して個別に実行できます。jsとwatch asconsumer.jsproducer.jsによって生成されたデータを受信します。 RabbitMQクラスターでのレプリケーション操作を確認するには、スクリプトによるデータ交換中にrabbitmqプロセスのいずれかを無効にして、障害がどのように処理され、rabbitmqが新しいマスターを選択し、それに応じてメッセージをリダイレクトするかを確認することをお勧めします。

rabbitmqctl -n john stop_app

いずれかのRabbitMQインスタンスを無効にしても、メッセージの生成またはダウンロードには影響しません。 キューは自動的にレプリケートされ、独自のメカニズムを実装する必要なく接続が回復します。

要約すると、RabbitMQは、多くの問題を引き起こさない適切な構成の後に高可用性を保証する優れたキューイングシステムです。 多くの言語、例えばノードのライブラリの数が多い。js、PHP、Java、Python、Golang、C/C++は、プロジェクト内のシステムの簡単な実装を可能にします。 システムの動作とその正しい構成に関連する問題を非常に明確に説明したドキュメントを読むことを誰もがお勧めします。

すべてのコードはGithubのリポジトリに保持されています

同様の検索:nodejs rabbitmq/nodejs queue/rabbitmq queue nodejs