RabbitMQのメッセージングを達成するために、ライブのケースと組み合わせること

PS:この記事は長くなり、読者はまだ読んで忍耐を必要としています。乾燥品がたくさん。

パフォーマンスを向上させるために、だけでなく、プロジェクトの仕様を達成するために、我々は分散型のプロジェクトでのメッセージングミドルウェアメッセージキューの導入を扱うになります。ミドルウェアは、パフォーマンスの向上があり、デカップリングの役割です。メッセージングミドルウェア、毎日私たちのそれぞれに接触している、私たちは使用または米国ミッション米国ミッションの聞いたことがあると信じています。プログラマの観点から、米国ミッションのお持ち帰りは3つの役割を含みます。[ビジネス] [ライダー] [顧客]。次のように理解するために、これらの3つの簡単な関係

三つの役割構造

以下の場合は、次のプロジェクト構造で、コードを説明する
プロジェクト構造
ウサギデモ

オーダー

今日は他の二つのプロセスにそれを選択するためのプロセスを選択しない理由は、プロセス指図を強調表示します。プロセスは、メッセージキューに配信されていないため。あなたがブロックを計画している場合、私は唯一のメッセージは、メッセージコンシューマであると考えることができます。そして、それは注文処理を行い、受注は同じです。読者は、通常の食事をしている人を検討してください。私たちは、順番をより理解する必要があります。

ペイラインの下で

私たちは、私たちのテイクアウトの食事を起動するために、米国のミッションの前にプロセスを考えます。顧客は、商人の店の消費量を支払うために行われています。このモデルの欠点は何をして存在しています。これは、お店のビジネスは、消費者がアップジャムません聞かせてできることは、十分に大きく、十分なスタッフを超えているでなければなりません。しかし、これはビジネスのコストを増大させます。したがって、私たちのオンライン取引のこの制限の条件の下で、それが生まれました。
オフライン取引

オンライン取引

米国のグループでは、我々は唯一の携帯電話の順序を必要とする、企業はラインを受け入れることを選択した後、出荷されます。これは、単一のプロセスの場合です。ライダーは、ビジネスプロセスの背後にあります。

当社のお客様は、メッセージキューにメッセージを追加することに相当している、メッセージ本文は、私たちのオーダーです。米国ミッションテイクアウトシステムでは、同じ時間より以上であってもよい商人の処理時間につながった一つのポイントは、しかし、これはキャッシュメカニズム最初の顧客の注文のローカライズ、FIFOのMQ順序として私たちのMQです系統的メッセージは、企業の手に配布します。これは、複雑な順序で私たちの問題を解決するために多くの人々をリードしています。
まあ、我々はMQの利益のそれより。ここでは、メッセージを送信するために、特定のMQによって一元的にコードを見てください。
オンライン取引

図のMQ構造

構造

環境の準備

RabbitMQのインストール

RabbitMQの以来Erlangで書かれ、そのためのErlangをインストールする必要があります。

  • 取得するために、対応するインストールファイルを介してインストールHttp://www.erlang.org/downloads
  • 環境変数を増やしERLANG_HOME = D:\プログラムファイル\のerl9.3(ここでは、あなたがあなた自身のディレクトリを置き換えるために、私のディレクトリのインストールディレクトリ持っています)
  • 元の値の後に、環境変数PATHを変更プラス「;%ERLANG_HOMEの%の\ビン」

アーランをインストールした後、我々はRabbitMQのをインストールすることができます。

  • インストール用のインストールパッケージをダウンロードするHttp://www.rabbitmq.com/install-windows-manual.html
  • (ここでは、ディレクトリは私のインストールディレクトリで、あなたがあなた自身のディレクトリを交換する必要が)\プログラムファイル\のRabbitMQサーバーの\ rabbitmq_server-3.7.5:環境変数RABBITMQ_HOEMを増やし= D
  • 元の値に加えた後、環境変数PATHを変更「;%RABBITMQ_HOME%\ sbinに」

