【efw紹介】高負荷対応のTomcat環境構築

# WEBシステムの「同時接続」ってなに？

同時接続という言葉は、WEBシステム開発によく触れますが、定義不明のまま乱用されるケースがよくあります。今回はちょっと関連用語を含んで、厳密な定義を作ってみます。

<table>
<tr><th>項目</th><th>説明</th></tr>
<tr><td>最大ログインユーザ数</td><td>
ログイン後、セッション情報を作成され、一定メモリを占められます。システムの方式により、セッションメモリが大きい場合、セッションタイムアウト期間内ログインするユーザの数を注意する必要です。
</td></tr>
<tr><td>最大同時接続数</td><td>
TCP接続は、「Established」から「Closed」までの間、「接続中」と見なします。ある時点で、接続中のコネクションの数は同時接続数です。一回画面操作で２つの接続が発生します。※jspと各種静的コンテンツ。出力完了後、１５秒接続を維持します。

最大同時接続数を超える場合、サーバは接続のリクエストを受け入れないから、「このサイトにアクセスできません」のエラーが発生します。※404ではありません。
</td></tr>
<tr><td>最大同時実行数</td><td>
サーバが同時に処理できるリクエストの数。
</td></tr>
<tr><th colspan=2>＜よういスタートの場合＞※展示会、説明会、セミナーなど
</th></tr>
<tr><td>同時１回しかない操作</td><td>
エラーなし操作できる人の可能数＝最大同時接続数／２
</td></tr>
<tr><td>連続に１秒１回ずつ操作 ※１秒以内の軽い処理、</td><td>
エラーなし操作できる人の可能数＝最大同時接続数／２／１５
</td></tr>
<tr><td>連続に１秒１回ずつ操作 ※重い処理、</td><td>
エラーなし操作できる人の可能数＝min( 最大同時実行数 , 最大同時接続数／２／１５ )
</td></tr>
</table>

# システム概念図
以下のシステム概念図は、efwアプリ+tomcatで高負荷対応時各種設定情報の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/df8dab56-a05f-4133-54f4-8f1ee9367619.png)
<table>
<tr><th>項目</th><th>デフォルト</th><th>説明</th></tr>
<tr><td>ListenBackLog</td><td>
Window32/64: 200<br>
Solaris32/64,Linux32/64: 511<br>
</td><td>
TCPコネクションが確立しているリクエストをキューイングする接続待ちキューの最大数
接続待ちキューの最大数の指定範囲
Window32/64: 1～200
Solaris32/64,Linux32/64: 1～2147483647
</td></tr>
<tr><td>MaxClients</td><td>256</td><td>
応答することのできる同時リクエスト数
</td></tr>
<tr><td>ServerLimit</td><td>256</td><td>
Apache プロセス稼働中における MaxClients に設定可能な上限値を設定すること、20000以下の制限がある
</td></tr>
<tr><td>maxConnections</td><td>
NIO: 10000<br>
NIO2: 10000<br>
APR/Native: 8192
</td><td>
任意の時点でサーバーが受け入れて処理する接続の最大数。値を-1に設定すると、maxConnections機能は無効になり、接続数はカウントされない。
</td></tr>
<tr><td>acceptCount</td><td>100</td><td>
可能なすべてのリクエスト処理スレッドが使用されているときに着信接続要求の最大キュー長。キューが満杯になったときに受信された要求は拒否される。
</td></tr>
<tr><td>maxthreads</td><td>200</td><td>
このコネクタがリクエスト処理対して作成するスレツドの最大数(最大同時実行数)。Executor属性を指定しないConnector属性はスレッドプールを構成する。
そのスレッドプールが処理待ちキューから実際にリクエスト処理をするスレッドの最大数。
</td></tr>
</table>

# 設定場所

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/16011ece-5704-a4fd-aad7-9bc96609647c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/f4901e2d-5af4-e18d-2465-ebc98d0d2736.png)

# システム概念図説明

クライアントから大量に接続される場合、
- まずApacheのListenBacklogキューに格納し、その中に1000接続をTomcatに渡します。
- Tomcatは、接続要求を受け取り、 Connectionキューに格納します。
- Connectionキューから100接続をAcceptキューに回して、処理します。
- Connectionキューに空きの分を、後続の接続要求で補います。
- Connectionキューの最大値を超えないようにするため、MaxClientsとmaxConnectionsの値を合わせます。

Connectionキューの接続要求をEFWフレームワークで処理する場合、
- 重い処理に対して、イベントごとに同時処理可能キューを設定します。キューの最大値に到達したら、エラーを戻します。
- 軽い処理に対して、同時処理可能キューを設定しません。

イベントキューの最大値到達エラーの場合2種類があります。
- リトライ可能に設定する場合、エラーメッセージを表示し、３０秒カウントダウンします。
- リトライ不可に設定する場合、エラーメッセージを表示するだけです。
<font color=red>「該当機能は混雑しています。しばらくお待ちください。」</font>

# ListenBackLogキューオーバー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/7b6d2e11-30dd-acc6-cf95-5ed3230fb2c8.png)

サーバの接続が満杯状態になっている時、新たに操作したら、左図のエラーメッセージが表示します。

# イベントキューオーバー（リトライ可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/cfdf6f2c-7b11-f4c6-b56e-568b42b9b9b3.png)

重い操作が制限になる時、左図のカウントダウンメッセージが表示します（30秒計）。リトライ可。

# イベントキューオーバー（リトライ不可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/2869ffb1-8cf1-6834-0096-63122f330eec.png)
操作が制限になる時、左図の混雑メッセージが表示します。リトライ不可。