セマフォの制限、並行性の高いシナリオは秘密を言っています

公共の味の姉妹の数が少ないにもっと注意。

電流制限は、一般に、予め負荷の閾値推定背景(動的に調整することができる)に基づいて降格、と考えることができます。いくつかのバイパス処理を行う必要がある、この値を超えています。ビジネスフォームは、直接そこに待ち時間が部分的浸透を開催され、遅延処理を拒否し、またはデフォルトの応答モードを返します。

同時セマフォパッケージは、簡単なことから易于理解、広く使用されています。あなただけの十分にテストすることなく、簡単なコードネチズンシェアを使用したい場合は、その後、あなたはそれを見て映画を送ることができます:「障害がノック来るとき」

我々はfinallyブロックに親密放し、次の簡単なコードを見て取得し、みかんのペアが同じ運命をアヒル解放し、すべてが非常に調和のとれたです。
約100ミリ秒かかり1)アナログサービス要求、
2)5つのせる処理スレッド5 3)がそれぞれ終了し、同じ時間を表すパラメータを取得するには、この特定の出力待ち時間と、実行に時間がかかります

私たちは、メソッドREQを実行するために1000年のスレッドを開始します。

SemaphoreLimiterBadChecker limiter = new SemaphoreLimiterBadChecker();
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 1000; i++) {
    executor.submit(() -> {
        while (true) {
            System.out.println(limiter.req());
        }
    });
}
复制代码

ここでの結果です。

我々はインターフェイスが、我々は唯一の100ms、実際の実行時間がかかりますが、はるかに長く、そして失敗しなかった事態が発生し、見ることができます。少し長い時間を実行し、多数のスレッドがで見つけることができる饿死状態。フェアロックに変更すると、状況は改善されません。

それはのせいです。

その理由はあります。(Tomcatなど)リソースウェブ端は限られています。私たちの絞りロールを作成しますが、実際の要求は、時間の同時処理能力よりも高い場合には、このような状況は徐々にスレッドブロックを転送します。:サーバーの応答は以下の手順があり
1)圧力、通常、通常のサービス、通常の時間がかかります。
2)圧力上昇が、サービスは不正競争、時折、通常時間のかかる要件の使用をロックし、大規模なタイムアウトを開始しました。
3)圧力が増加し続け、サーバはほとんど、仮死状態に入らない新しい要求を受け入れ始めます。

クライアントのパフォーマンス、迅速なサービスが登場していない、また割り込み要求をどちらを扱うことができない、すべての要求をしています转圈Tomcatの接続数やスレッド数を増加し続ける、と多くの役割を果たしています。


acquire変更tryAcquireそれでも問題を解決することはできません。tryAcquireは、ブール型を返す障害がダウンまだある場合、最終的ブロックを含む、行うことができます。そこウール?

if(!tryAcquire()){
    return TOO_MANY_REQUESTS;
}
复制代码

裁判官の上に多くを支払う、これが正しい道です。tryAcquireもタイムアウトパラメータを追加することができ、すぐに呼び出し側が無期限に待機することはできません失敗、しかし、合理的な応答時間の制御要求の成功を返しません。

响应时间=超时时间+业务处理时间
复制代码

具体的には、春を取る、あなたがすることができますpreHandle。このライセンスで取得し、その後postHandleにそれを解放、あなたはまた、セマフォリメイクするために、特定の周波数でタイマーを使用することができます。

もちろん、あなたが異なって処理する必要があります。
1は、上記のWebサービスと同様に、サービスの直接拒否することができます。迅速な対応が重要である
などのスパイク、受注、いくつかのように、キューによって解決することができるか(の一部)を待って、2
良い方法かもしれ無期限に待機し、何のための需要が存在しない場合、私が思うに、ニュース消費量として、3
4ほとんどの非本質的な業績のために、直接バックいくつかのデフォルト値を使用し、効果が非常に良くなります。それが制限されますが、乾燥したライブを吹き飛ばされているが

ユーザーは区別するために注意を払う必要があります。

終わり

非常に奇妙なJavaの抽象CyclicBarrierを利用シナリオは非常に(比較的)高いが、制限のない一般的な方法ではありません、です。アナログ信号の量は、このプロセスを達成することができますが、それはエラーには余りにも起こしやすい、非常に友好的ではありませんが。コントロールは、(非分散)優れている、我々は今後の記事やグアバのコンポーネントの使用を制限して、それを議論するために来ます。

多く:

ウォームアップなしで、高い並行性、高い同時呼び出しを呼び出していません。

この高可用性、私はしないでください!

996報酬を残すバランス、危険な運転、

JAVAのマルチスレッド使用シナリオと考慮事項シンプルバージョン

おすすめ

転載: juejin.im/post/5d19f14651882579ec7b04db