Stack Map新人 Web エンジニアの地図

サービスが育つと、「遅い」「落ちる」に出会います。
まず測って、どこで時間を使っているかを知り、キャッシュ・キュー・台数・データベースの順に手を打ちます。キャッシュと待ち行列は、押して試せます。

まず測る(当て推量で直さない)

遅いと感じたら、直す前に測ります。平均だけを見ると、一部の人がとても待っていることに気づけません。下の目印を押して、見え方の違いを比べてください。

100 回の頼みの、返事の時間(作り物)

どこで時間を使っているか

見る道具

キャッシュ(覚えておいて、すぐ返す)

同じ答えを何度も作らずに、覚えておいて返す仕組みです。いちばん効く手ですが、古い答えを返す・ほかの人に見える、という事故の元にもなります。利用者に近い所から順に並べました。

体験: キャッシュの効き目

ランキングのページに、10 秒ごとに頼みが来ます(2 分で 12 回)。外れると、データベースで集計し直して 800ms。当たると、覚えていた答えを返して 15ms。65 秒のところで、ランキングの元のデータが変わります。数字は作り物

キャッシュの期限

    新しくする 3 つのやり方

    キャッシュの事故

    重い処理は裏に回す(キュー)

    CSV の取り込みやメールの送信のように時間のかかる仕事は、頼みの中でやらずに、キューに入れて裏で動かします。画面には、すぐ返事を返せます。

      Laravel のジョブ

      台数を増やす(スケール)

      1 台で足りなくなったら、大きくするか(縦)、台数を増やすか(横)です。横に増やすには、アプリを「どのサーバーで動いても同じ」に作っておく必要があります。

      利用者
      ロードバランサー振り分ける・ヘルスチェック
      アプリ 1アプリ 2アプリ 3
      セッションRedis・データベースデータデータベースファイルS3 などの置き場

      アプリのサーバーには何も残さない。残すものは、全部の台から見える外の置き場へ。

      待ち行列の直感(忙しさと待ち時間)

      サーバーが忙しくなるほど、待ち時間は「少しずつ」ではなく「急に」増えます。来る数を動かして、グラフの点がどこで跳ね上がるかを見てください。

      1 台が 1 秒にさばける数
      台数(来る頼みを均等に分ける)

      縦: ひまなときの何倍待つか 横: 使用率

      使用率と待ち時間の関係のグラフ。使用率が 100% に近づくと、待ち時間が急に増える。

      データベースのスケール

      アプリの台数は増やしやすいのに、データベースはそうはいきません。まず SQL とインデックスを見直し(データベースのタブ)、それでも足りないときに、次の手を考えます。

      負荷試験(わざと負荷をかけて、限界を知る)

      本番で困る前に、わざと負荷をかけて、どこまで耐えられるかを確かめます。小さい負荷から始めて、だんだん量と時間を増やします。

      k6 の台本の例

      回数制限で守る

      1 人(1 つの IP)からの頼みすぎを止めて、ほかの利用者を守ります。攻撃や、こわれたプログラムの連打への備えにもなります。

      超えたら 429

      決めた回数を超えると、Laravel が自動で 429(Too Many Requests)を返します。呼ぶ側は、少し待ってから送り直します。

      Web「状態コード」→

      セキュリティ「サービス妨害」→

      API「よい設計の決まりごと」→

      AI 時代AI の API の、速さと費用

      AI の API は、返事に数秒かかることがあり、使った量(トークン)で料金がかかります。速さと費用を、最初から設計に入れておきます。

      性能のチェックリスト

      「遅い」「落ちる」に手を打つ前と、出す前に、確かめたものに印を付けてください(この端末にだけ保存されます)。