春ブーツ--------- RabbitMQの(メッセージキュー)

まず、ニュースサービスシーン

1、非同期処理

ここに画像を挿入説明
ユーザのログイン、データベースへの登録情報、および電子メールやSMS登録を送信します。このような同期呼び出しは50ミリ秒のすべてのステップを必要とする、それが非常に遅くなります。(Eメールと送信テキストメッセージの代わりに、ユーザーはすぐに結果を確認する必要があり、それがプロセスを遅らせることができます)。
ここに画像を挿入説明
第二の方法は、あなただけの100ミリ秒を必要とするので、これは遅すぎる、まだある、電子メールやテキストメッセージのマルチスレッド実装を使用して、あります。
ここに画像を挿入説明
第三の実施形態では、書き込みに登録情報データベースの後、次に情報は、メッセージキューを使用するように書き込まれ、その後、SMSメッセージを送信し、非同期読み出してメッセージキュー後続の処理から読み取ることができます。

図2に示すように、デカップリングの応用

ここに画像を挿入説明
1つのアプリケーションの注文や在庫システムのライトシステム、単一の在庫削減が結合することです。プロセスは非常に遅くなります。
ここに画像を挿入説明

在庫システムと注文システムを別々に抽出されたマイクロサービスとされ、それは直ちに注文システムは、単一のメッセージ・キューを書き込むために、直ちに在庫システムの注文情報を受信し、システムは在庫目録関連の操作を計算します。

3、フロークリッピング

ここに画像を挿入説明
スパイクへの商品の万10万人がある場合には、スパイクに適用され、すべての人の送信要求を、処理のためのTomcatは、それが立ち往生するのは簡単です。アプリケーションメッセージキュー、ユーザの要求メッセージキューは、だけですぐにキューを入力するように最初に来ます1万を格納、メッセージキューに最大値を追加します。ゆっくりとメッセージキューからのメッセージを処理するためのスパイクのビジネスロジックを削除します。

第二に、概念

  1. ほとんどのアプリケーションでは、ミドルウェアメッセージサービスは、によるものであってもよい、デカップリング容量の拡張を非同期通信システムを持ち上げます

  2. 2つの重要な概念:

    1. メッセージ・ブローカ(メッセージブローカ)とデスティネーション(宛先)
    2. メッセージの送信者は、メッセージを送信すると、メッセージは指定された宛先へのメッセージ配信を確保するために、メッセージエージェントを代理店を引き継ぎます。
  3. 先のメッセージキューの二つの主要な形式があります

    1. キュー(待ち行列):ピア・メッセージング(ポイントツーポイント)
      • メッセージの送信者は、デキューされたメッセージを読んだ後、メッセージの受信者は、キューからのメッセージの内容を取得し、メッセージブローカがキューに入れて、メッセージを送信します
      • ニュースのみのみ送信者認められたことで、それ一つだけ言うことではない受信者を
    2. テーマ(トピック):出版(パブリッシュ)/サブスクライブ(サブスクライブ)メッセージング
      • 送信者(出版社)は、複数のトピックにメッセージを送信し、受信者(加入者)リスニングは、メッセージが到着したときに、このテーマは、それが同時にメッセージを受信します(にサブスクライブ)
  4. JMS(Java Message Serviceの)Javaメッセージサービス:

    • JVM仕様は、メッセージブローカに基づいています。ActiveMQの、HornetMQはJMSの実装です
  5. AMQP(アドバンスト・メッセージキュープロトコル)

    • 高度なメッセージキュープロトコル、メッセージブローカ仕様互換JMSであります
    • RabbitMQのAMQPは達成することです

      ETC. AMQP
      定義 Javaの火 ラインレベルのネットワークプロトコル
      クロスランゲージ ノー それはあります
      クロスプラットフォーム ノー それはあります
      モデル メッセージは、2つのモデルを提供する:(1)、ピア-2-ピア(2)、パブ/サブ (1)直接交換(2)、ファンアウト交換機(3)、トピックの変化(4)、ヘッダ交換(5)、システム交換エッセンス、後者4およびJMSパブ/サブ:5つのメッセージ・モデルを提供モデルは、ルーティングメカニズムに、より詳細な内訳を行うには、大きな違いはありません。
      サポートメッセージの種類 様々なメッセージタイプ:のTextMessage際、MapMessage BytesMessageはStreamMessageののObjectMessageメッセージ(唯一のメッセージヘッダおよびプロパティ) 実用的なアプリケーションは、複雑なメッセージを有する場合、バイト[]、メッセージをシリアル化の後に送信することができます。
      総合評価 JMSは、Java APIレベルの標準を定義し、Javaシステムでは、複数のクライアントは、両方のJMSを介して相互作用することができ、アプリケーションのコードを変更する必要がありますが、クロスプラットフォームのためのその貧弱なサポートはありません。 AMQPは、標準的なワイヤ・レベルのプロトコル層を定義する;天然クロスプラットフォーム、クロス言語機能。
  6. 春のサポート

    • 春-JMS提供してJMSのサポートを

    • 春ウサギが提供AMQPのサポートを

    • あなたは必要なConnectionFactoryのメッセージ・ブローカーに接続するための実装を

    • 提供JmsTemplateRabbitTemplateがメッセージを送信します

    • @JmsListenerJMS)、@RabbitListenerAMQP方法に投稿されたメッセージのための)メッセージブローカーコメントリッスン

    • @EnableJms@EnableRabbitオープンサポート

  7. 春ブーツの自動設定

    • JmsAutoConfiguration

    • RabbitAutoConfiguration

