SpringCloud分散トランザクションソリューションズ

二つの序文

アリYunqi 2017会議は、「世界的に技術的な問題をクラック!GTSは、分散トランザクションは、シンプルかつ効率的なことができますアリは亀裂提案することを主張して、」世界的な問題に、信頼性かどうか、処理速度を分散トランザクションのための究極のソリューションをや市場に先駆け、すべての技術の利用可能です。プロジェクトがするのが残念であるオープンソースではない、あなたがしなければならない、そして第二にアリクラウドに依存している分散データベースの。結局、食べるために男が簡単にそこに人々が見ることができません

そうであっても、「世界の問題は...、」取引又は誘導まだかなりの場所の記事:達成するためのサービス「と複数のデータベースまたは断片化の操作「一見単純な機能は、複数の内部を呼び出す必要があるかもしれません」単一の技術とソリューションは、これらの複雑なシナリオを満たすことができなかった。このように、分散トランザクションにおける分散システムのアーキテクチャは、過去の周りの挑戦です。

分散トランザクションとは何ですか?これらの小さな操作は、単にそれは異なる組成によって運営大きな小さな動作であり、入れて、異なるサーバーに分散され、分散トランザクションは、これらの小さな操作がすべて成功、またはすべての失敗のどちらかということを確認する必要があります"

栗の場合:

あなたはお金と商品在庫-1バーを控除する必要があり、淘宝網の上にものを買います。しかしながら、そのようなネットワークジッタ、エクスカーション待ちなどの任意の一箇所で問題がある場合には、中間中間サービス層ネットワーク、ゲートウェイ、ホスト、等の一連の2つのサービス、両方が所有充インベントリは、矛盾をもたらすことができますこのようデビット成功ではなく、在庫-1として、そこに現象を売らされ、これは、トランザクションを配布されて解決する必要があります

三2フェーズ・コミット(2PC、3PC、など)

ステージ2の提出は、トランザクション従来のソリューションは、これまでのところ、まだ広範囲に進んで配布されています。トランザクション維持するために、複数のノード間でトランザクション、場合ACID特性は、として導入する必要があるコーディネータ(例えば、これらのノードの業績は、実際に提出指示するか否かを最終的にすべてのノード(参加者と呼ばれる)の制御を統一する操作の結果と、更新されたデータはディスクに書き込まれた、など)されます。:したがって、二相のアイデアは、次のようにプロトコルのアルゴリズムは要約することができますコミット参加者は、操作の成功のコーディネーターを通知し、その後操作をコミットまたは操作を中止するかどうかをすべての参加者のコーディネーターからのフィードバック情報に基づいて、各参加者を決定します。

満たすために、たとえば、

ABC D 4つの会議を整理し、時間を決定会議は、コーディネータすなわち、B Bingding参加をとることができます。

投票相

  1. B Bingding、週8つの午後の会議時間がある場合に送信されたメッセージ。
  2. 応答時間。
  3. Bの応答時間。
  4. 返信プロピオン遅れ、このイベントのために今回、B及びCの状態がブロッキングであり、アルゴリズムは継続できません。
  5. プロパンは、時間(または時間がない)を返信。

フェーズコミット

  1. 収集フィードバックBingding B(フィードバック、及び方法フィードバックの結果は、時間と、この例では支柱の決定に依存する)に、コーディネータの結果。
  2. Bは、受信しました。
  3. プロピオン酸は、受け取りました。
  4. 丁は、受け取りました。

だけでなく、参加するすべてのリソースをロックするには、だけでなく、リソースコーディネーター、大きなオーバーヘッドをロックします。文章の要約は次のとおりです。2PC非効率的な、非常に友好的に高い同時実行。

引用《世界性难题...》元の単語のテキスト「外務省は、分散トランザクションのスループットを開いた後、数十年と沈殿技術ベースのXAモデル、同じ条件の下で、ハードウェアとソフトウェアの商用製品を配布したが衰退の大きさのオーダーが多いです。」

また、三相コミットがあります

clipboard.png

私たちは、下の勉強したいことが興味を持っています

四の柔軟総務

