RabbitMQの実用的なアプリケーションのスキル

1. RabbitMQの実用的なアプリケーションのスキル

1.1はじめに

プロジェクトの理由として、より多くのとRabbitMQのを扱うに従うべきなので、今後の鉱山ピットを回避しようとの戦闘スキルの下でアプリケーションのRabbitMQの並べ替えてみましょう

1.2の概要

仮想ホスト、スイッチ、キューとバインディング:RabbitMQのいくつかの重要な概念があります

  • ウェブホスティング:Webホスティングは、スイッチ、キューとバインディングのセットを保持し、我々は、仮想ホストレベルの細かさから権限を制御することができます
  • スイッチ:Exchangeがメッセージを転送するために、それは、メッセージが格納されていない所へのキューキューバインドがあれば、それは生産者によって送信されたデータから直接ドロップしません。
    :2つの重要な概念に関連するスイッチであり、ルーティングキー、キーの決定ルーティングをベースとする、メッセージ転送キューは、
  • バインディング:スイッチとキューが結合され、それは、多くの関係に多くの複数のスイッチが同じキューに接続することができることを意味し、スイッチはまた、より多くのキューを接続することができます

1.3。スイッチ

モードスイッチの4つのタイプがあります。Direct, topic, Headers and Fanout

1.3.1。直接Exchage

ダイレクトモードは、デフォルトのスイッチのRabbitMQを使用し、比較的単純なシーンのための最も簡単なモード

ダイレクトモードを使用して、以下に示すように、我々はデフォルトのスイッチが通過しながら、別のキューを作成する必要があるRouting keyルートのキー値に転送されたキューを決定する、あなたが見ることができ、ルートはキーバインディングは、複数のキューを指定することができますです

1.3.2。トピック所

このスイッチ・ルーティング・キーの一致が指定されたキューにメッセージを転送することができるとき、主ファジーマッチング、パターンマッチングと同様、また、ベース、およびトピックのワイルドカードパターンマッチング

  • 期間によって、文字列の文字列としてキーをルーティング(.など、分離されました)a.b.c
  • () *()指定された位置の単語を表し#、例えばゼロ以上の単語を表すa.*.b.#ような、aおよびbは中間ワードを満たす任意表し、バックは、B n個の単語が続くことができますa.x.b.c.d.e

トピックモードとダイレクトモードの違いは、スイッチは、例えば、それ自身の指定されたルーティングキーサポートファジーマッチングを必要とすることです。

rabbitTemplate.convertAndSend("topicExchange","a.x.b.d", " hello world!");复制代码

1.3.3。ヘッダExchage

ヘッダは規則に従って一致、それは経路に従ってキーではないが、カスタムこれらのキーのペアが一致したとき、それはメッセージヘッダの特性に設けられたキーと一致するルールに一致するヘッダーまたは全て、メッセージのみが存在します一般的に推奨されていないこのモードの比較的低い効率に対応するキューに配信されます

1.3.4。ファンアウト交換

ファンアウトは、有名なブロードキャストモードであり、パイプのルーティングキーに必要としない、の構成の場合でも、すべてのキューにメッセージを結合するルーティングキーは無視されます

1.4。合併症

  1. まず、我々はモードを指示、消費者の例プロデューサーは、それが受信されたものを送信するためにどのような疑いの余地はありません、送信者と受信キューに対応します
  2. ダイレクトモードでは、メッセージプロデューサは、消費者が同じキュー即ち複数の複数を開くと、一様に消費者は、この時点でのメッセージ複数の共有消費を省略する(ACK正常な場合)
  3. トピックモードは、2つのキューを結合スイッチは、ルーティングキーは、関係は、次のコードは、ルーティングキーを重ねたときにtopic.message、メッセージ・キューを送信するためにqueueMessage、及びqueueMessages同一のメッセージを受信することができる、すなわち、トピックモードが放送モードに似て実装することができます形、さらにより柔軟は、そのメッセージを転送することができるルーティング・キーによって決定されます。
  4. 私たちは、消費者のためのパケットキューを送信する場合はファンアウトモードと比較すると、我々は、異なる指定する必要がルーティングキーを、あなたは異なるモードファンアウトスイッチおよびキューバインディング、実際の状況の実際の使用を指定する必要があります
