まず、ニュースサービスシーン
1、非同期処理
ユーザのログイン、データベースへの登録情報、および電子メールやSMS登録を送信します。このような同期呼び出しは50ミリ秒のすべてのステップを必要とする、それが非常に遅くなります。(Eメールと送信テキストメッセージの代わりに、ユーザーはすぐに結果を確認する必要があり、それがプロセスを遅らせることができます)。
第二の方法は、あなただけの100ミリ秒を必要とするので、これは遅すぎる、まだある、電子メールやテキストメッセージのマルチスレッド実装を使用して、あります。
第三の実施形態では、書き込みに登録情報データベースの後、次に情報は、メッセージキューを使用するように書き込まれ、その後、SMSメッセージを送信し、非同期読み出してメッセージキュー後続の処理から読み取ることができます。
図2に示すように、デカップリングの応用
1つのアプリケーションの注文や在庫システムのライトシステム、単一の在庫削減が結合することです。プロセスは非常に遅くなります。
在庫システムと注文システムを別々に抽出されたマイクロサービスとされ、それは直ちに注文システムは、単一のメッセージ・キューを書き込むために、直ちに在庫システムの注文情報を受信し、システムは在庫目録関連の操作を計算します。
3、フロークリッピング
スパイクへの商品の万10万人がある場合には、スパイクに適用され、すべての人の送信要求を、処理のためのTomcatは、それが立ち往生するのは簡単です。アプリケーションメッセージキュー、ユーザの要求メッセージキューは、だけですぐにキューを入力するように最初に来ます1万を格納、メッセージキューに最大値を追加します。ゆっくりとメッセージキューからのメッセージを処理するためのスパイクのビジネスロジックを削除します。
第二に、概念
-
ほとんどのアプリケーションでは、ミドルウェアメッセージサービスは、によるものであってもよい、デカップリング容量の拡張を非同期通信システムを持ち上げます
-
2つの重要な概念:
- メッセージ・ブローカ(メッセージブローカ)とデスティネーション(宛先)
- メッセージの送信者は、メッセージを送信すると、メッセージは指定された宛先へのメッセージ配信を確保するために、メッセージエージェントを代理店を引き継ぎます。
-
先のメッセージキューの二つの主要な形式があります
- キュー(待ち行列):ピア・メッセージング(ポイントツーポイント)
- メッセージの送信者は、デキューされたメッセージを読んだ後、メッセージの受信者は、キューからのメッセージの内容を取得し、メッセージブローカがキューに入れて、メッセージを送信します
- ニュースのみのみ送信者と認められたことで、それ一つだけ言うことではない受信者を
- テーマ(トピック):出版(パブリッシュ)/サブスクライブ(サブスクライブ)メッセージング
- 送信者(出版社)は、複数のトピックにメッセージを送信し、受信者(加入者)リスニングは、メッセージが到着したときに、このテーマは、それが同時にメッセージを受信します(にサブスクライブ)
- キュー(待ち行列):ピア・メッセージング(ポイントツーポイント)
-
JMS(Java Message Serviceの)Javaメッセージサービス:
- JVM仕様は、メッセージブローカに基づいています。ActiveMQの、HornetMQはJMSの実装です
-
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は、標準的なワイヤ・レベルのプロトコル層を定義する;天然クロスプラットフォーム、クロス言語機能。
-
春のサポート
-
春-JMS提供してJMSのサポートを
-
春ウサギが提供AMQPのサポートを
-
あなたは必要なConnectionFactoryのメッセージ・ブローカーに接続するための実装を
-
提供JmsTemplate、RabbitTemplateがメッセージを送信します
-
@JmsListener(JMS)、@RabbitListener(AMQP方法に投稿されたメッセージのための)メッセージブローカーコメントリッスン
-
@EnableJms、@EnableRabbitオープンサポート
-
-
春ブーツの自動設定
-
JmsAutoConfiguration
-
RabbitAutoConfiguration
-
三、RabbitMQのプロフィール
1、基本的な考え方
RabbitMQのは、によって開発されたアーランあるAMQP(AdvanvedメッセージキューProtocol)のオープンソース実装
-
メッセージ
- メッセージは、メッセージがで構成され、匿名であり、メッセージヘッダとメッセージ本体。メッセージ本体は、不透明、および任意の属性一連のメッセージヘッダには、これらの属性は、ルーティングキー(ルーティングキー)、優先度(他のメッセージに優先相対)メッセージことを示す**(MODE-配達それはそうで**)永続ストレージを必要とする場合があります。
-
出版社
- ニュースプロデューサーは、また、あるスイッチにメッセージを発行するクライアントアプリケーション。
-
両替
- スイッチのため、サーバーのキューにメッセージプロデューサとルートに送信されたメッセージを受信します。
- 取引所は4つのタイプがあります。直接(デフォルト)、ファンアウト、トピック、およびヘッダ、為替政策の異なる種類のメッセージの転送に異なります
-
キュー
- メッセージキューは、消費者に送信されるまでメッセージを保存するために使用しました。これは、メッセージのコンテナで、メッセージは終わりです。メッセージは、1つ以上のキューに入れることができます。メッセージは、消費者がそれを削除しますキューに接続するのを待って、待ち行列の内部にありました。
-
バインディング
-
結合、メッセージキューとスイッチとの間の関連付けのために。キーベースのルーティングルールおよびメッセージキューを接続するスイッチである結合、スイッチを結合することにより構成されるルーティングテーブルであると理解することができます。
-
取引所キューと結合をすることができ、多くの多くの関係。
-
-
接続
- ネットワーク接続などのTCPコネクションとして、。
-
チャネル
- チャンネル、独立した双方向のデータ接続流路多重化。チャンネルの仮想接続は、実際のTCPコネクションに設立され、AMQPコマンドは、サブスクリプション・キューまたは、これらのアクションは、チャネルを介して行われたメッセージを受信することを発表しているかどうか、チャネルを介して送信されます。TCPと破壊の設立以来、TCP接続を再利用するためには、非常に高価なオペレーティングシステムのオーバーヘッド、そのチャネルの概念を導入しています。
-
消費者
- 消費者のメッセージを示すメッセージ・キューからのgetメッセージクライアントアプリケーションを。
-
仮想ホスト
- ウェブホスティングは、スイッチ、メッセージキュー、および関連するオブジェクトのグループを表します。ウェブホスティングは、同じスタンドアロンサーバードメイン認証と暗号化の環境を共有しています。RabbitMQのサーバのミニバージョンでは、各バーチャルホストのキュー、スイッチ、結合メカニズムと権限、独自に、本質的です。AMQPは、バーチャルホストの考え方の基本は、接続時に指定する必要があり、RabbitMQのは/デフォルトのバーチャルホストです。
-
ブローカ
- エンティティが表すメッセージキューサーバー
図2に示すように、演算処理
プロセス:
- ポスト所有者(Publisherは)、あるメッセージ・ブローカにメッセージ(メッセージ)を送信メッセージサーバ(ブローカー)。
- 内部サーバーのWebホスティングと呼ばれるバーチャルホスト、独自の多く持っている、ウェブホスティングスイッチ(所)、キュー(キュー)。
- メッセージの仮想ホスト(バーチャルホスト)指定された仮想ホスト交換器(交流)に、。
- 交換(交換)メッセージに従ってルーティングキー(キーのルーティングエンドテイクで)判定されたメッセージのメッセージ・キュー**(キュー)にルーティング**内部、ルーティングルールの結合関係(による結合は)で表されます。メッセージは、メッセージキューに到達すると、消費者**(消費者)は**メッセージは、メッセージキューから削除することができます。
- 消費者のメッセージキューとの接続は、多重化、リソースを節約するために、接続を確立内の各TCPコネクションに多くを開くために、(接続)を確立したパイプ(チャンネル)どのデータ交換をパイプラインで、キューからメッセージを取得するには、データは、パイプラインを介して消費者(消費者)に返されます
3、交換タイプ
Exchangeは:流通政策の違いのタイプに応じて、メッセージを配布する時間を持って、4種類あった直接、ファンアウト、トピック、ヘッダが。AMQPメッセージヘッダは、次の3つのタイプにさらに正確にルーティングヘッダに一致する代わりに、キー、直接交換スイッチとヘッダーが、パフォーマンスはほとんどもう使用されない、乏しいたくさんあるので、直接見て:
- 直接
メッセージルーティングキー(キールーティング)、およびバインディングキーが整合結合場合、スイッチは、対応するキューにメッセージを送信します。キュー完全一致の名前でキーをルーティング。
- 扇形に広がります
ファンアウトメッセージに各ヘアピースタイプは、最大バインドされているすべてのキューに割り当てられます。ファンアウトスイッチは、キーのルーティングを処理しませんが、スイッチ・キューへの単純バインドは、スイッチに送信されたメッセージのそれぞれは、スイッチにバインドされているすべてのキューに転送されます。サブネットブロードキャストなどの多くは、各サブネット内のホストは、メッセージのコピーを受け取っています。ファンアウトメッセージタイプを転送することで最速。
- トピックモードによってキー属性ルーティングトピックスイッチ割り当てメッセージが一致し、ルーティングキー及びパターンマッチング、ケースは、キューモードに結合する必要があります。これは、文字列を切断し、キーワードへルーティングキーを結合します単語間の点によって分離されています。「#」の記号とシンボル「:また、2つのワイルドカードを識別します」。#マッチ 0以上の単語は** ****単語と一致します。
四、ウサギMQ統合
1、インストールと起動のRabbitMQ
-
仮想マシンのインストールのRabbitMQ内で使用するドッキングウィンドウ
docker pull rabbitmq:3.8-management
-
スタート
docker run -d -p 5672:5672 -p 15672:15672 --name myrabbismq rabbitmq的id
-
ビューを実行します
docker ps
図2は、構成要件に応じて切り替えてメッセージキューを追加します
3、RabbitMQの統合
pom.xmlを追加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 達成ユニキャスト
/**
* @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);
}
- 放送達成
/**
* @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());
}
}
- カスタムシリアル化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();
}
}
- 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));
}