三、RabbitMQのプロフィール

1、基本的な考え方

RabbitMQのは、によって開発されたアーランあるAMQP(AdvanvedメッセージキューProtocol)のオープンソース実装

  1. メッセージ

    • メッセージは、メッセージがで構成され、匿名であり、メッセージヘッダとメッセージ本体メッセージ本体は、不透明、および任意の属性一連のメッセージヘッダには、これらの属性は、ルーティングキー(ルーティングキー)優先度(他のメッセージに優先相対)メッセージことを示す**(MODE-配達それはそうで**)永続ストレージを必要とする場合があります。
  2. 出版社

    • ニュースプロデューサーは、また、あるスイッチにメッセージを発行するクライアントアプリケーション
  3. 両替

    • スイッチのため、サーバーのキューにメッセージプロデューサとルートに送信されたメッセージを受信します
    • 取引所は4つのタイプがあります。直接(デフォルト)、ファンアウト、トピック、およびヘッダ、為替政策の異なる種類のメッセージの転送に異なります
  4. キュー

    • メッセージキューは、消費者に送信されるまでメッセージを保存するために使用しました。これは、メッセージのコンテナで、メッセージは終わりです。メッセージは、1つ以上のキューに入れることができます。メッセージは、消費者がそれを削除しますキューに接続するのを待って、待ち行列の内部にありました。
  5. バインディング

    • 結合メッセージキューとスイッチとの間の関連付けのためにキーベースのルーティングルールおよびメッセージキューを接続するスイッチである結合、スイッチを結合することにより構成されるルーティングテーブルであると理解することができます。

    • 取引所キューと結合をすることができ、多くの多くの関係。

  6. 接続

    • ネットワーク接続などのTCPコネクションとして、。
  7. チャネル

    • チャンネル、独立した双方向のデータ接続流路多重化。チャンネルの仮想接続は、実際のTCPコネクションに設立され、AMQPコマンドは、サブスクリプション・キューまたは、これらのアクションは、チャネルを介して行われたメッセージを受信することを発表しているかどうか、チャネルを介して送信されます。TCPと破壊の設立以来、TCP接続を再利用するためには、非常に高価なオペレーティングシステムのオーバーヘッド、そのチャネルの概念を導入しています。
  8. 消費者

    • 消費者のメッセージを示すメッセージ・キューからのgetメッセージクライアントアプリケーションを。
  9. 仮想ホスト

    • ウェブホスティングは、スイッチ、メッセージキュー、および関連するオブジェクトのグループを表します。ウェブホスティングは、同じスタンドアロンサーバードメイン認証と暗号化の環境を共有しています。RabbitMQのサーバのミニバージョンでは、各バーチャルホストのキュー、スイッチ、結合メカニズムと権限、独自に、本質的です。AMQPは、バーチャルホストの考え方の基本は、接続時に指定する必要があり、RabbitMQのは/デフォルトのバーチャルホストです。
  10. ブローカ

    • エンティティが表すメッセージキューサーバー

図2に示すように、演算処理

ここに画像を挿入説明
プロセス:

  1. ポスト所有者Publisherは)、あるメッセージ・ブローカにメッセージ(メッセージ)を送信メッセージサーバブローカー)。
  2. 内部サーバーのWebホスティングと呼ばれるバーチャルホスト、独自の多く持っている、ウェブホスティングスイッチ(所)キュー(キュー)
  3. メッセージの仮想ホスト(バーチャルホスト)指定された仮想ホスト交換器(交流)に、。
  4. 交換(交換)メッセージに従ってルーティングキーキーのルーティングエンドテイクで)判定されたメッセージのメッセージ・キュー**(キュー)にルーティング**内部、ルーティングルールの結合関係(による結合は)で表されます。メッセージは、メッセージキューに到達すると、消費者**(消費者)は**メッセージは、メッセージキューから削除することができます。
  5. 消費者のメッセージキューとの接続は、多重化、リソースを節約するために、接続を確立内の各TCPコネクションに多くを開くために、(接続)を確立したパイプ(チャンネル)どのデータ交換をパイプラインで、キューからメッセージを取得するには、データは、パイプラインを介して消費者(消費者)に返されます

3、交換タイプ

Exchangeは:流通政策の違いのタイプに応じて、メッセージを配布する時間を持って、4種類あった直接ファンアウトトピックヘッダがAMQPメッセージヘッダは、次の3つのタイプにさらに正確にルーティングヘッダに一致する代わりに、キー、直接交換スイッチとヘッダーが、パフォーマンスはほとんどもう使用されない、乏しいたくさんあるので、直接見て:

  1. 直接
    ここに画像を挿入説明