@Configuration
public class TopicRabbitConfig {

    final static String message = "topic.message";
    final static String messages = "topic.messages";

    @Bean
    public Queue queueMessage() {
        return new Queue(TopicRabbitConfig.message);
    }

    @Bean
    public Queue queueMessages() {
        return new Queue(TopicRabbitConfig.messages);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange("exchange");
    }

    @Bean
    Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
    }

    @Bean
    Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
    }
}复制代码

1.5。Springboot設定

次のように私たちの一般的な構成であります

spring.rabbitmq.addresses=localhost:5672
spring.rabbitmq.username=user
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=1000
##设置监听限制:最大10,默认5
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true
spring.rabbitmq.listener.simple.acknowledge-mode=manual复制代码

最後の4つの構成が焦点説明が必要です:

  • spring.rabbitmq.publisher-confirms真、ブローカは、メッセージを受信し、受信を確認するために領収書を送信し、提供されていないMQメッセージの損失につながる可能性があり、メッセージが送信されることを生産を示し
  • spring.rabbitmq.publisher-returns真、メッセージはさらなる処理のために到達不能メッセージにリスナーを使用,, MQブローカの終わりに到達できない場合を示し、これは、一般的にキーをルーティング良い仕事ではない、またはそれはMQのダウンタイムを発生することが
  • spring.rabbitmq.template.mandatory上記の二つがtrueの場合、これはそうでない場合は2を超える動作しない、真を装備しなければなりません
  • spring.rabbitmq.listener.simple.acknowledge-modeこれは、manual手動確認のため、実際の生産は冪等の事業、繰り返し呼び出し、以下の手動確認コード例に注意を払って、あなたのビジネスを確保するために処理され、手動で設定する必要があります
@Component
public class RabbitReceiver {

    
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "queue-1", 
            durable="true"),
            exchange = @Exchange(value = "exchange-1", 
            durable="true", 
            type= "topic", 
            ignoreDeclarationExceptions = "true"),
            key = "springboot.*"
            )
    )
    @RabbitHandler
    public void onMessage(Message message, Channel channel) throws Exception {
        System.err.println("--------------------------------------");
        System.err.println("消费端Payload: " + message.getPayload());
        Long deliveryTag = (Long)message.getHeaders().get(AmqpHeaders.DELIVERY_TAG);
        //手工ACK,获取deliveryTag
        channel.basicAck(deliveryTag, false);
    }
}复制代码