いわゆるフレキシブルトランザクションは、トランザクション・ロック・テーブルの比較的剛性の必須の用語です。次への流れ:トランザクションサーバーのA正常に実装し、トランザクションは最初のA、Bもあれば十分トランザクションを実行提出される場合は、トランザクションBはまた、トランザクション全体が完了した場合でも、提出すること。しかし、トランザクションはBを、失敗した場合の状態未実行のトランザクションに復帰する前に自身がロールバックトランザクションは、トランザクションAがコミットされた、それは補償の操作を行う必要がある、トランザクションAが行った操作は、すでに逆の操作のために提出されたB、 。

欠点は、あまりにも押し付けがましいサービスが、また、補償業務、普遍性の欠如ではなく、大規模なプロモーションです。

結果整合性の五のニュース番組はRocketMQを解決します

現在、キューベースのメッセージング・ソリューションは、アリ持ってRocketMQ実装して、半消息と少し似ソリューション、Paxosアルゴリズムを以下のように、特定のプロセスがあります

第一段階:ビジネス及び上り伝送メッセージMQアプリケーション実行

clipboard.png

  1. 上り送信確認メッセージのアプリケーションは、信頼性の高いメッセージング・システムであることが
  2. 信頼性の高いメッセージングシステムは承認されるべきメッセージとリターンを節約します
  3. 上流のアプリケーションは、ローカルビジネスを行います
  4. 高信頼性メッセージング・アプリケーションは、上流の承認を通知し、サービスが実行されたメッセージを送信します。

ステータス変更メッセージを送信すると、メッセージが、ステータスMQミドルウェアに配信された信頼性の高いメッセージングシステム

第二段階:MQメッセージと下流のアプリケーションが業務を執行するために聞きます

下流のアプリケーションは、MQメッセージと業務執行、および信頼性の高い情報源への消費者のメッセージ通知サービスの結果を監視します。

clipboard.png

  1. MQメッセージング・アプリケーションでは、下流のコンポーネントを監視し、メッセージを取得します
  2. ローカルサービスを処理MQメッセージ本体ダウンストリームアプリケーション情報
  3. 下流MQの応用
  4. 確認メッセージが消費され、
  5. 信頼性の高い情報源のメッセージへのダウンストリームアプリケーション通知システムが正常に消費し、完全として信頼性の高い情報源へのメッセージの状態の変更

RocketMQ高度な実装であるが、問題があるように見え缺乏文档、それはせいぜいどのように使用する方法を教えてくれ、アリ上のApacheプロジェクトページまたはページにあるかどうか、そしてひどく欠けているものを原則やガイド。

あなたはアリクラウド上の特別なを買う場合はもちろん、RocketMQサービス、それはまた別の問題となっている必要があります。あなたはそれらのサービス環境で展開し、使用しようとする。しかし、私たちはかなりの学習曲線の後に必要だと思います。毕竟是人家吃饭的家伙嘛

一貫性の実現のための最後の6つのRabbitMQのメッセージングソリューション

RabbitMQ続いAMQP规范:それを確実にするためのメカニズムを確認するメッセージである限り、メッセージが送信されると、あなたはその消費者の支出を確保することができ、究極のメッセージの一貫性を達成します。また、オープンソース、また非常に豊富な文書は、分散トランザクションを実現するためには良いキャリアのように見えます

6.1 RabbitMQのメッセージの確認応答。


RabbitMQのを次のように全体の送信処理であります

1.プロデューサーは、メッセージサービスにメッセージを送信します

2.着陸を完了するためのメッセージの永続場合、フラグがプロデューサに戻されます。この確認を取得するためのプロデューサが成功を保証することができた後、彼はメッセージが最終的にメッセージング・サービスに送信されたと述べました。それ以外の場合は、例外処理プロセスを入力してください。

    rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
    if (!ack) {
        //try to resend msg
    } else {
        //delete msg in db
        }
    });

3.メッセージングサービスの消費者にメッセージを送信します

治療が成功した手動の確認である場合4.消費者は、メッセージを受信して​​処理。この確認を得るためにニュースサービスが保証されたとき、彼は、消費者が最終的に完成言いました。そうでない場合は、再送信、または例外処理に進みます。

    final Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    String message = new String(body, "UTF-8");

    System.out.println(" [x] Received '" + message + "'");
    try {
      doWork(message);
    } finally {
       //确认收到消息
      channel.basicAck(envelope.getDeliveryTag(), false);
        }
      }
    };

異常6.2


さんが送って異常の4種類を見てみましょう

