分散トランザクション2PC、3PC、TCC、ブログのアドレスについての理論的な知識の話の前に:
図1に示すように、分散トランザクション(1)--- 2PCと3PC原理
図2に示すように、分散トランザクション(2)--- TCC原理
これはRocketMQについての理論的な知識が分散トランザクションを実現する、次のプロジェクトはRocketMQがSpringCloudを通じて分散トランザクションを実装インスタンス化する例になります話します。
まず、シーンに分散トランザクションを与えます
列子
:と仮定 A に Bを 切り替えて 100ドルを、彼らは同じサービスではありませんが、。
目标
:ある A マイナス100ドル、B プラス100ドル。
実際の状況はすることができ、4つがあります。
1)就是A账户减100 (成功),B账户加100 (成功)
2)就是A账户减100(失败),B账户加100 (失败)
3)就是A账户减100(成功),B账户加100 (失败)
4)就是A账户减100 (失败),B账户加100 (成功)
ここで 第一および第二の ケースでは、トランザクションの整合性を保証することであるが、 第三及び第四の 業務の一貫性が保証されません。
それは我々がトランザクションの一貫性を確保するためにRocketMQを見てどのようです。
二、RocketMQは、分散トランザクションの原則を実装します
RocketMQもかかわらず、前の分散トランザクションをサポートしていますが、RocketMQ 4.3が正式にオープンするまで開きませんでした。
1、基本的な考え方
最终一致性
RocketMQ結果整合性は、分散トランザクションであることはなく、同じ分散トランザクションには、以下に詳細に究極の整合性業務である理由として2PC、3PC、TCC、などの強いとして、最終的な一貫性はメッセージである保証していること、指示。
Half Message(半消息)
消費者の消費手段は、一時的にニュースも。プロデューサーのメッセージが正常にブローカーの終わりに送信されてきたが、このメッセージは次のようにマークされている暂不能投递
半メッセージと呼ばれ、この状態ではメッセージの中で、状態。必要プロデューサー
メッセージ二次确认
の後に、それを消費する消費者のために。
消息回查
ネットワークセグメント、アプリケーションおよびその他の要因の生産再開のために点滅します。プロデューサーの終わりにつながるしていない ハーフメッセージ(半のメッセージ) した 二次確認。これはBrockのサーバが定期的にスキャンしている长期处于半消息的消息
だろう、
最終状態(メッセージプロデューサーの終わりについて尋ねるコミットまたはロールバック)、メッセージは メッセージのバックチェック。
2、分散トランザクションの相互作用プロセス
アリは、我々は分散トランザクションRocketMQの原理を理解することができ、この公式のチャートを理解していました。
私たちは、上の画像の下にそれをお見せしましょう
1、A服务先发送个Half Message给Brock端,消息中携带 B服务 即将要+100元的信息。
2、当A服务知道Half Message发送成功后,那么开始第3步执行本地事务。
3、执行本地事务(会有三种情况1、执行成功。2、执行失败。3、网络等原因导致没有响应)
4.1)、如果本地事务成功,那么Product像Brock服务器发送Commit,这样B服务就可以消费该message。
4.2)、如果本地事务失败,那么Product像Brock服务器发送Rollback,那么就会直接删除上面这条半消息。
4.3)、如果因为网络等原因迟迟没有返回失败还是成功,那么会执行RocketMQ的回调接口,来进行事务的回查。
これは、上記のプロセスから学ぶことができます 只有A服务本地事务执行成功 ,B服务才能消费该message
。
そして、私たちはいくつかの質問を熟考しましょうか?
为什么要先发送Half Message(半消息)
私は、主に2つあると思います
1)可以先确认 Brock服务器是否正常 ,如果半消息都发送失败了 那说明Brock挂了。
2)可以通过半消息来回查事务,如果半消息发送成功后一直没有被二次确认,那么就会回查事务状态。
什么情况会回查
2例もあります。
1)执行本地事务的时候,由于突然网络等原因一直没有返回执行事务的结果(commit或者rollback)导致最终返回UNKNOW,那么就会回查。
2) 本地事务执行成功后,返回Commit进行消息二次确认的时候的服务挂了,在重启服务那么这个时候在brock端
它还是个Half Message(半消息),这也会回查。
特別な注意:あなたが戻ってチェックすると、その再実行してローカルの業務に必要を見て、現在のトランザクションの実装を参照してください。
後者の場合は、あなたが最初に現在のトランザクションの実装をチェックしない場合にチェックによる発生した場合を想像しますが、直接取引を実行し、それは2人のローカル事務の実装を成功に相当します。
为什么说MQ是最终一致性事务
上の写真では、我々はそれを見ることができ、上記の例一貫性のない問題に両方のケースは、決して起こりません
A账户减100 (失败),B账户加100 (成功)
なぜなら:ローカル・トランザクション・サービスが失敗した、とメッセージは、おそらくBサービスに到達したことがないので、そのBサービスは、何かをすることはありません場合。
その後、 Aはマイナス100(成功)、Bアカウントプラス100(故障)が占める ことができないであろう。
答えはイエスです
私はメッセージの実装を成功させるための唯一の責任があったとき、メッセージがメッセージと関係なく何を受け取った後にB、BサービスとしてA、最終的な実行結果に配信を保証することができますので、サービス。
行うにはどのように失敗Bサービス?
B決勝に失敗した場合のコードは、通常、数再試行が成功することができ、問題ではない場合、消費者側は、RocketMQの再試行メカニズムを持っているので、彼らは、異常によって引き起こされる問題を持っている理由は、コードはほぼ確実です。
いくつかの再試行が失敗した後に理由コードが発生した場合、それは問題で、によって記録された異常がない人工处理
すべての詳細を明らかにし、治療人工た後、あなたは問題が最終的な合意に達することができましょう。