私はJavaのシリーズを愛する--- [メッセージキュー(RabbitMQの)]

白ビューのメッセージキューは、どのようなものです:http://developer.51cto.com/art/201904/595020.htm

RabbitMQの顔質問:https://blog.csdn.net/qq_42629110/article/details/84965084

分散トランザクションを回避するために、メッセージキューを使用すると、
  あなたの人生を見れば、その後の人生のシーンは私たちにヒントをたくさん与えています。
  例えば、有名な北京八尾KeeさんChaoganポイントChaoganとのために支払われた後、彼らは直接あなたのChaoganを指していない、あなたは、多くの場合、あなたの小さなチケットを与え、その後、あなたは小さな投票を見てみましょうエリアに入るために、出荷ラインアップ。
なぜ彼らはのために支払う2つの別々の行動にそれを拾うしたいですか?多くの理由のために、1つの非常に重要な理由は、彼らの受信容量の増強(高い同時実行)を行うためのものです。

それとも限り、この小さなチケットとして、あなたは最終的にChaoganを取得することができます、私たちの問題に戻ります。同様に、ユーザが10,000のネットを考慮するとき、あまりにも、サービスを転送
我々だけで読み取ることができる証明書(メッセージ)を生成し、この証明書(ニュース)バウチャー限り、「ユーザーはアカウントが、万に増加Bすることができます」(ニュース)確実に保存することができ、
我々は最終的に、最終的な一貫性を完了するために)我々は、証明書(メッセージに頼ることができ、ユーザーはアカウントが10,000を増加Bすることができます)このバウチャー(ニュースを取ることができます。

1どのように信頼性の高い文書を保存します(メッセージ

  2つの方法があります。

メッセージサービス1.1結合モード

  ユーザAは、同時にメッセージデータを記録しながら、メッセージデータとサービスデータが同じデータベース・インスタンス(メッセージ・テーブル・レコード・メッセージと呼ばれる)に格納されて引き落とされます。

1
2
3
4
5
<span style= "color: #000000;" >Begin transaction
update A  set  amount</span>=amount-10000  where  userId=1<span style= "color: #000000;" >;
insert  into  message(userId, amount,status) values(</span>1, 10000, 1<span style= "color: #000000;" >);
End transaction
commit;</span>

  限り、上記の取引が保証するために、ユーザは控除お金を占めていること、メッセージが生き残ることができるようになります。

  上記のトランザクションが正常にコミットすると、我々は、ユーザーBが正常に治療が成功し、リアルタイム・メッセージング・サービス・ユーザー・Bを通じて、このメッセージに気付か応答メッセージを送信する、記事の削除後のメッセージデータユーザーが回答を受け取りました。

メッセージサービス1.2デカップリング方法

  上述したよう保存されたメッセージデータとメッセージ・サービス・データが密、一緒に結合されたアーキテクチャ的洗練、および他の問題を引き起こす可能性が高いようにします。デカップリングするには、次のように使用することができます。

  1)取引が実際にトランザクションを送信せず、唯一のレコードデータのメッセージ、インスタント・メッセージング・サービス・メッセージを送信するために、リアルタイムのメッセージングサービスを要求するために、コミットされる前に利用者料金は、メッセージが正常に送信された後にのみ提出されます。

  ユーザーデビットトランザクションが正常にコミットされた場合2)、リアルタイムメッセージングサービスへの確認応答を送信します。唯一の確認指示、実際にメッセージを送信するリアルタイムメッセージングサービスを受けた後、

  3)場合には、ユーザーデビット取引は、リアルタイムメッセージングサービスの送信をキャンセルし、提出に失敗したことをロールバックします。送信解除コマンドを取得した後、メッセージは送信されないであろう。

  4)これらの未確認メッセージまたは取り消しメッセージの場合、ユーザは、クエリメッセージは、メッセージ状態確認されているシステムにタイミングの状態を必要とし、システムを更新します。なぜこのステップは、
例えば:システムがハングアップ、デビット取引が正常に送信され、ユーザーの後に第2工程を想定し、ステータスメッセージは、これにより、メッセージが送信できない原因と、「確認を送信」するように更新されていません。

  利点:独立して、メッセージデータを格納するサービスシステムとメッセージシステムとの間の結合を減少させます。

  短所:2つの要求メッセージを送信する必要があり、処理サービスは、バックインターフェースの状態チェックを実装する必要がサービスメッセージ。

2配信重複メッセージの問題を解決する方法

  非常に深刻な問題は、同じメッセージが二回配信繰り返されている場合、ユーザBへの転送は、例えば、我々は、ユーザーアカウントのB2万の代わりに、万が増加しますお客様に繰り返しメッセージ配信でもあります。

  なぜ、同じメッセージが配信されます繰り返し?例えば、ユーザBは、メッセージmsgの処理を終了し成功したプロセスは、通常の状況下で、あなたがメッセージmsgユーザーを削除する必要があるユーザーにメッセージを送ったが、ユーザー悲劇がハングアップした場合は、この時間は、
、メッセージmsgを見ては、再起動後にまだありますそれはメッセージmsgを送信し続けます。

  ソリューションメッセージングアプリケーション状態テーブル(message_apply)を高めるために、利用者B側に簡単です、それが人気の本で、消費のためにメッセージを記録し、メッセージのそれぞれが、
実際の実行前に、メッセージングアプリケーションの状態を行きますノートが見つかった場合、テーブルのクエリは、再び、重複メッセージは、実行前に見つからない場合は、廃棄し、メッセージアプリケーション状態テーブル(同じトランザクション)に挿入することができます

1
2
3
4
5
6
7
8
for  each msg  in  queue
Begin transaction
select  count(*)  as  cnt  from  message_apply  where  msg_id=msg.msg_id;
if  cnt==0 then
update B  set  amount=amount+10000  where  userId=1;
insert  into  message_apply(msg_id) values(msg.msg_id);
End transaction
commit;

おすすめ

転載: www.cnblogs.com/hujunwei/p/11465121.html