メッセージルーティングキー(キールーティング)、およびバインディングキーが整合結合場合、スイッチは、対応するキューにメッセージを送信します。キュー完全一致の名前でキーをルーティング

  1. 扇形に広がります

ここに画像を挿入説明

ファンアウトメッセージに各ヘアピースタイプは、最大バインドされているすべてのキューに割り当てられます。ファンアウトスイッチは、キーのルーティングを処理しませんが、スイッチ・キューへの単純バインドはスイッチに送信されたメッセージのそれぞれは、スイッチにバインドされているすべてのキューに転送されますサブネットブロードキャストなどの多くは、各サブネット内のホストは、メッセージのコピーを受け取っています。ファンアウトメッセージタイプを転送することで最速

  1. トピックモードによってキー属性ルーティングトピックスイッチ割り当てメッセージが一致し、ルーティングキー及びパターンマッチング、ケースは、キューモードに結合する必要があります。これは、文字列を切断し、キーワードへルーティングキーを結合します単語間の点によって分離されています「#」の記号とシンボル「:また、2つのワイルドカードを識別しますマッチ 0以上の単語は** ****単語と一致します。
    ここに画像を挿入説明

四、ウサギMQ統合

1、インストールと起動のRabbitMQ

  1. 仮想マシンのインストールのRabbitMQ内で使用するドッキングウィンドウ

    docker pull rabbitmq:3.8-management
    
  2. スタート

    docker run -d -p 5672:5672 -p 15672:15672 --name myrabbismq rabbitmq的id
    
  3. ビューを実行します

    docker ps
    

図2は、構成要件に応じて切り替えてメッセージキューを追加します

ここに画像を挿入説明

リファレンスはまだシリコンバレーのビデオ設定であります

3、RabbitMQの統合

pom.xmlを追加

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  1. 達成ユニキャスト
/**
* @Description: 1、单播(点对点)
* @param:
* @return:
* @auther: zqq
* @date: 19/12/23 15:24
*/
@Test
void contextLoads() {
    //rabbitTemplate.send(exchange,routingKey,message);
    //Message需要自己后制造一个,定义消息体内容和消息头

    //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbit
    //rabbitTemplate.convertAndSend(exchange,routeKey,Object);

    HashMap<String, Object> map = new HashMap<>();
    map.put("msg","这是第一个消息");
    map.put("data", Arrays.asList("helloworld",123,true));
    //对象被默认序列化后发送出去
    rabbitTemplate.convertAndSend("exchange.direct","atguigu.news",map);
}

//接收
@Test
public void receive(){
    Object o = rabbitTemplate.receiveAndConvert("atguigu.news");
    System.out.println("o.getClass() = " + o.getClass());
    System.out.println(o);
}
  1. 放送達成
/**
* @Description: 广播
* @param:
* @return:
* @auther: zqq
* @date: 19/12/23 16:58
*/
@Test
public void sendMsg(){
    rabbitTemplate.convertAndSend("exchange.fanout","",new Book("西游记","吴承恩"));
}

3.メッセージキューを受け取ります

/*
*@EnableRabbit + @RabbitListtener监听消息队列
*/
@Service
public class BookService {

    @RabbitListener(queues = "atguigu.news")
    public void receive(Book book){
        System.out.println("book = " + book);
    }

    @RabbitListener(queues = "atguigu")
    public void receive2(Message message){
        System.out.println(message.getBody());
        System.out.println(message.getMessageProperties());
    }
}
  1. カスタムシリアル化JSONを使用してMessageconvter
@Configuration
public class MyAMQPConfig {

    /**
     * @Description: 自定义messageconvter
     * @param: 
     * @return: 
     * @auther: zqq
     * @date: 19/12/23 17:01
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}
  1. AmqpAdminを作成および削除キュー、交換、バインディング
/*
*AmqpAdmin:RabbitMQ系统功能组件
*    AmqpAdmin  : 创建和删除Queue,exchange,Binding
*/

@Test
public void createExchange(){
    //创建一个exchange
    amqpAdmin.declareExchange(new DirectExchange("amqpadmin.exchange"));
    //创建一个消息队列
    amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
    //绑定
    amqpAdmin.declareBinding(new Binding("amqpadmin.queue", Binding.DestinationType.QUEUE,"amqpadmin.exchange",
                                         "amqp.haha",null));
}

dmin.declareExchange(新新DirectExchange( "amqpadmin.exchange"));
//メッセージ・キューを作成
amqpAdmin.declareQueue(真に新しい新しいキュー( "amqpadmin.queueを"、));
//バインド
amqpAdmin.declareBinding((バインディング新しいです" amqpadmin.queue "Binding.DestinationType.QUEUE、" amqpadmin.exchange」、
"amqp.haha"、NULL));
}


公開された26元の記事 ウォン称賛27 ビュー6854

おすすめ

転載: blog.csdn.net/qq_40705355/article/details/103672023