1.概要

ソフトウェアコンポーネントの分離は、ソフトウェア設計の最も重要な部分の1つです。これを達成する1つの方法はメッセージングシステムを使用することであり、これはコンポーネント(サービス)間の非同期通信方法を提供する。この記事では、そのようなシステムの1つを取り上げます。

RabbitMQ

RabbitMQはAdvanced Message Queuing Protocol(https://en.wikipedia.org/wiki/Advanced

Message

Queuing__Protocol[AMQP])を実装するメッセージブローカーです。

主要なプログラミング言語用のクライアントライブラリを提供します。

ソフトウェアコンポーネントの分離に使用する以外にも、RabbitMQは次の用途に使用できます。

  • バックグラウンド操作の実行

  • 非同期操作を実行する

2.メッセージングモデル

まず、メッセージングがどのように機能するのか、概要を見てみましょう。

簡単に言うと、メッセージングシステムと対話するアプリケーションには、プロデューサとコンシューマの2種類があります。プロデューサとは、ブローカにメッセージを送信(パブリッシュ)するものと、ブローカからメッセージを受信するコンシューマのことです。通常、このプログラム(ソフトウェアコンポーネント)は異なるマシン上で実行されており、RabbitMQはそれらの間の通信ミドルウェアとして機能します。

この記事では、RabbitMQを使って通信する2つのサービスを使った簡単な例を説明します。一方のサービスはRabbitMQにメッセージをパブリッシュし、もう一方は消費します。

3.セットアップ

はじめに、公式のセットアップガイドhttps://www.rabbitmq.com/download.htmlを使用してRabbitMQを実行しましょう

RabbitMQサーバーとのやり取りには、当然Javaクライアントを使用します。このクライアントのhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.rabbitmq%22%20AND%20a%3A%22amqp-client%22[Maven依存関係]

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>4.0.0</version>
</dependency>

公式ガイドを使用してRabbitMQブローカーを実行した後、Javaクライアントを使用してそれに接続する必要があります。

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

私たちは

ConnectionFactory

を使ってサーバーとの接続を設定します。それはプロトコル(AMQP)と認証の面倒を見ます。ここでは

localhost

上のサーバーに接続します。

setHost

関数を使用してホスト名を変更できます。

デフォルトのポートがRabbitMQサーバーによって使用されていない場合は、

setPort

を使用してポートを設定できます。 RabbitMQのデフォルトポートは

15672

です。

factory.setPort(15678);

ユーザー名とパスワードを設定できます。

factory.setUsername("user1");
factory.setPassword("MyPassword");

さらに、メッセージのパブリッシュとコンシュームにもこの接続を使用します。

4.プロデューサー

  • WebアプリケーションでユーザーがWebサイトに新製品を追加できるようにする** 単純なシナリオを考えてください。新製品が追加されたときはいつでも、顧客にEメールを送信する必要があります。

まず、キューを定義しましょう。

channel.queueDeclare("products__queue", false, false, false, null);

ユーザーが新しい商品を追加するたびに、メッセージをキューに発行します。

String message = "product details";
channel.basicPublish("", "products__queue", null, message.getBytes());

最後に、チャンネルと接続を閉じます。

channel.close();
connection.close();

このメッセージは、顧客への電子メール送信を担当する別のサービスによって消費されます。

5.消費者

私たちが消費者側に何を実装できるか見てみましょう。同じキューを宣言します。

channel.queueDeclare("products__queue", false, false, false, null);

これが、キューからのメッセージを非同期的に処理するコンシューマを定義する方法です。

Consumer consumer = new DefaultConsumer(channel) {
    @Override
     public void handleDelivery(
        String consumerTag,
        Envelope envelope,
        AMQP.BasicProperties properties,
        byte[]body) throws IOException {

            String message = new String(body, "UTF-8");
           //process the message
     }
};
channel.basicConsume("products__queue", true, consumer);

6.まとめ

この簡単な記事では、RabbitMQの基本概念を扱い、それを使った簡単な例を説明しました。

このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/rabbitmq[GitHubプロジェクト]にあります。