lvncerpedia

Hitory

参考

まず全体の流れから見てみて。

時代         ~年代        キーワード
─────────────────────────────────────────────────────
LAMP時代     ~2005        静的・シンプル・1サーバー完結
Web2.0時代   2005~2010    Ajax・動的・UGC爆発
クラウド夜明け 2008~2013   仮想化・スケールアウト・API
コンテナ革命  2013~2018    Docker・マイクロサービス・CI/CD
混沌の現代    2018~        K8s・サーバーレス・IaC・何でもあり

LAMP時代(〜2005年頃)

[ ブラウザ ]
     ↓ HTTP
[ Apache ]  ← Linux上で動く
     ↓
[ PHP ]  ← リクエストのたびにHTML生成
     ↓
[ MySQL ]

Linux + Apache + MySQL + PHP の4つの頭文字。 これが「LAMP」ね。

  • サーバーは物理1台(でかい箱)
  • デプロイ = FTPでファイル上書き(!)
  • スケールしたければもっと高いサーバー買う(スケールアップ)
  • セッション・状態・全部そのサーバーに依存

シンプルだけど、逆に言うと「サーバー落ちたら終わり」だった笑

Web 2.0 の波(2005〜2010年頃)

YouTubeやGmailが登場して「ページ遷移しないUI」が求められ始めた。

Before:  ボタン押す → ページ全体リロード → 白くなる → 表示
After:   ボタン押す → こっそりサーバーと通信 → 部分更新
                           ↑
                         Ajax
                    (Asynchronous JavaScript and XML)
  • jQuery(2006)が流行って JS 書くのが楽になった
  • Ruby on Rails(2004〜)が「設定より規約」で爆速開発を実現
  • ユーザーが投稿・生成するコンテンツ(UGC)が爆発
  • → DBが激重になる問題が顕在化

クラウド夜明け(2008〜2013年頃)

物理サーバー買うのしんどすぎ問題を解決したのが AWS(2006〜)。

Before(物理時代):
  需要急増 → サーバー発注 → 1ヶ月待つ → 届く → 設定 → やっと対応

After(クラウド時代):
  需要急増 → API叩く → 5分でサーバー増える

仮想化技術(VMware等)のおかげで1台の物理サーバーを複数の「仮想サーバー」に分割できるようになった。

同時期に起きたこと:

出来事意味
NoSQL登場(MongoDB, Redis等)RDBだけじゃなくなった
水平スケールの一般化安いサーバーをたくさん並べる発想
APIエコノミーサービス同士をAPIで繋ぎ合わせる
DevOpsという概念開発と運用を一緒にやろうよ

コンテナ革命(2013〜2018年頃)

Docker(2013)の登場が全てを変えた。

仮想マシン(VM):
┌─────────────────┐
│   アプリ        │
│   OS(ゲスト)  │  ← まるごとOSが乗る → 重い・遅い
│   ハイパーバイザ │
│   OS(ホスト)  │
└─────────────────┘

コンテナ:
┌─────────────────┐
│   アプリ        │
│   必要なものだけ │  ← OSカーネルは共有 → 軽い・速い
├─────────────────┤
│   OS(ホスト)  │
└─────────────────┘

Dockerの何がすごかったかというと:

「自分のMacで動いたのに本番で動かない」問題が消えた

コンテナに環境ごと詰め込むから、どこでも同じ動作が保証される。

で、コンテナが増えすぎた→ Kubernetes(K8s, 2014/Google)登場。

コンテナが100個あったとして...
「どのサーバーで動かす?」
「落ちたら自動で復活させて」
「負荷に応じて増やして」
      ↑
   全部K8sがやってくれる

マイクロサービス化(同時期)

Dockerが普及すると「機能ごとにサービスを分割しよう」という思想が広まる。

LAMP時代(モノリス):          マイクロサービス時代:

┌──────────────────┐          ┌──────┐ ┌──────┐ ┌──────┐
│                  │          │ 認証 │ │ 決済 │ │ 通知 │
│  ログイン機能      │          └──┬───┘ └──┬───┘ └──┬───┘
│  決済機能        │             │         │         │
│  通知機能        │          ┌──▼─────────▼─────────▼──┐
│  検索機能  全部  │          │      APIゲートウェイ      │
│  推薦機能  一緒  │          └─────────────────────────┘
│  ...             │
└──────────────────┘

メリット:独立してデプロイ・スケールできる デメリット:ネットワーク越しの通信が増えて複雑化←これが混沌の源泉の一つ

😵 混沌の現代(2018〜)

いろんな解決策が生まれすぎて、逆に選択肢が爆発した。

                        モダンスタック選択肢の森

フロントエンド:  React / Vue / Next.js / Nuxt / Svelte / Astro / ...
バックエンド:    Node / Go / Rust / Python(FastAPI) / ...
DB:             PostgreSQL / MySQL / MongoDB / Redis / DynamoDB / ...
インフラ:       AWS / GCP / Azure / Vercel / Fly.io / ...
コンテナ管理:   K8s / ECS / Cloud Run / ...
サービス間通信: REST / GraphQL / gRPC / tRPC / ...
CI/CD:          GitHub Actions / CircleCI / ArgoCD / ...
監視:           Datadog / Prometheus + Grafana / ...
IaC:            Terraform / Pulumi / CDK / ...
認証:           自前 / Auth0 / Cognito / Clerk / ...

さらにサーバーレスという概念も登場。

従来:
  サーバーを「常に」起動しておく → アクセスなくても課金

サーバーレス(例: AWS Lambda):
  リクエストが来たときだけ関数が起動 → 使った分だけ課金
  ※「サーバーがない」わけじゃなく「サーバーを意識しない」

まとめ:なんで混沌になったの?

問題が生まれる → 解決策が登場 → 解決策が増えすぎる → 新たな複雑性
     ↑                                                       │
     └───────────────────────────────────────────────────────┘
                       これの繰り返し
時代主な「困った」生まれた解決策
LAMPサーバー高い・遅いクラウド・仮想化
クラウド環境差異・デプロイ大変Docker・コンテナ
コンテナコンテナ多すぎ管理できんKubernetes
K8s設定多すぎ複雑すぎサーバーレス・マネージドサービス
全体選択肢多すぎどれ選ぶの……(現在進行形)