メッセージミドルウェア——RabbitMQ(六)Exchangeスイッチの核心概念を理解する!

10203 ワード

前言
RabbitMQの重要な概念を理解するために:Exchangeスイッチ
1.Exchangeコンセプト
  • Exchange:メッセージを受信し、ルーティングキーに従ってメッセージにバインドされたキューを転送します.

  • 青いボックス:クライアントはスイッチにメッセージを送信し、ルーティングキーで指定したキューにルーティングします.黄色のボックス:スイッチとキューはルーティングキーでバインドされています.緑のボックス:消費者側はリスニングキューを通じてメッセージを受信します.
    2.スイッチのプロパティName:スイッチ名Type:スイッチタイプ-direct、topic、fanout、headers、sharding(この記事では説明しない)Durability:永続化が必要かどうか、trueは永続化Auto Delete:最後にExchangeにバインドされたキューが削除された後、このExchange Internalを自動的に削除します:現在のExchangeがRabbitMQ内部で使用されているかどうか、デフォルトはfalse Argumentsです.拡張パラメータは、AMQPプロトコルのカスタマイズ使用を拡張するために使用されます.
    3.DirectExchange(直結)
  • DirectExchangeに送信されたすべてのメッセージは、RouteKeyで指定されたQueue
  • に転送される.
    注意:Directモードでは、RabbitMQが持つExchange:default Exchangeを使用できます.したがって、Exchangeをバインド(binding)操作する必要はありません.メッセージを転送するときは、RouteKeyがキューによって受信されるまで完全に一致しなければなりません.そうしないと、メッセージは破棄されます.
    ポイント:routing keyはキューqueuesのkeyと一致しています.つまり、対応するqueueにルーティングできます.
    3.1コードプレゼンテーション
    プロダクション:
    
    /**
     * 
    * @ClassName: Producer4DirectExchange 
    * @Description:    
    * @author Coder  
    * @date2019 7 19    22:15:52 
    *
     */
    public class Producer4DirectExchange {
    
        
        public static void main(String[] args) throws Exception {
            
            //1  ConnectionFactory
            Connection connection = ConnectionUtils.getConnection();
            //2  Channel
            Channel channel = connection.createChannel();  
            //3   
            String exchangeName = "test_direct_exchange";
            String routingKey = "test.direct";
            //4   
            String msg = "Coder   Hello World RabbitMQ 4  Direct Exchange Message ... ";
            channel.basicPublish(exchangeName, routingKey , null , msg.getBytes());         
        }
    }
    

    消費者:
    
    /**
     * 
    * @ClassName: Consumer4DirectExchange 
    * @Description:    
    * @author Coder  
    * @date2019 7 19    22:18:52 
    *
     */
    public class Consumer4DirectExchange {
    
        public static void main(String[] args) throws Exception {
            
            
            //  ConnectionFactory
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();  
            //  
            String exchangeName = "test_direct_exchange";
            String exchangeType = "direct";
            String queueName = "test_direct_queue";
            String routingKey = "test.direct";
            
            //          
            channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
            //         
            channel.queueDeclare(queueName, false, false, false, null);
            //        :
            channel.queueBind(queueName, exchangeName, routingKey);
            
            //durable        
            QueueingConsumer consumer = new QueueingConsumer(channel);
            //  :    、    ACK、Consumer
            channel.basicConsume(queueName, true, consumer);  
            //        
            while(true){  
                //    ,      ,           
                Delivery delivery = consumer.nextDelivery();  
                String msg = new String(delivery.getBody());    
                System.out.println("    :" + msg);  
            } 
        }
    }
    
    

    テスト結果:
    注意routingKeyは一貫性を保つ必要があります.routingkeyを自分で修正して、メッセージを受信できるかどうかを試してみることができます.
    4. Topic Exchange
  • Topic Exchangeに送信されたすべてのメッセージは、すべてのパイプラインRouteKeyで指定されたTopicのQueue上の
  • に転送される.
  • ExchangeはRouteKeyとあるTopicをファジイマッチングします.この場合、キューはTopic
  • をバインドする必要があります.
    注:ワイルドカードを使用してファジイマッチングを行うことができます
    記号「#」は1つ以上の単語に一致します.
    記号「*」の一致は多くない
    たとえば、「log.#」は「log.info.oa」に一致します.
           "log.*"       "log.error"
    

    多くのメッセージの中で、それぞれの異なるキューは自分の必要なメッセージだけに関心を持っています.
    4.1コードデモ
    プロダクション:
    
    /**
     * 
    * @ClassName: Producer4TopicExchange 
    * @Description:    
    * @author Coder  
    * @date2019 7 19    22:32:41
    *
     */
    public class Producer4TopicExchange {
    
        
        public static void main(String[] args) throws Exception {
            
            //1  ConnectionFactory
            Connection connection = ConnectionUtils.getConnection();
            //2  Channel
            Channel channel = connection.createChannel();  
            //3  
            String exchangeName = "test_topic_exchange";
            String routingKey1 = "user.save";
            String routingKey2 = "user.update";
            String routingKey3 = "user.delete.abc";
            //4  
            String msg = "Coder   Hello World RabbitMQ 4 Topic Exchange Message ...";
            channel.basicPublish(exchangeName, routingKey1 , null , msg.getBytes()); 
            channel.basicPublish(exchangeName, routingKey2 , null , msg.getBytes());     
            channel.basicPublish(exchangeName, routingKey3 , null , msg.getBytes()); 
            channel.close();  
            connection.close();  
        }
    }
    
    

    消費者:
    
    /**
     * 
    * @ClassName: Consumer4TopicExchange 
    * @Description:    
    * @author Coder  
    * @date2019 7 19    22:37:12
    *
     */
    public class Consumer4TopicExchange {
    
        public static void main(String[] args) throws Exception {
            
            
            //  ConnectionFactory
            Connection connection = ConnectionUtils.getConnection();
            
            Channel channel = connection.createChannel();  
            //   
            String exchangeName = "test_topic_exchange";
            String exchangeType = "topic";
            String queueName = "test_topic_queue";
            //String routingKey = "user.*";
            String routingKey = "user.*";
            // 1       
            channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
            // 2     
            channel.queueDeclare(queueName, false, false, false, null);
            // 3              :
            channel.queueBind(queueName, exchangeName, routingKey);
            
            //durable        
            QueueingConsumer consumer = new QueueingConsumer(channel);
            //  :    、    ACK、Consumer
            channel.basicConsume(queueName, true, consumer);  
            //        
            while(true){  
                //    ,      ,           
                Delivery delivery = consumer.nextDelivery();  
                String msg = new String(delivery.getBody());    
                System.out.println("    :" + msg);  
            } 
        }
    }
    
    

    テスト結果:
    1つの問題に注意してください:解縛が必要です
    5. Fanout Exchange
  • ルーティングキーを処理しないで、簡単にチームをスイッチにバインドする
  • だけです.
  • がスイッチに送信するメッセージは、スイッチにバインドされたすべてのキューに転送される
  • .
  • Fanoutスイッチ転送メッセージが最も速い
  • 5.1コードプレゼンテーション
    プロダクション:
    
    
    /**
     * 
    * @ClassName: Producer4FanoutExchange 
    * @Description:    
    * @author Coder  
    * @date2019 7 19    23:01:16
    *
     */
    public class Producer4FanoutExchange {
    
        
        public static void main(String[] args) throws Exception {
            
            //1  ConnectionFactory
            Connection connection = ConnectionUtils.getConnection();
            //2   Channel
            Channel channel = connection.createChannel();  
            //3   
            String exchangeName = "test_fanout_exchange";
            //4   
            for(int i = 0; i < 10; i ++) {
                String msg = "Coder     Hello World RabbitMQ 4 FANOUT Exchange Message ...";
                channel.basicPublish(exchangeName, "", null , msg.getBytes());             
            }
            channel.close();  
            connection.close();  
        }
        
    }
    
    

    消費者:
    
    /**
     * 
    * @ClassName: Consumer4FanoutExchange 
    * @Description:    
    * @author Coder  
    * @date2019 7 19    23:21:18
    *
     */
    public class Consumer4FanoutExchange {
    
        public static void main(String[] args) throws Exception {
            
            //  ConnectionFactory
            Connection connection = ConnectionUtils.getConnection();
            
            Channel channel = connection.createChannel();  
            //   
            String exchangeName = "test_fanout_exchange";
            String exchangeType = "fanout";
            String queueName = "test_fanout_queue";
            String routingKey = "";    //      
            channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
            channel.queueDeclare(queueName, false, false, false, null);
            channel.queueBind(queueName, exchangeName, routingKey);
            
            //durable        
            QueueingConsumer consumer = new QueueingConsumer(channel);
            //  :    、    ACK、Consumer
            channel.basicConsume(queueName, true, consumer); 
            //        
            while(true){  
                //    ,      ,           
                Delivery delivery = consumer.nextDelivery();  
                String msg = new String(delivery.getBody());    
                System.out.println("    :" + msg);  
            } 
        }
    }
    
    

    テスト結果:
    6.その他
    6.1 Bingding——バインド
  • ExchangeとExchange、Queue間の接続関係
  • Bingdingは、RoutingKeyまたはパラメータ
  • を含むことができる.
    6.2 Queue-メッセージキュー
  • メッセージキュー、メッセージデータを実際に記憶する
  • Durability:永続化するかどうか、Durable:はい、Transient:いいえ
  • Auto delete:yesを選択すると、最後のリスニングが削除されると、Queueは自動的に削除されます.

  • 6.3 Message——メッセージ
  • サーバとアプリケーションとの間で転送するデータ
  • は本質的にデータであり、PropertiesとPayload(Body)からなる
  • である.
  • 共通属性:delivery mode、headers(カスタム属性)
  • 6.4その他の属性
    content_type、content_encoding、priority
    correlation_id、reply_to、expiration、message_id
    timestamp、type、user_id、app_id、cluster_id
    6.5 Virtual Host仮想ホスト
  • 仮想アドレス、論理分離のための、最上位層のメッセージルーティング
  • Virtual HostにはいくつかのExchangeとQueue
  • があります.
  • 同じVirtual Hostに同じ名前のExchangeまたはQueue
  • は使用できません.
    7.まとめ
    RabbitMQの概念、インストールと使用、コンソール操作、RabbitMQの特性、Exchange、Queue、Binding、RoutingKey、Messageを結合してAPIを消込する説明を行い、本章の学習を通じて、RabbitMQに対して初歩的な認識があることを望んでいる.
    文末
    個人の微信の公衆番号に注目してください.
    コードプログラミング
    最新のオリジナル技術の文章と無料の学習資料を獲得して、更に大量の逸品の思惟の導図、面接の資料、PMPの予備試験の資料などがあなたが受け取ることができて、あなたがいつでもどこでも技術の知識を学ぶのに便利です!
    新しいqq群を作りました:31521365、みんなが群の交流に入って一緒に勉強することを歓迎します.ありがとう!身近に必要な友達にも紹介できます.
    記事はGithubに収録されています.https://github.com/CoderMerli...Gitee: https://gitee.com/573059382/c...注目してstar~参考文章:
    『RabbitMQメッセージミドルウェアの詳細』
    推奨記事:
    メッセージミドルウェア——RabbitMQ(三)RabbitMQコア概念とAMQPプロトコルを理解する!
    メッセージミドルウェア——RabbitMQ(四)コマンドラインと管理制御台の基本操作!
    メッセージミドルウェア-RabbitMQ(5)生産者と消費者の迅速な入門、SpringBoot統合RabbitMQ!