任意の方法のトラフィック保護機能を実装するために、1 行のコードを記述する必要はありません

作者:テンスリープ

バックグラウンド

マイクロサービスの安定性は、常に開発者にとって大きな関心事でした。モノリシック アーキテクチャから分散アーキテクチャへのビジネスの進化と展開方法の変化により、サービス間の依存関係はますます複雑になり、ビジネス システムも高可用性の大きな課題に直面しています。流行中に、次のシナリオを経験した可能性があります。

  • マスクをオンラインで予約すると、瞬間的なピーク トラフィックによりシステムが最大負荷を超え、負荷が急増し、ユーザーは注文できませんでした。
  • オンライン科目選択において、同時に多くの科目選択要求が送信され、システムが応答できない場合があります。
  • オンラインオフィス/教育中に同時にオンライン会議に参加するユーザーが多すぎて、会議が比較的滞っています。 

これらの可用性の低下のシナリオは、ユーザーエクスペリエンスに深刻な影響を与えるため、事前に不安定な要因から保護するための何らかの手段を使用する必要があり、突然のトラフィックが発生した場合に損失を迅速に停止する機能も備えている必要があります.

フロー制御の低下 - マイクロサービスの安定性を確保するための重要な部分

マイクロサービスの可用性に影響を与える要因は多数あり、これらの不安定なシナリオは深刻な結果をもたらす可能性があります。マイクロサービス トラフィックの観点から、2 つの一般的なシナリオに大まかに分けることができます。

  1. サービス自体のトラフィックが容量を超え、利用できなくなります。たとえば、トラフィックの急増とバッチ タスクの配信により、サービスの負荷が急増し、要求を正常に処理できなくなります。

トラフィックは非常にランダムで予測不可能です。最初の 1 秒間は穏やかな場合があり、次の 1 秒間はトラフィックのピークが発生する場合があります (0:00 の Double Eleven のシーンなど)。ただし、システムの容量には限りがあり、突然のトラフィックがシステムの容量を超えると、リクエストが処理されなかったり、蓄積されたリクエストの処理が遅くなったり、CPU/負荷が急増したり、最終的にシステムがクラッシュしたりする可能性があります。 . したがって、この種のバースト トラフィックを制限して、リクエストの処理中にサービスが過負荷にならないようにする必要があります。

1.png

  1. このサービスは、利用できない他のサービスに依存しているため、独自のチェーンでは利用できません。たとえば、当社のサービスは複数のサードパーティ サービスに依存している場合がありますが、支払いサービスに異常があり、呼び出しが非常に遅く、呼び出し元が効果的にそれを防止および処理しない場合、呼び出し元のスレッド プールがいっぱいになり、影響を受けます。サービス自体。分散システムでは、呼び出し関係が複雑に絡み合っており、サービスに障害が発生すると反応が連鎖的に発生し、リンク全体が利用できなくなる可能性があります。

サービスは、別のリモート サービス、データベース、またはサードパーティ API などの他のモジュールを呼び出すことがよくあります。たとえば、支払いを行う場合、UnionPay が提供する API をリモートで呼び出す必要がある場合や、特定の商品の価格を照会する場合、データベース クエリが必要になる場合があります。ただし、この依存サービスの安定性は保証されません。依存するサービスが不安定でリクエストの応答時間が長くなると、サービスを呼び出すメソッドの応答時間も長くなり、スレッドが溜まり、最終的には業務自体のスレッドプールが枯渇し、サービスが停止する可能性がありますそれ自体も変化します。最新のマイクロサービス アーキテクチャは分散型であり、非常に多数のサービスで構成されています。さまざまなサービスが相互に呼び出し、複雑な呼び出しチェーンを形成します。上記の問題は、リンク呼び出しに拡大効果をもたらします。複雑なリンクのリングが不安定な場合、カスケードされ、最終的にリンク全体が使用できなくなる可能性があります。したがって、不安定なサービスを融合してダウングレードし、不安定な通話を一時的に遮断し、全体的ななだれを引き起こす局所的な不安定要因を回避する必要があります。

2.png

