SpringBoot は同時にいくつのリクエストを処理できますか?
Text
SpringBoot のデフォルトの組み込みコンテナが Tomcat であることは誰もが知っています。つまり、プログラムは実際には Tomcat で実行されます。したがって、SpringBoot が処理できるリクエストの数ではなく、Tomcat が処理できるリクエストの数が重要です。
Tomcat のデフォルト構成は spring-configuration-metadata.json
ファイルにあり、対応する構成クラスは org.springframework.boot.autoconfigure.web.ServerProperties
。
#処理されたリクエストの数に関連するパラメータは 4 つあります:
server.tomcat.threads.min-spare: ワーカー スレッドの最小数。デフォルトのサイズは 10 です。このパラメーターは長期ワーカーと同等であり、同時リクエストの数が 10 に達しない場合、これらのスレッドが順番に使用されてリクエストが処理されます。 server.tomcat.threads.max: ワーカー スレッドの最大数。デフォルトのサイズは 200 です。このパラメータは一時ワーカーに相当し、同時リクエスト数が 10 ~ 200 の場合、これらの一時ワーカー スレッドが処理に使用されます。 server.tomcat.max-connections: 接続の最大数、デフォルトのサイズは 8192 です。 Tomcat が処理できるリクエストの最大数を示します。8192 を超えるリクエストは待機キューに入れられます。
server.tomcat.accept-count: 待機キューの長さ。デフォルトのサイズは 100 です。
これらのパラメータ間の関係を説明する例を示します。
Tomcat をレストランに例えると、リクエストは次のようになります。実際にはゲストに相当します。 min-spare はシェフ (正社員)、max はシェフ (正社員と臨時従業員) の総数、max-connections はレストランの座席数、accept-count は入り口にある小さなベンチの数です。 。来客者を優先して店内に座り、その後シェフが仕事を始める 長期勤務者が仕事を終えられる場合は長期勤務者に任せる 長期勤務者が仕事を終えることができない場合は長期勤務者に任せる、派遣社員にやってもらいましょう。写真にはシェフが15人いますが、店内は30席あるので、今20人来たら先に5人が店内で待つことになります。今 35 人が来てレストランに空きがない場合、最初に 5 人が入り口に座るように求められます。 50人来たらホテルの入り口に40席と小さなベンチがあるので10人は帰ることになります。
つまり、SpringBoot が同時に処理できるリクエストの最大数は max-connections accept-count
であり、この数を超えるリクエストは直接破棄されます。
私が知っているのは、この件は詳細に実行する必要があるということだけです。
上記は単なる理論上の結果です。次に、小さな実践的な例を使用して、これが事実であるかどうかを示してみましょう:
SpringBoot プロジェクトを作成し、application.yml パラメーターでこれらを構成します。デフォルトの数値は大きすぎてテストが難しいため、小さい値に設定します:
server: tomcat: threads: # 最少线程数 min-spare: 10 # 最多线程数 max: 15 # 最大连接数 max-connections: 30 # 最大等待数 accept-count: 10
シンプルなインターフェイスを作成しましょう:
@GetMapping("/test") public Response test1(HttpServletRequest request) throws Exception { log.info("ip:{},线程:{}", request.getRemoteAddr(), Thread.currentThread().getName()); Thread.sleep(500); return Response.buildSuccess(); }
コードは非常に単純で、スレッド名を出力するだけです。その後、0.5 秒間スリープします。これにより、確実にいくつかのリクエストが一度に処理され、待機キューに入ります。
次に、Apifox を使用して 100 のリクエストをシミュレートするテスト ケースを作成しました。
#テスト結果を観察します。
結果からわかるように、設定された max-connections accept-count の合計は 40 であるため、60 個のリクエストが破棄され、これは予想と一致しています。最大スレッドは 15 であるため、最初に 25 個のリクエストが待機され、最初の 15 個が処理された後に 15 個が処理され、最後に 10 個が処理されます。つまり、40 個のリクエストは 3 つのバッチに分割されます。 15、15、10.を扱います。
#コンソールの印刷ログから、最大スレッド数が 15 であることがわかります。これは、前の考えを裏付けるものでもあります。
要約すると、: 同時リクエストの数が server.tomcat.threads.max よりも少ない場合、それはすぐに処理され、超過したリクエストは待機されます。その数が max-connection と accept-count の合計を超えた場合、超過分は直接破棄されます。
拡張: 同時実行の問題がどのように発生するか
これまでのところ、SpringBoot が同時に処理できるリクエストの数を把握しました。ただし、ここでは上記の例に基づいて拡張したいと思います。同時シナリオの一部の値が予想したものと異なるのはそのためです。
设想有以下场景:厨师们用一个账本记录一共做了多少道菜,每个厨师做完菜都记录一下,每次记录都是将账本上的数字先抄到草稿纸上,计算x+1等于多少,然后将计算的结果写回到账本上。
Spring容器中的Bean默认是单例的,也就是说,处理请求的Controller、Service实例就只有一份。在并发场景下,将cookSum定义为全局变量,是所有线程共享的,当一个线程读到了cookSum=20,然后计算,写回前另一个线程也读到是20,两个线程都加1后写回,最终cookSum就变成了21,但是实际上应该是22,因为加了两次。
private int cookSum = 0; @GetMapping("/test") public Response test1(HttpServletRequest request) throws Exception { // 做菜。。。。。。 cookSum += 1; log.info("做了{}道菜", cookSum); Thread.sleep(500); return Response.buildSuccess(); }
以上がSpringBoot は同時にいくつのリクエストを処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Jasypt の概要 Jasypt は、開発者が最小限の労力で基本的な暗号化機能を自分のプロジェクトに追加できる Java ライブラリであり、暗号化の仕組みを深く理解する必要はありません。一方向および双方向暗号化の高いセキュリティ。標準ベースの暗号化テクノロジー。パスワード、テキスト、数値、バイナリを暗号化します... Spring ベースのアプリケーション、オープン API への統合、JCE プロバイダーでの使用に適しています... 次の依存関係を追加します: com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1 Jasypt の特典はシステムのセキュリティを保護し、コードが漏洩した場合でもデータ ソースは保証されます。

1. Redis は分散ロックの原則を実装しており、分散ロックが必要な理由 分散ロックについて話す前に、分散ロックが必要な理由を説明する必要があります。分散ロックの反対はスタンドアロン ロックです。マルチスレッド プログラムを作成するとき、共有変数を同時に操作することによって引き起こされるデータの問題を回避します。通常、ロックを使用して共有変数を相互に除外し、データの正確性を確保します。共有変数の使用範囲は同じプロセス内です。共有リソースを同時に操作する必要があるプロセスが複数ある場合、どうすれば相互排他的になるのでしょうか?今日のビジネス アプリケーションは通常マイクロサービス アーキテクチャであり、これは 1 つのアプリケーションが複数のプロセスをデプロイすることも意味します。複数のプロセスが MySQL の同じレコード行を変更する必要がある場合、順序の乱れた操作によって引き起こされるダーティ データを避けるために、分散が必要です。今回導入するスタイルはロックされています。ポイントを獲得したい

使用シナリオ 1. 注文は正常に行われましたが、支払いが 30 分以内に行われませんでした。支払いがタイムアウトになり、注文が自動的にキャンセルされました 2. 注文に署名があり、署名後 7 日間評価が行われませんでした。注文がタイムアウトして評価されない場合、システムはデフォルトでプラスの評価を設定します 3. 注文は正常に行われます。販売者が 5 分間注文を受け取らない場合、注文はキャンセルされます。 4. 配送がタイムアウトします。 SMS リマインダーをプッシュします... 遅延が長く、リアルタイム パフォーマンスが低いシナリオでは、タスク スケジュールを使用して定期的なポーリング処理を実行できます。例: xxl-job 今日は選択します

Springboot はファイルを読み取りますが、jar パッケージにパッケージ化した後、最新の開発にアクセスできません。jar パッケージにパッケージ化した後、Springboot がファイルを読み取れない状況があります。その理由は、パッケージ化後、ファイルの仮想パスが変更されるためです。は無効であり、ストリーム経由でのみアクセスできます。読み取ります。ファイルはリソースの下にあります publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

SpringBoot と SpringMVC はどちらも Java 開発で一般的に使用されるフレームワークですが、それらの間には明らかな違いがいくつかあります。この記事では、これら 2 つのフレームワークの機能と使用法を調べ、その違いを比較します。まず、SpringBoot について学びましょう。 SpringBoot は、Spring フレームワークに基づいたアプリケーションの作成と展開を簡素化するために、Pivotal チームによって開発されました。スタンドアロンの実行可能ファイルを構築するための高速かつ軽量な方法を提供します。

1. RedisAPI のデフォルトのシリアル化メカニズムである RedisTemplate1.1 をカスタマイズします。API ベースの Redis キャッシュ実装では、データ キャッシュ操作に RedisTemplate テンプレートを使用します。ここで、RedisTemplate クラスを開いて、クラスのソース コード情報を表示します。publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations、BeanClassLoaderAware{//キーを宣言、値の各種シリアル化メソッド、初期値は空 @NullableprivateRedisSe

Springboot+Mybatis-plus が SQL ステートメントを使用して複数テーブルの追加操作を実行しない場合、私が遭遇した問題は、テスト環境で思考をシミュレートすることによって分解されます: パラメーターを含む BrandDTO オブジェクトを作成し、パラメーターをバックグラウンドに渡すことをシミュレートします。 Mybatis-plus で複数テーブルの操作を実行するのは非常に難しいことを理解してください。Mybatis-plus-join などのツールを使用しない場合は、対応する Mapper.xml ファイルを設定し、臭くて長い ResultMap を設定するだけです。対応する SQL ステートメントを記述します。この方法は面倒に見えますが、柔軟性が高く、次のことが可能です。

プロジェクトでは、構成情報が必要になることがよくありますが、この情報はテスト環境と本番環境で構成が異なる場合があり、実際のビジネス状況に基づいて後で変更する必要がある場合があります。これらの構成をコードにハードコーディングすることはできません。構成ファイルに記述することをお勧めします。たとえば、この情報を application.yml ファイルに書き込むことができます。では、コード内でこのアドレスを取得または使用するにはどうすればよいでしょうか?方法は2つあります。方法 1: @Value アノテーションが付けられた ${key} を介して、構成ファイル (application.yml) 内のキーに対応する値を取得できます。この方法は、マイクロサービスが比較的少ない状況に適しています。方法 2: 実際には、プロジェクト、業務が複雑な場合、ロジック
