RabbitMQのコアコンセプトを理解する必要があります。

Javaテクノロジスタック

www.javastack.cn

より質の高い記事を読むためにフォロー

著者:Sea to
Source:cnblogs.com/haixiang/p/10853467.html

RabbitMQの機能

他のメッセージキューと比較して、RabbitMQにはメッセージ損失を防止するための一連の対策があり、強力な高可用性パフォーマンスがあります。そのスループットは他のメッセージキューほど大きくない場合がありますが、メッセージのセキュリティは優れており、金融サービスで広く使用されています。

AMQPプロトコル

AMQP:Advanced Message Queuing Protocol

AMQPの定義:これは、最新の特性を持つバイナリプロトコルです。ユニファイドメッセージングサービスを提供するアプリケーションレイヤー標準の高度なメッセージキューイングプロトコルであり、アプリケーションレイヤープロトコルのオープンスタンダードであり、メッセージ指向ミドルウェア向けに設計されています。

Erlang言語はもともとスイッチフィールドのアーキテクチャモデルに基づいていたため、ブローカー間でのRabbitMQのデータ交換のパフォーマンスは非常に優れていました。Erlangの利点:Erlangにはネイティブソケットと同じ遅延があります。

RabbitMQはオープンソースのメッセージブローカーおよびキューサーバーであり、一般的なプロトコルを介して完全に異なるアプリケーション間でデータを共有するために使用されます。RabbitMQはErlang言語で記述され、RabbitMQはAMQPプロトコルに基づいています。公開番号のJavaテクノロジスタックに従って、一連のRabbitMQチュートリアルを入手してください。

RabbitMQメッセージングメカニズム

プロデューサーは指定されたExchangeにメッセージを送信し、Exchangeは自身のタイプ(直接、トピックなど)に応じてルーティングキーに従って0-nキューにメッセージを送信し、キューはメッセージをコンシューマーに転送します。

サーバー:ブローカーとも呼ばれ、クライアント接続を受け入れ、AMQPエンティティサービスを実装します。RabbitMQ 服务器

接続:接続、アプリケーションはブローカーのネットワークに接続されています。

チャネル:ネットワークチャネル。ほとんどすべての操作はチャネルで実行されます。チャネルは、メッセージの読み取りと書き込みを行うチャネルです。クライアントは複数のチャネルを作成できます。各チャネルはセッションタスクを表します。

仮想ホスト:論理的な分離に使用される仮想アドレスは、最上位のメッセージルーティングです。仮想ホストには複数のExchangeとキューが存在する可能性があり、同じVirtualHost内に同じ名前のExchangeまたはキューは存在できません。権限制御の最小単位は仮想ホストです。

バインディング:Exchangeとキューの間の仮想接続。バインディングにはルーティングキーを含めることができます。

ルーティングキー:仮想マシンが特定のメッセージのルーティング方法を決定するために使用できるルーティングルール、つまり、スイッチがキューにバインドするキー。

キュー:メッセージキュー、メッセージキューとも呼ばれ、メッセージを保存してコンシューマに転送します。

メッセージ

サーバーとアプリケーションの間で送信されるデータであるメッセージは、プロパティと本文で構成されます。プロパティは、メッセージの優先度、遅延、その他の高度な機能などのメッセージを変更できます。本文はメッセージ本文のコンテンツです。

プロパティでは、メッセージの有効期限や永続化するかどうかなどを設定したり、コンシューマ側でも取得できるカスタムマッププロパティを渡したりできます。

プロデューサー

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;

public class MessageProducer {
    public static void main(String[] args) throws Exception {
        //1. 创建一个 ConnectionFactory 并进行设置
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");

        //2. 通过连接工厂来创建连接
        Connection connection = factory.newConnection();

        //3. 通过 Connection 来创建 Channel
        Channel channel = connection.createChannel();

        //4. 声明 使用默认交换机 以队列名作为 routing key
        String queueName = "msg_queue";

        /**
         * deliverMode 设置为 2 的时候代表持久化消息
         * expiration 意思是设置消息的有效期,超过10秒没有被消费者接收后会被自动删除
         * headers 自定义的一些属性
         * */
        //5. 发送
        Map<String, Object> headers = new HashMap<String, Object>();
        headers.put("myhead1", "111");
        headers.put("myhead2", "222");

        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()
                .deliveryMode(2)
                .contentEncoding("UTF-8")
                .expiration("100000")
                .headers(headers)
                .build();
        String msg = "test message";
        channel.basicPublish("", queueName, properties, msg.getBytes());
        System.out.println("Send message : " + msg);

        //6. 关闭连接
        channel.close();
        connection.close();

    }
}

消費者

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.Map;