1.6。キューのプロパティ

  1. キュー:キュー名
  2. 耐久性:データキューの真の表現がディスクに永続化として、あなたはデータの損失MQのダウンタイムの再起動を防ぐことができます
  3. 排他:排他だけで、現在、それ以外の場合はエラーに新しい接続を許可しないように接続し、現在の接続がキューにアクセスすることを可能にする、真で切断現在のキューが破壊されるとき
  4. 自動削除:真のキューは自動的に削除されます接続への接続がない場合に自動的に削除します
  5. 引数:このパラメータは、いくつかの追加のパラメータを追加するために使用され、以下の絵
    • そのような追加としてx-message-ttl5000を、メッセージが期限切れにタイムアウトする5秒以上に処理されていません。
    • x-expires120 000は、消費の2分以内にキューが削除されていなかったことを示す設定。
    • x-max-lengthx-max-length-bytes転送されたバイトの最大数とデータの長さが示されます
    • x-dead-letter-exchangex-dead-letter-routing-key共通キューバインディングを作成するために、デッド・レターデッドレター・スイッチおよびルーティング、期限切れまたは処理キュー属性失敗することが必要で、データが保存され、不能キューに転送され、スイッチを表し、スイッチは名前を記入するx-dead-letter-exchange値の、デッドレターキューのルーティングキーを遵守するためのキーのルートに記入
    • x-max-priority唯一、0から255の範囲、優先度設定を示すメッセージが堆積されたときに優先することを、それは理にかなって優先順位番号が大きく、より高いです
    • x-queue-modeされるとlazy不活性キューを表明し、概念のみ不活性キューモードに比べ3.6.0、デフォルトモードで導入された後のメッセージはもちろんIOのオーバーヘッドが増えるであろう、ディスクに直接生成された生産者を救うが、多数に対処するのに適しているだろう状況メッセージは、パック、多数のメッセージが蓄積すると、メモリが十分なストレージではありません、ディスクダンプがメッセージを送信するため、プロセスは比較的時間のかかるプロセスであり、新しいメッセージを受信することはできません。あなたは、不活性、通常のキューキューを変換する必要がある場合は、不活性結合のキューを再作成し、元のキューを削除する必要があります。
    ![](https://user-gold-cdn.xitu.io/2019/10/29/16e15a7f22c92c58?w=1259&h=347&f=jpeg&s=43349)
复制代码

1.7。プロパティを切り替えます

  1. 為替:スイッチ名
  2. タイプ:スイッチタイプ
  3. 耐久性:キューと永続化、
  4. 自動削除:自動で同じキューを削除するかどうか
  5. 内部:trueの場合、交換が唯一の結合と交換の間の交換のために、メッセージクライアントをプッシュするために使用することはできないことを示しています。
  6. 引数:追加のパラメータは、唯一のalternate-exchangeプロデューサーは、スイッチにメッセージを送信するときに、表し、ルートキューは、それがこのパラメータを尽くすことができないスイッチは、ルーティングスイッチ、ルーティングキーが一致した場合、その後に送ら指定しalternate-exchange、指定されたキュー、同等の転送、およびちょうどパラメータinternalスイッチは、ルーティングのキューの役割を果たしたいと思わなかった場合は、フィットを設定することができるinternal真に、メッセージがに転送されalternate-exchange、キューが指定した経路への切り替え、指定されたスイッチ
    • 図は、次のexchange0設定alternate-exchangeスイッチをexchange1、プロデューサはにデータを送信するexchange0ようにルーティングキーtest1exchange0少ないルーティング、それが転送されるexchange1キューに送信決定ルーティングコンプライアンス、queue1
    ![](https://user-gold-cdn.xitu.io/2019/10/29/16e15a7f4c0a2b45?w=959&h=500&f=png&s=70920)

复制代码

1.8。メモリとディスク

RabbitMQの管理インターフェイスでは、我々は情報分野で展開ノードのノードクラスタを見ることができるときもまた可能ディスクストレージまたはメモリストレージを示すために。実際には、ときのクラスタの展開、我々は少なくとも一つの結合、スイッチ、キューを表しディスクストレージ、およびディスクに保存された他のユーザメタデータの永続性にしたい、もう一度再起動のRabbitMQはまた元の状態に復元することができ、場合にのみノードは、ディスク記憶装置でなければならない場合、およびメモリストレージがその利点を有し、それはより速く、より効率的であり、そしてdiscram

1.9。事例エラー

  • あなたが設定されている排他的キュー、存在しなければならないことを、次のエラーを報告しexclusive、つまり、次のエラーがロックされているため、理由のリソースを取得します。この排他的な性質のため、この時間を同じキューにアクセスすることができます作成した同じ接続異なるチャネルに、キューのプロパティをエラー。
  • したがって、我々はあなたがキューになった設定した場合は、知ることができexclusive財産、そしてあなたが同じキューにアクセスするために新しい接続を作成しないでください
ESOURCE_LOCKED - cannot obtain exclusive access to locked queue xxxxxx复制代码

古い梁は、Javaを伝えます

一緒に進捗状況を学習、社会的関心の番号へようこそ

おすすめ

転載: juejin.im/post/5db7b850e51d4529e7305db9
おすすめ