WEBアプリ構築においてフロントエンジニアの方はタイムアウト設計が特に重要になってきます。
それは通信やサーバの状態など非機能要件に何かが起きたときに、処理に時間がかかりすぎる。ということが多く発生するからです。
そうなった時に正しくタイムアウトを設計していないと、最悪のケースだとサーバダウンなどサービス停止に追い込まれます。
今回、一般的なタイムアウトの考え方と、どう設計すべきかを解説していきます。
タイムアウトとは
タイムアウトとは、アプリケーションが処理を開始してから終了するまでの時間をセッション単位にタイマ制御し、その時間を越えた場合に処理を中断して、エラーを返却することを言います。
上図のように処理を途中で中断し、タイムアウトエラーを意図的に発生させます。
タイマ制御の設定はなぜ必要なのか
タイマ制御が必要な理由の1つとして、長時間
かかる処理(セッション)が存在すると、そのセッション分のリソースを占有し続けることになります。
例えば、会員サイトにログインする時に延々に通信中の画面が表示される経験はありませんか?
この状況はサーバのリソースを消耗している状態です。例えばそこに100アクセスきたとしたら100アクセス分のリソースを蓄積していくことになります。 これは相当な負荷がかかりやがてサーバダウンに繋がりますね。
そこで一定時間ログインを試みて処理が完了しない場合にタイムアウトエラーとしてエラーを返却してしまえば、そのセッション分リソースが解放されることになります。
なのでサーバダウンなど最悪な事態は回避できる可能性があがります。
タイムアウト設計の考え方
では、実際にどのように考えてタイマ制御を設定していけばいいのか解説していきます。
基本的に下図のようにアクセス元から大きい時間を設定し、徐々に時間を短くしていきます。
あくまでWEBアプリの構成の一例を切り出しただけですので、それぞれ環境に置き換えて考えていただければ問題ありません。
なぜ外から大きくするかというと、例えばWEBアプリ⇒データベース間のタイムアウト値が一番大きな値だとしたら、WEBコンテナがタイムアウトを検知してクライアントに返却したとしても、WEBアプリとデータベースは処理をし続けてしまうからです。
この場合データベースのリソースを奪われ続けることになりますし、クライアントにはエラーを返却しているのに、データベースは正常に更新されてしまいます。
クライアントから徐々にタイムアウト時間を短く設定する。
という考え方が基本となりますので是非覚えといてください。
タイムアウトを設定する理由
以上がタイムアウトを設定する理由になります。ミドルウェアからアプリケーションまで考慮して設計するのは面倒ですが、ミッションクリティカルなシステムを開発しているとかなり重要な要素でもありますので、ぜひタイムアウト設計を担当した際はこの考えを留意していただければと思います。
コメント