MSE サービス ガバナンスは、Ali の現在の制限およびダウングレード コンポーネントである Sentinel の安定性保護機能に基づいており、フロー制御、同時実行制御、サーキット ブレーカーのダウングレード、ホットスポット保護などの複数の側面からサービスの安定性を確保するためにトラフィックをエントリ ポイントとして使用します。 、システム アダプティブ プロテクション、マイクロサービス、クラウド ネイティブ ゲートウェイ、サービス メッシュなどのいくつかのシナリオをカバーしています。

フロー制御の低下のシナリオと機能を紹介した後、今日焦点を当てる主役であるランタイム動的拡張機能について話しましょう。Web、Rpc、SQL、Redis およびその他のアクセス インターフェイス、任意に記述されたビジネス メソッド、フレームワーク インターフェイスなどを含むがこれらに限定されないワンクリック MSE サービス ガバナンスを通じて、任意の時点でフロー制御の低下を実装する方法を紹介します。

ランタイム拡張機能 - 任意の時点でのワンクリック フロー制御の低下

実行時に指定されたメソッドにフロー制御の低下機能を追加する方法は? 以下、例としてデモを簡単に紹介します。以下のビジネス コードを作成し、単純な Spring Boot アプリケーションを作成しました。ここで、メソッドは任意に作成された内部メソッドです。

@SpringBootApplication
public class AApplication {

    public static void main(String[] args) {
        SpringApplication.run(AApplication.class, args);
    }

    @Api(value = "/", tags = {"入口应用"})
    @RestController
    class AController {
        ...
    @ApiOperation(value = "HTTP 全链路灰度入口", tags = {"入口应用"})
        @GetMapping("/a")
        public String restA(HttpServletRequest request) {
            return a(request);
        }
        
        private String a(HttpServletRequest request) {
            StringBuilder headerSb = new StringBuilder();
            Enumeration<String> enumeration = request.getHeaderNames();
            while (enumeration.hasMoreElements()) {
                String headerName = enumeration.nextElement();
                Enumeration<String> val = request.getHeaders(headerName);
                while (val.hasMoreElements()) {
                    String headerVal = val.nextElement();
                    headerSb.append(headerName + ":" + headerVal + ",");
                }
            }
            return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " +
                    restTemplate.getForObject("http://sc-B/b", String.class);
        }
        ...
    }
}

これまでのところ、監視の a メソッドは表示されず、restA のインターフェイスまたは GET:/a の監視データのみが表示され、現在の制限および低下ルールを構成できます。

3.png

オープン ソース方式では、Sentinel の依存関係をコードに追加し、Sentinel 機能を com.alibabacloud.mse.demo.AApplication.AController#a メソッド構成アノテーションまたはコーディング メソッドに追加する必要があります。

// 注解方式进行埋点,注解方式受 AOP 代理的诸多限制
@SentinelResource("com.alibabacloud.mse.demo.AApplication.AController:a")
private String a(HttpServletRequest request) {
    StringBuilder headerSb = new StringBuilder();
    Enumeration<String> enumeration = request.getHeaderNames();
    while (enumeration.hasMoreElements()) {
        String headerName = enumeration.nextElement();
        Enumeration<String> val = request.getHeaders(headerName);
        while (val.hasMoreElements()) {
            String headerVal = val.nextElement();
            headerSb.append(headerName + ":" + headerVal + ",");
        }
    }
    return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " +
            restTemplate.getForObject("http://sc-B/b", String.class);
}

// SDK 方式增加流控降级能力,需要侵入业务代码
private String a(HttpServletRequest request) {
    Entry entry = null;
    try {
        entry = SphU.entry("HelloWorld");
        
        StringBuilder headerSb = new StringBuilder();
        Enumeration<String> enumeration = request.getHeaderNames();
        while (enumeration.hasMoreElements()) {
            String headerName = enumeration.nextElement();
            Enumeration<String> val = request.getHeaders(headerName);
            while (val.hasMoreElements()) {
                String headerVal = val.nextElement();
                headerSb.append(headerName + ":" + headerVal + ",");
            }
        }
        return "A"+SERVICE_TAG+"[" + inetUtils.findFirstNonLoopbackAddress().getHostAddress() + "]" + " -> " +
                restTemplate.getForObject("http://sc-B/b", String.class);
    } catch (BlockException ex) {
      System.err.println("blocked!");
    } finally {
        if (entry != null) {
            entry.exit();
        }
    }
}

