【入門編】ドメインシャーディングによるHTTP/1.1の同時接続数制限回避 – HTTPプロトコル・通信規格実践ガイド

なぜ「同じ宛先に何度も並ぶ」のはダメなのか?HTTP/1.1のボトルネックをハックする「ドメインシャーディング」の正体

こんにちは!ネットワークの深淵を愛するエンジニアの皆さん、ようこそ。

今日は、Webブラウザの「同時接続数制限」という、ちょっと古くも愛おしい、そして現代のエンジニアなら一度は耳にするであろう「ドメインシャーディング」というテクニックについてお話しします。

「HTTP/1.1って何?」「ブラウザが勝手に通信を制限するの?」という疑問をお持ちの方も、大丈夫。郵便配達の例えを使って、一歩ずつ紐解いていきましょう。

—

1. HTTP/1.1の「郵便配達員」は一人しかいない?

HTTP/1.1というプロトコルは、Webサイトの情報を運ぶためのルールです。イメージしてください。あなたの目の前に、「一つのドメイン(例: example.com)に対して、一度に届けられる荷物は6つまで」という、厳格な郵便局のルールがあるとします。

ブラウザという配達員は、Webページを開くために画像やスクリプトをたくさん運ばないといけません。でも、ルール通りだと6つずつしか運べない。もしページに100個の画像があったら? 残りの94個は、前の6つが届き終わるまで、郵便局の窓口でずっと順番待ちをしなければなりません。

これが、HTTP/1.1でWebサイトの表示が遅くなる最大の原因の一つ、「HOLB (Head-of-Line Blocking)」という現象です。

2. 「それなら、別の郵便局を作ればいいじゃない!」

ここで当時のエンジニアたちが閃いたアイデアが「ドメインシャーディング(Domain Sharding)」です。

「1つのドメインにつき6つまでしか持てないなら、サブドメインをたくさん作って、それぞれ別の郵便局だと誤認させればいいのでは?」

  • `img1.example.com`
  • `img2.example.com`
  • `img3.example.com`

こうしてサブドメインを分けると、ブラウザは「おっ、これらは別の郵便局(別ドメイン)だから、それぞれ制限いっぱいまで荷物を運んでOKだな!」と判断します。結果として、6つ×3ドメイン=18個の荷物を同時に運べるようになり、ページ表示が劇的に速くなるというわけです。

—

3. 実践:ドメインシャーディングの構造

では、実際にWebサイトを構築する際、どのように設定するのか見てみましょう。といっても、難しいことはありません。CSSやHTMLで読み込むファイルの先頭(ホスト名)をバラけさせるだけです。

具体的なコード例





このように、画像などの静的コンテンツを複数のサブドメインに分散させます。

DNSとサーバーの設定(ヒント)

インフラ側で準備する際は、DNSの設定が必要です。

DNS設定のイメージ
img1.example.com. IN A 192.0.2.10 # サーバーAへ
img2.example.com. IN A 192.0.2.10 # 結局同じサーバーでもOK(ブラウザはドメイン名で判定するため)

サーバー側では、これらのドメインすべてに対して同じフォルダの中身を返すように「バーチャルホスト」の設定をしてあげれば完了です。

—

4. 注意点:やりすぎは「毒」になる

「じゃあ、サブドメインを100個作れば最強じゃない?」と思うかもしれませんが、それは大きな間違いです。

1. DNSの解決コスト: ドメインが増えるたびに、ブラウザは「このドメインの住所はどこ?」とDNSサーバーに聞きに行かなければなりません。これが意外と時間がかかります。
2. TCPコネクションのオーバーヘッド: HTTP/1.1では、ドメインごとにTCPという「通信の道」を確立する必要があります。道を作るたびに「握手(ハンドシェイク)」という手続きが必要になり、むしろ通信が遅くなるという本末転倒な事態に陥ります。

—

最後に:現代のネットワーク事情

実は、現在主流の「HTTP/2」や「HTTP/3」では、「1つのコネクションで同時にたくさんの荷物を運ぶ」という技術(ストリームの多重化)が標準搭載されています。そのため、現代のモダンな開発現場では、わざわざ複雑なドメインシャーディングを行う必要はありません。

しかし、古いシステムの保守や、低速なネットワーク環境下での最適化を考えるとき、この「ドメインシャーディング」という概念は、ネットワークのボトルネックを考える上で今でも非常に重要な「インフラの知恵」なのです。

ネットワークの世界に「正解」は一つではありません。その時々のプロトコルの限界を理解し、どうハックするか。それが、エンジニアとしての醍醐味ですよね。

それでは、また次回の記事でお会いしましょう!Happy Hacking!

コメント

タイトルとURLをコピーしました