デフォルトに従って開始されるサービスとして、RabbitMQのをインストールした後

コマンドRabbitMQの-プラグインを実行しますrabbitmq_managementオープンなWeb管理プラグインを有効にする
スタート
ブラウザのHTTP経由でのアクセスを:// localhostを:15672、およびデフォルトのユーザーゲストでログインし、パスワードは、ログインページの後に、ゲストであります:
ブラウザインターフェイス

springbootプロジェクトをビルドします

springbootについて詳しく説明しませんここに建てます。私たちは、zxhtom枠組みの中で直接拡大しました。ちょうどライン上の内側に、次の依存関係を追加


<!-- rabbit mq -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

その後、我々は唯一作成する必要があるRabbitConfigクラスを。このクラスの役割は、MQチェックを行い、初めに開始したプロジェクトのさまざまなコンポーネントの作成を完了することです。春以来クラスに追加する自然の必要性完了するために@Configurationノートを。

のみ上記の操作を完了する必要があり、当社のサービスMQでもやりました!残りの生産が消費されなければなりません。
ここにもっと注意を払うことでRabbitConfig、我々は、MQ下原理を理解するために開始する前に、私たちはコードを見て最終的に何かがあることをクラス。

RabbitMQのコンポーネントの解体

キュー:メッセージキュー、オブジェクトの生産者と直接接触しません。
取引所:消費者がスイッチと直接接触している通常の状況を切り替えます。
ルーティングキー:生産者と消費者と接触している2つの異なるオブジェクト。これは、関連する両方のオブジェクトへのルーティングキーが必要です
キーをルーティングによって互いに結合:バインディングを。

ここでは、消費者、生産者、キュー、スイッチ、RKとの関係は、ある結合します

関係

スイッチの4種類

我々は内部構造のMQを理解する上で、実際には、それは非常に簡単です。しかし、時には我々は、MQブロードキャストモードを持っており、いくつかのアドホックモード。これらは、それが可能です。スイッチ - はい、それは、このセクションの私たちです。

直接交換

名前が示すように[]ダイレクトコネクト・スイッチです。メッセージキーを送信するように求められ、正確に特定のルートと一致します。私たちは、次のコードキューと方向によって互いに結合directExchangeスイッチQUEUE1を持っています。だから我々は、メッセージがDIRECTIONをマークする必要があり、メッセージを送信します


@Bean
public Binding binding1(){
    return BindingBuilder.bind(queue1()).to(directExchange()).with(DIRECTIONKEY);
}

public void directionSend() {
    rabbitTemplate.convertAndSend(RabbitConfig.DIRECTEXCHANGE, "directionKey", msg);
}

ファンアウト交換

私たちは理解して、[出力]、用ファンアウト中国語の翻訳が放送されます。[スイッチ]ラジオ
誰もが常にある限り、スイッチのバインディングが受信できるように再キューへの必要性として定義され、ここで、受信できることを意味し、放送、。他のキーが一致するように合図するニーズを切り替えるにはしたくありません。ファンアウト取引所は、限り、サブスクリプションは、メッセージが表示されますよう、私たちの共通のブロードキャストモードです。いくつかの不動産業者は、このモデルであるため、限り、あなたは不動産ダイナミクスの電話番号を残して、あなたの携帯電話にプッシュします。


@Bean
public Binding fanoutBinding1(){
    return BindingBuilder.bind(queue1()).to(fanoutExchange());
}
@Bean
public Binding fanoutBinding2(){
    return BindingBuilder.bind(queue2()).to(fanoutExchange());
}
@Bean
public Binding fanoutBinding3(){
    return BindingBuilder.bind(queue3()).to(fanoutExchange());
}
@Bean
public Binding fanoutBinding4(){
    return BindingBuilder.bind(queue4()).to(fanoutExchange());
}