コーディングが必要な場合、必然的に多くの欠点が生じます.依存性を増やすには、コードを変更する必要があり、再公開する必要があります.

では、コードを 1 行も書かずに、com.alibabacloud.mse.demo.AApplication.AController#a の現在の制限とダウングレード機能を実現するにはどうすればよいでしょうか?

ランタイム ホワイト スクリーン ルールの構成

ランタイム ホワイトニング ルールを構成し、現在適用されているカスタム埋め込みタイプのインターフェイスを選択し、クラスとメソッドを入力します。

4.png

もちろん、ホワイト スクリーン ルール機能は、動的な現在の制限とダウングレードをサポートするだけでなく、任意の時点でのアクセス ログとリクエスト コンテキストの収集もサポートすることがわかります。

5.png

指定された方法で観測されたモニタリング データ

Application Governance でターゲット アプリケーションを見つけ、Interface Monitoring > Custom Embedding Points で指定されたメソッド com.alibabacloud.mse.demo.AApplication.AController#a のモニタリング データを確認します。

6.png

フロー制御ルールを構成する

インターフェイス概要の右上隅にある [保護ルールの追加] ボタンをクリックして、フロー制御ルールを追加できます。

7.png

QPS モードでは、最も単純なフロー制御ルールを構成できます. たとえば、上記の例では、このインターフェイスの 1 秒あたりの単一マシン呼び出しの数は 1 回に制限されています.

ルールを設定したら、監視ページで現在の制限効果が表示されるまでしばらく待ちます。

8.png

トラフィックが拒否された場合も、エラー メッセージが返されます。MSE に付属するフレームワークの組み込みポイントにはすべて、Web インターフェイスが制限された後に 429 Too Many Requests を返したり、DAO レイヤーと Java メソッドが制限されたときに例外をスローしたりするなど、デフォルトのフロー制御処理ロジックがあります。

要約する

ランタイム ホワイト スクリーン機能を次のルールに抽象化します。 WhiteScreenRule = Target + Action****

9.png

目標:

  • ResourceTarget: ターゲット インターフェイス、Web、Rpc、SQL、および任意のカスタム メソッドをサポート
  • WorkloadTarget: ターゲット インスタンス。すべてのマシンを選択するか、マシン IP を指定できます。
  • TrafficCondition: 例外、スロー コール、フルリンク グレースケール ラベルのみかどうか 

アクション:

  • 関連するコンテキスト診断情報、パラメーター、戻り値、スレッド コンテキスト、ターゲット オブジェクト、クラス ローダー情報などのコレクション。
  • 後続のリンクにログを出力するかどうか
  • 現在の制限のダウングレードを実行する
  • マーキング・染色の具体的な流れ(企画) 

近い将来、MSE は、動的エンハンス機能のログ管理と組み合わせた上記のルールに基づくモデルを開始します.動的エンハンス機能に基づいて、任意の時点での現在の制限と劣化だけでなく、洞察を得るのにも役立ちますフルリンク トラフィック操作の動作に影響を与え、意思決定を行います. リアルタイムのガバナンスと保護.

10.png

MSE Sentinel は、Alibaba 内の Taobao や Tmall などの e コマース分野で幅広いアプリケーションを持っているだけでなく、インターネット金融、オンライン教育、ゲーム、ライブ放送業界、その他の大規模な政府や国有企業。あらゆる方法の電流を制限および低下させる機能により、あらゆるマイクロサービス システムにトラフィックを保護する機能を迅速に提供できるため、ビジネスの急速な発展とシステムの安定性に集中する時間を増やすことができます。MSE にお任せください。自信を持ってプロのチームにプロの仕事をさせてください。

MSE クラウド ネイティブ ゲートウェイのプリペイド、MSE 登録済み構成のプリペイドは最初の購入が 20% オフ、最初の購入 1 年以上は 30% オフ。詳細はこちら

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/3874284/blog/5570824