1.直接到達不能メッセージサービス

ネットワーク壊れ、スローは、戻って直接ビジネスにロール。ある場合はconnection closed、エラーが、直接増加connectionに番号を

    connectionFactory.setChannelCacheSize(100);

2.メッセージがサーバーに到達しましたが、異常なリターンが表示されたとき

rabbitmqこれは、メカニズム、ACK確認メッセージが返されているかどうかを確認するために使用することができます提供します。我々は、既存のメッセージについてデシベル(またはメモリリレーショナルデータベース)に送ることができる前にそう、例外はACK再送信の場合

    /**confirmcallback用来确认消息是否有送达消息队列*/     
    rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
    if (!ack) {
        //try to resend msg
    } else {
        //delete msg in db
    }
    });
     /**若消息找不到对应的Exchange会先触发returncallback */
    rabbitTemplate.setReturnCallback((message, replyCode, replyText, tmpExchange, tmpRoutingKey) -> {
        try {
            Thread.sleep(Constants.ONE_SECOND);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        log.info("send message failed: " + replyCode + " " + replyText);
        rabbitTemplate.send(message);
    });

メッセージが配信された後3、メッセージサービスは、自分自身をハング

メッセージが永続的である場合は、それがack= trueディスクに書き込まれ、その後、メッセージがすでにハングしたメッセージサービスの場合には、ハードディスク上に存在することを確認するために送信されたメッセージの永続性、後に完了すると、メッセージサービスは、メッセージを再送信し、その後回復し、能力があります

4.配信不能消費者

メッセージサービスメッセージを受信した後、メッセージは、クライアントの確認メッセージまで、「UNACK」の状態になっています

    channel.basicQos(1); // accept only one unack-ed message at a time (see below)
    final Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        String message = new String(body, "UTF-8");

    System.out.println(" [x] Received '" + message + "'");
    try {
      doWork(message);
    } finally {
       //确认收到消息
      channel.basicAck(envelope.getDeliveryTag(), false);
    }
      }
    };
    boolean autoAck = false;
    channel.basicConsume(TASK_QUEUE_NAME, autoAck, consumer);

5.メッセージが失われている確認してください

メッセージが返されたときに、確認メッセージが失われたと仮定すると、メッセージサービスは、メッセージを再送信します。あなたが設定している場合がありますautoAck= falseが、ない任意の応答はchannel.baskAck答えなかったchannel.baskNackメッセージキューは、生きるためにブロックされますので、どのような場合に答える必要があります、それは非常に深刻なエラーにつながります

例外を処理する6.コンシューマ事業

メッセージリスナはあなたにも失敗したトランザクションを補償することができるトランザクションの補償を行っている場合でも、ロールバックが、あまりにも面倒で設定したい場合は、最初の段階のような、あなたが繰り返し実行を行うことができますので、ここで、事を完了した例外をスロー仮定し、受け入れ、メッセージを処理しますまだnを、電子メール、テキストメッセージの後に失敗した場合、すべての詳細を明らかにするために、肉を使用し、サイクルインデックスまでの時間を設定します。guavaretry

七つの概要

《世界性难题...》誘導の画像を達成するために、いくつかの方法で分散トランザクションの記事で

あなただけの会社に到達するために10キロ2車線の道路を通過するために、毎日仕事に行きます。この道路が遮断されて、多くの場合、我々は労働時間2〜3時間を必要とし、これは2PCの問題であることを保証するものではありません - 遅いです。

Bを選択されている非常に巻きますが、非常に少ない交通渋滞30キロ長い道のりを、選択します。労働時間は、十分な時間とガソリンを払って、保証されているが、早起きしなければなりません。これは困難なモジュラー、柔軟なトランザクションは、特定のビジネスにロールバックされなければならない問題です

周りのビットを選択して、20キロ長い山道、でこぼこ、これが最終的な取引メッセージの一貫性である、唯一のSUVを行くことができます。新しいメッセージングミドルウェアを導入し、それは追加の開発コストが必要となります。しかし、当社の開発CoolMQはすでにパッケージのコンポーネントは、専用トランザクションの要件を満たすことができるようになります、送信、受信する必要があります。現在、あるプログラムの講義は、あなたが自分のニーズに応じて選択することができます。

おすすめ

転載: blog.csdn.net/anwarkanji/article/details/91911982