次のコードは、長いメッセージは、すべてのキューに送信されたメッセージファンアウト取引を受け取ることになります

public void fanoutSend1() {
    rabbitTemplate.convertAndSend(RabbitConfig.FANOUTEXCHANGE, RabbitConfig.QUEUETHIRD, msg);
}

トピック所

方向交換鍵でここに理解されるようにルーティングキーとパターンマッチングは、いくつかの定期的なことで一致させることができる
#:1つ以上の単語を表し、
*:ワード示し
ZXH#で何かを:ZXHを一致させることができる。ZXH; .. zxh.abc; zxh.ab.sd.sa
ZXH *中のもの:zxh.testを一致させることができる。zxh.demo。

ヘッダ交換

ルーティングキーを処理しないでください。メッセージの内容が、送信されたヘッダのプロパティと一致。キューおよびExchange結合キーと値のペア指定し、交換ヘッダーを指定し、マッチングキーにバインドするときのRabbitMQメッセージがメッセージに送信され取られる、メッセージがこのキューにルーティングされる場合、完全一致、それはキューにルーティングされることはありません。ヘッダープロパティはキーと値のペアをハッシュテーブルとすることができるされ、キーと値のペアは、任意のタイプのものであってもよいです。ルーティングキーのファンアウト、直接、トピックは、文字列にする必要があります。

次の2種類が一致するX-一致規則:

Xマッチ=全て:すべてのキーと値のペアは、メッセージを受信するために一致していることを意味します

Xマッチ=任意:限りキー値に一致するメッセージを受信することがあるであろうように、その

//请求数据中必须符合headerValues中任意一个参数
@Bean
public Binding headBinding1(){
    Map<String,Object> headerValues = new HashMap<>();
    headerValues.put("type", "cash");
    headerValues.put("aging", "fast");
    return BindingBuilder.bind(queue1()).to(headersExchange()).whereAll(headerValues).match();
}

デッドレターキュー

完成上述した第4のスイッチ。そこ私たち不能キューと呼ばれるものもある
か米国ミッションテイクアウト列には、我々は通常、米国のグループの後に単一のポイントを終え、しかし、不確実性は、ビジネスを作るために今必要はありません。今回は次のシングルを選択しないだろう。米国のグループは、失敗の責任がある、30分以内に支払いを完了するために私達を促すメッセージが表示されます。あなたが注文を待っているところ米国のグループがされていることができなかっも考えてみましょう。あなたは人々の、このメモリがかかります。


@Bean
public Queue deadLetterQueue(){
    Map<String, Object> arguments = new HashMap<String, Object>();
    //设置此死信队列消息过期后,消息转发到那个队列上
    arguments.put("x-dead-letter-exchange", DIRECTEXCHANGE);
    arguments.put("x-dead-letter-routing-key", DIRECTIONKEY);
    return new Queue(QUEUEDEAD, true, false, false,arguments);
}

@Bean
public Binding deadBinding(){
    return BindingBuilder.bind(deadLetterQueue()).to(directExchange()).with(QUEUEDEAD);
}
public void deadSend() {
    MessagePostProcessor processor = new MessagePostProcessor() {
        @Override
        public Message postProcessMessage(Message message) throws AmqpException {
            message.getMessageProperties().setExpiration("60000");
            return message;
        }
    };
    log.info("延时消息开始发送:");
    rabbitTemplate.convertAndSend(RabbitConfig.DIRECTEXCHANGE, RabbitConfig.QUEUEDEAD, msg,processor);
}

私たちは、上記のコードのメッセージを送信することにより達成することができ、遅延効果が現れます。これは通常、30分、我々が支払うために、コードの効果です。

概要

この記事では、読者がまだ読むために忍耐を必要とし、長いです。乾燥品がたくさん。

チームに参加

チームに参加

マイクロチャンネル公衆数

マイクロチャンネル公衆数

おすすめ

転載: www.cnblogs.com/zhangxinhua/p/11504265.html