🏬 プロジェクト概要
当社にとって非常にチャレンジングな案件でした。
限られたハードウェア資源と、当時としては非常に大きなトラフィックという制約のなかで、技術と知恵を駆使して安定稼働を実現しました。その後のプロジェクトの基盤となった案件です。
25年以上前の案件ですが、そこで培った設計思想は、現在の高負荷システムの支援にも活きています。
| 項目 | 内容 |
|---|---|
| 業種 | 大手量販店(小売・EC) |
| カテゴリ | B2C ECサイト |
| 時期 | 2000年 |
| 技術領域 | 負荷分散、キャッシュ戦略、在庫データ連携、オンプレミス |
| 目的 | 高負荷に耐えるECサイトの構築と安定運用 |
| 契約 | 受託開発 |
| 担当領域 | 要件定義 〜 運用支援 |
🔍 課題
-
サイトパフォーマンス
大量アクセスが想定されていたため、何よりもWebページを速く表示することを考えていました。
具体的には、どのページも1秒以下(目標は200ms以下)としました。
数万ユニークユーザーの同時アクセスが想定されるため、データベースを直接接続すると、ボトルネックになることはわかっていました。
そこで表示すべきコンテンツデータをエンドポイントに近いところに分散して持つことで、大量アクセスでもレスポンスを維持することができました。 -
大量の在庫データの連携
在庫データは基幹システムで一元管理しており、更新都度サブシステムに配信する仕組みとなっていました。
在庫データが大量に送信されてきて、そのデータをデータベースへ更新し、Webで在庫を反映する必要がありました。 -
サーバー調達の制約
当時、クラウドのように「動的にサーバーを追加する」ということができなかったため、サーバーの調達には1ヶ月程度かかりました。
想定アクセスを算出し、サーバーのトラフィックを計算、ピークを考慮してサーバー台数を見積もりました。
サーバーは4Uの巨大な筐体でしたが、4C/4GBメモリと、今考えると非常に小さいものでした。
このCPU・メモリリソースを最大限活用して、トラフィックを支えました。
🛠️ 解決への道筋
-
負荷分散(ロードバランサー / CDN)
ロードバランサーとCDNを組み合わせ、トラフィックを最適に分散。画像やJavaScript、CSSファイルなどの静的コンテンツの配信を高速化しました。 -
キャッシュ戦略の最適化
商品情報や検索結果など、アクセス頻度の高いデータを多段キャッシュで最適化し、DB負荷を大幅に削減しました。
キャッシュの構成は、ブラウザキャッシュ、アプリケーションメモリキャッシュ、ファイルシステムとしました。
当時は、まだ Redis のような KVS はありませんでしたが、それに近いことをファイルシステムで実現しました。 -
アプリケーションのパフォーマンスチューニング
Webアプリケーションは Java で構築していましたが、GC(ガベージコレクション)による停止がレスポンスに直結します。
特に長時間の停止を伴う Full GC が発生すると、目標としていた 200ms 以下を守ることができません。
実際、Full GC が発生すると 約4秒 かかり、その間アプリケーションが完全に停止してしまいました。
数万ユニークユーザーの同時アクセスを想定していたため、この4秒の停止はサイト全体の応答停止に直結します。
そこで、オブジェクトをいたずらに長期保持せず、不要になったデータをこまめに解放する実装を徹底しました。
一度に大量のメモリを解放するのではなく、処理の節目ごとに小さく解放していくことで、オブジェクトが Old 領域へ昇格しにくい状態を保ち、Full GC の発生そのものを抑え込みました。
ヒープサイズやGC方式の設定とあわせて、この「細かく解放する」設計が、限られた 4GB メモリでも安定したレスポンスを支えました。 -
データベースのボトルネック
データベースの同時接続数は 800 でした。前段のバッチ処理もあるためすべての接続を使い切ることはできませんでした。
データベースをレプリケーションしてレプリカ(スレーブ)サーバーを用意することも考えましたが、Webの同時アクセスを受け止めることができないと判断しました。 -
在庫データの同期設計
実店舗の在庫をECサイトで確認できるようにしました。
商品点数100万点以上の在庫データの連携は、本当に大変でした。
在庫データをWebサーバーに近い場所に配置することで、リアルタイムでの連携を実現しました。
🧰 使用技術
- ロードバランサー / CDN — トラフィックの分散と静的コンテンツ配信の高速化
- 多段キャッシュ — ブラウザキャッシュ、アプリケーションメモリキャッシュ、ファイルシステム
- 在庫データ同期 — 基幹システムとWeb間の在庫データ連携
- データベース — 同時接続 800 を前提とした負荷分散と接続制御
- アプリケーション・チューニング(Java) — Full GC を避けるためのこまめなメモリ解放とGC制御
- オンプレミス基盤 — 4Uサーバーによるスケールアウト設計
📈 成果
- すべてのページを 1秒以下で配信できることを実現
- お客様に快適な Webアクセスを提供し、満足度を向上
- アーキテクチャを変えずにサーバー増強を実現
- アクセス過多によるサーバー不具合を解消し、EC販売に注力
🔗 関連サービス・関連技術
💡 ポイント
負荷対策は「とにかくサーバーを増やす」ことではありません。
アクセスの特性を理解し、データのトラフィックを設計して、キャッシュ・DB・API・スケーリングを組み合わせて設計することが、安定性を実現する鍵になります。
PLAY TECHNOLOGY では、ECサイトをはじめとする高負荷システムの構築・運用支援を行っています。同様の課題をお持ちの方は、ぜひお問い合わせください。