public class MessageConsumer {
    public static void main(String[] args) throws Exception{
        //1. 创建一个 ConnectionFactory 并进行设置
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setAutomaticRecoveryEnabled(true);
        factory.setNetworkRecoveryInterval(3000);

        //2. 通过连接工厂来创建连接
        Connection connection = factory.newConnection();

        //3. 通过 Connection 来创建 Channel
        Channel channel = connection.createChannel();

        //4. 声明
        String queueName = "msg_queue";
        channel.queueDeclare(queueName, false, false, false, null);

        //5. 创建消费者并接收消息
        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");
                Map<String, Object> headers = properties.getHeaders();
                System.out.println("head: " + headers.get("myhead1"));
                System.out.println(" [x] Received '" + message + "'");
                System.out.println("expiration : "+ properties.getExpiration());
            }
        };

        //6. 设置 Channel 消费者绑定队列
        channel.basicConsume(queueName, true, consumer);
    }
}
Send message : test message

head: 111
 [x] Received 'test message'
100000

両替

1はじめに

Exchangeは、メッセージを受信し、ルーティングキーに従ってそれらをバインドされたキューに転送するスイッチです。多くのメッセージがExchangeに入り、Exchangeはルーティングキーに従ってさまざまなキューにメッセージを配信します。

2.タイプ

RabbitMQには多くの種類のExchangeがあり、次のように種類によってメッセージ配信メカニズムが異なります。

  • ファンアウト:ブロードキャストモード。このタイプのExchangeは、Exchangeにバインドされているすべてのキューにメッセージを配信します。

  • 直接:このタイプのExchangeは、ルーティングキー(完全一致)に従って、指定されたキューにメッセージを配信します。

  • トピック:このタイプのExchangeは、ルーティングキーに従ってメッセージを指定されたキューに配布します(あいまい一致)。

  • ヘッダー:テーマスイッチは似ていますが、テーマスイッチとは異なるルートはルーティングキーに基づいており、ヘッダースイッチのルーティング値はメッセージのヘッダーデータに基づいています。サブジェクトスイッチのルーティングキーには文字列のみを使用できますが、ヘッドスイッチには整数とハッシュ値を使用できます。

3.プロパティ

/**
* Declare an exchange, via an interface that allows the complete set of
* arguments.
* @see com.rabbitmq.client.AMQP.Exchange.Declare
* @see com.rabbitmq.client.AMQP.Exchange.DeclareOk
* @param exchange the name of the exchange
* @param type the exchange type
* @param durable true if we are declaring a durable exchange (the exchange will survive a server restart)
* @param autoDelete true if the server should delete the exchange when it is no longer in use
* @param internal true if the exchange is internal, i.e. can't be directly
* published to by a client.
* @param arguments other properties (construction arguments) for the exchange
* @return a declaration-confirm method to indicate the exchange was successfully declared
* @throws java.io.IOException if an error is encountered
*/
Exchange.DeclareOk exchangeDeclare(String exchange,
                                 String type,boolean durable,
                                 boolean autoDelete,boolean internal,
                                 Map<String, Object> arguments) throws IOException;
  • 名前:スイッチ名

  • タイプ:スイッチタイプダイレクト、トピック、ファンアウト、ヘッダー

  • 耐久性:持続性が必要ですか、真は持続性を意味します

  • 自動削除:Exchangeにバインドされている最後のキューが削除されると、Exchangeは自動的に削除されます

  • 内部:現在のExchangeがRabbitMQによって内部的に使用されているかどうかにかかわらず、デフォルトはFalseです。

  • 引数:AMQPプロトコルの自己定義された使用を拡張するために使用される拡張パラメーター

最近の人気記事:

1. Java 8でロジックを書いたが、同僚はそれを直接理解できなかった

2. スプリングブート研究ノート、これは完成しすぎです!

3. Tomcatをぶら下げて、Undertowのパフォーマンスは非常に爆発的です!

4. スプリングブートは残酷です。一度に3つのバージョンをリリースしてください。

5. Spring BootはどのようにしてRedisを迅速に統合しますか?

6、「Java開発マニュアル(松山版)」の最新版

7. Spring Boot Redisは分散ロックを実装しています。

8. 中国人は小さくて完全なJavaツールライブラリをオープンソース化しました

9. 中国のオープンソースは非常に使いやすいRedisクライアントです。

10、同僚が隠れたバグを書いて、3日間チェックしました!

QRコードをスキャンしてJava Technology Stackの公式アカウントをフォローし、より多くのドライグッズを読んでください。

オリジナルを読むクリックして、インタビューの質問の完全なリストを取得してください

おすすめ

転載: blog.csdn.net/youanyyou/article/details/108459356
おすすめ