📖

エンドポイント設計でパフォーマンスを重視するには

に公開

1.データ取得を効率化する
クライアントが必要なデータのみを取得できるようにする

・フィールド選択

GET /users?fields=name,email

・ページネーション
大量のデータを取得する際にはページごとに分割して返す
(例:ECサイトで1ページに20商品のみ表示している場合など)

GET /users?page=1&limit=20

・絞り込み
クエリパラメータでデータを絞り込む機能を提供

GET /users?status=active&age=20-30

ソート
クライアントがデータを並べ替えるリクエストを送れるようにする

GET /users?sort=created_at:desc

2.レスポンス設計
JSONフォーマットを軽量化する
不要なデータや深いネストを避ける
キャッシュの活用
HTTPヘッダー

Cache-Control:レスポンスがキャッシュ可能かどうか、どのくらいの期間キャッシュできるかなどを指定する
クライアントや中間キャッシュ(ブラウザ、プロキシサーバーなど)がレスポンスを保存して再利用できるようにするための設定です

ETag(Entity Tag):リソースの変更をトラッキングし、未変更の場合は304を返す
Etagヘッダーは、リソースの特定のバージョンを識別するために使われる一意の識別子(トークン)です。
クライアントがサーバーにリクエストを送る際、以前取得したリソースのEtagを送信し、サーバー側でリソースが変更されているのかを確認する
→リソースが変更されていない場合:HTTPステータスコード304 Not Modifiedを返す(ボディは送信しないため、データの通信量を削減)
リソースが変更されている場合:新しいデータと更新されたEtagを返す
※静的リソースや頻繁に変わらないリソースに特に有効(ユーザーのプロフィールデータやAPIレスポンス)

3.データ通信の最適化
圧縮の利用
サーバーでGzipやBrotliを有効にして、レスポンスサイズを削減します。これにより通信速度が向上します。

バッチリクエスト
複数のリクエストを一つにまとめて処理する機能を提供します。

POST /batch
{
  "requests": [
    { "method": "GET", "endpoint": "/users/1" },
    { "method": "GET", "endpoint": "/orders/123" }
  ]
}

遅延ロード
全てのデータを一度に取得するのではなく、必要なときにデータを取得する。
特に無限スクロールのようなUIに適している

4.サーバーサイドの最適化
データベースクエリを効率化する
適切なインデックスを設定して、検索速度の向上を図る
必要なデータのみを取得するクエリを使用する

キャッシュの利用
頻繁にリクエストされるデータは、メモリキャッシュに保存する。
これによりデータベースへのアクセス頻度を削減することができる。

並列処理と非同期処理
非同期でバックエンド処理を行うことで、リクエストに早く応答することができる。

5.レート制限とスケーラビリティ
レート制限
クライアントが一定時間内に送信できるリクエスト数を制限してサーバー過負荷を防ぐ。

ロードバランシング
複数のサーバーでリクエストを分散処理することで、負荷を軽減し、スケーラビリティを確保する

6.モニタリングと最適化
ログ解析
APIの使用状況を記録
パフォーマンスツールの使用
New RelicなどでAPIの動作状況を監視
負荷テスト
Apache JMeterを使い、システムの負荷に対する耐性を確認

Discussion