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。合併症
- まず、我々はモードを指示、消費者の例プロデューサーは、それが受信されたものを送信するためにどのような疑いの余地はありません、送信者と受信キューに対応します
- ダイレクトモードでは、メッセージプロデューサは、消費者が同じキュー即ち複数の複数を開くと、一様に消費者は、この時点でのメッセージ複数の共有消費を省略する(ACK正常な場合)
- トピックモードは、2つのキューを結合スイッチは、ルーティングキーは、関係は、次のコードは、ルーティングキーを重ねたときに
topic.message
、メッセージ・キューを送信するためにqueueMessage
、及びqueueMessages
同一のメッセージを受信することができる、すなわち、トピックモードが放送モードに似て実装することができます形、さらにより柔軟は、そのメッセージを転送することができるルーティング・キーによって決定されます。 - 私たちは、消費者のためのパケットキューを送信する場合はファンアウトモードと比較すると、我々は、異なる指定する必要がルーティングキーを、あなたは異なるモードファンアウトスイッチおよびキューバインディング、実際の状況の実際の使用を指定する必要があります
@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。キューのプロパティ
- キュー:キュー名
- 耐久性:データキューの真の表現がディスクに永続化として、あなたはデータの損失MQのダウンタイムの再起動を防ぐことができます
- 排他:排他だけで、現在、それ以外の場合はエラーに新しい接続を許可しないように接続し、現在の接続がキューにアクセスすることを可能にする、真で切断現在のキューが破壊されるとき
- 自動削除:真のキューは自動的に削除されます接続への接続がない場合に自動的に削除します
- 引数:このパラメータは、いくつかの追加のパラメータを追加するために使用され、以下の絵
- そのような追加として
x-message-ttl
5000を、メッセージが期限切れにタイムアウトする5秒以上に処理されていません。 x-expires
120 000は、消費の2分以内にキューが削除されていなかったことを示す設定。x-max-length
、x-max-length-bytes
転送されたバイトの最大数とデータの長さが示されますx-dead-letter-exchange
、x-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。プロパティを切り替えます
- 為替:スイッチ名
- タイプ:スイッチタイプ
- 耐久性:キューと永続化、
- 自動削除:自動で同じキューを削除するかどうか
- 内部:trueの場合、交換が唯一の結合と交換の間の交換のために、メッセージクライアントをプッシュするために使用することはできないことを示しています。
- 引数:追加のパラメータは、唯一の
alternate-exchange
プロデューサーは、スイッチにメッセージを送信するときに、表し、ルートキューは、それがこのパラメータを尽くすことができないスイッチは、ルーティングスイッチ、ルーティングキーが一致した場合、その後に送ら指定しalternate-exchange
、指定されたキュー、同等の転送、およびちょうどパラメータinternal
スイッチは、ルーティングのキューの役割を果たしたいと思わなかった場合は、フィットを設定することができるinternal
真に、メッセージがに転送されalternate-exchange
、キューが指定した経路への切り替え、指定されたスイッチ- 図は、次の
exchange0
設定alternate-exchange
スイッチをexchange1
、プロデューサはにデータを送信するexchange0
ようにルーティングキーtest1
にexchange0
少ないルーティング、それが転送されるexchange1
キューに送信決定ルーティングコンプライアンス、queue1
- 図は、次の
![](https://user-gold-cdn.xitu.io/2019/10/29/16e15a7f4c0a2b45?w=959&h=500&f=png&s=70920)
复制代码
1.8。メモリとディスク
RabbitMQの管理インターフェイスでは、我々は情報分野で展開ノードのノードクラスタを見ることができるときもまた可能ディスクストレージまたはメモリストレージを示すために。実際には、ときのクラスタの展開、我々は少なくとも一つの結合、スイッチ、キューを表しディスクストレージ、およびディスクに保存された他のユーザメタデータの永続性にしたい、もう一度再起動のRabbitMQはまた元の状態に復元することができ、場合にのみノードは、ディスク記憶装置でなければならない場合、およびメモリストレージがその利点を有し、それはより速く、より効率的であり、そしてdisc
ram
1.9。事例エラー
- あなたが設定されている排他的キュー、存在しなければならないことを、次のエラーを報告し
exclusive
、つまり、次のエラーがロックされているため、理由のリソースを取得します。この排他的な性質のため、この時間を同じキューにアクセスすることができます作成した同じ接続異なるチャネルに、キューのプロパティをエラー。 - したがって、我々はあなたがキューになった設定した場合は、知ることができ
exclusive
財産、そしてあなたが同じキューにアクセスするために新しい接続を作成しないでください
ESOURCE_LOCKED - cannot obtain exclusive access to locked queue xxxxxx复制代码
一緒に進捗状況を学習、社会的関心の番号へようこそ