104
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【35歳未経験でも理解できた】サーバープッシュ技術

104
Posted at

SSE・WebSocketをスッキリ理解する

こんにちは!
35歳未経験からWebエンジニアの世界に飛び込んだ者です。

突然ですが、LINEなどのチャットアプリで、自分が何も操作していないのに「ポンッ」と新しいメッセージが表示されるのって、不思議に思ったことはありませんか?

実はこれ、「サーバープッシュ」という技術のおかげなんです。

この記事では、「サーバー側から勝手にお知らせを送ってくれる魔法の仕組み」について、スッキリ解説します!

この記事はこんな人におすすめ

・チャットアプリや株価のリアルタイム更新の仕組みが気になる方

・「WebSocket」や「プロトコル」と聞くだけで苦手意識がある方

・リアルタイム通信をどう実装すればいいのかイメージが湧かない方

結論(先にシンプルに)

サーバープッシュ技術の本質を一言でいうと

「毎回注文しなくても、お店(サーバー)から勝手におかわりを持ってきてくれるシステム」

大きく分けて2つの方法があります。

・SSE(Server-Sent Events): 一方通行の「わんこそば」方式
・WebSocket: 双方向の「トランシーバー(電話)」方式

これだけ頭の片隅に置いて、次へ進みましょう!

1. 昔のWebとサーバープッシュの違い

まずは前提から。通常のWeb通信(HTTP)は「一問一答」のキャッチボールです。

お客さん(ブラウザ)が「これください」と言ったら、お店(サーバー)が「はいどうぞ」と渡して、それで通信はパタンと終わります。

これだと「新しいメッセージ来てないかな?」と、お客さんが数秒に1回お店に聞きに行かないといけません。

そこで生まれたのが、お店のほうから「新しいの入ったよ!」と送ってくれる
サーバープッシュ技術です。

2. SSE(Server-Sent Events)によるプッシュ配信

まずは、「SSE」という技術です。
一言でいうと

「一度のリクエストに対して、サーバーが少しずつ連続してデータを返し続ける仕組み」

より正確には

「サーバーからクライアントへの一方向のストリーミング通信」です。

具体例:連続で提供される「わんこそば」
これは「HTTPストリーミング」や「チャンク転送」という技術がベースになっています。

チャンク(Chunk)とは「塊」という意味。本来なら1杯の大きなラーメンとして出すところを、一口サイズの「塊」に分けて、連続でドンドンお椀に入れていくイメージです。

SSEのすごいところは、ブラウザ側に「わんこそば専用の受け皿(標準API)」が用意されているため、受信の処理がめちゃくちゃ簡単に書けることです。

【いつものHTTP(毎回注文)】
👨私「ラーメンちょうだい!」 ➔ 🍜店「はいよ!」(ここで関係終了)
👨私「水ちょうだい!」     ➔ 💧店「はいよ!」(ここで関係終了)

【SSE(チャンク転送・わんこそば方式)】
👨私「わんこそばよろしく!」 ➔ 🍜店「はいよ!」
(接続したまま)          ➔ 🍜店「はいよ!」
(まだまだ終わらない)    ➔ 🍜店「どんどん!」

⚠️ SSEの注意点
超便利なSSEですが、落とし穴があります。

ブラウザはHTTP/1.1の仕様上、同一ドメインへの同時接続数に制限(一般的に6接続)があります。
そのためSSEを多用すると、この制限に引っかかり通信が詰まる可能性があります。

3. WebSocketの登場

次は、リアルタイム通信の真打ち「WebSocket(ウェブソケット)」です。

一言でいうと

「双方向・高頻度・大量の通信をするために作られた、全く新しい通信ルール(プロトコル)」

※TCP上で動作する、HTTPとは別の専用プロトコルです

具体例:手紙から「電話」への切り替え

SSEが「サーバーからのわんこそば(一方通行)」だったのに対し、WebSocketは「お互いにいつでも喋れる電話(双方向)」です。

オンラインゲームのように、自分も「右に動いた!」と頻繁に送信し、サーバーからも「敵が出た!」と頻繁に受信するような場面で大活躍します。

ここで面白いのが、WebSocketの通信の始め方(ハンドシェイク)です。
最初はいつものHTTP(手紙)で挨拶をしておいて、途中から「プロトコルアップグレード」という仕組みを使います。

「最初は日本語(HTTP)で挨拶したけど、ここからは英語(WebSocket)で話そうぜ!」と、途中で言語(ルール)を切り替えるんです。

【プロトコルアップグレードの流れ】

👨私(HTTP)「WebSocketで話しませんか?」(ハンドシェイク)
💻鯖(HTTP)「OK!ここからはWebSocketで話そう!」
↓
⚡(切り替え完了!ここからは繋ぎっぱなしの爆速トーク)⚡
👨私「右に移動!」 ⇔ 💻鯖「敵が出現!」
👨私「攻撃!」     ⇔ 💻鯖「命中!」

💡 【補足】なぜ最初からWebSocketで話さないの?

ここまで読んで、「アップグレードとか面倒なことしないで、最初からWebSocketのルールで通信すればいいじゃん!」と思ったかもしれません。

一言でいうと、これには「ネットの通り道にいる『厳しい警備員』をスルーするため」という切実な理由があります。

インターネット上には、ファイアウォールやプロキシサーバーと呼ばれる「通信の安全を守る警備員」がたくさんいます。彼らはとても頭が固く、「いつも出入りしている『HTTP』という業者しかビルに入れない」というルールを持っています。

もし最初から「WebSocket」という見知らぬ業者がやってきたら、「誰だお前!怪しい言語を話すな!」と門前払い(通信ブロック)されてしまいます。

だからWebSocketは、最初は「どうも〜!いつものHTTP宅急便でーす!」と普通のフリをして警備員の前を通過するのです。そして、無事に目的の担当者(サーバー)のところへ辿り着いた瞬間に、「実はWebSocketです。ここからは専用回線でいきましょう」と制服を脱ぎ捨てて切り替えます。

既存のルール(HTTPしか通さない環境)を壊さずに、新しい通信を実現するための賢い工夫なんですね。

⚠️ WebSocketの課題
電話の「繋ぎっぱなし」は便利な反面、お店(サーバー)側からすると「ずっと電話口に店員を立たせておかないといけない」という負担になります。

そのため、以下のような課題と常に向き合う必要があります。

・同時接続数の問題(何万人と同時に電話を繋げるか?)

・プロキシサーバーの問題(途中の仲介役が電話のルールを理解できないことがある)

・負荷分散や認証(どの店員が誰の電話の対応をしているか分からなくなる)

まとめ

今回は、サーバープッシュ技術の2つの主役について解説しました!
長くなりましたが、以下の3点です。

1. サーバープッシュ は、お店(サーバー)から勝手に情報を送ってくれる仕組み

2. SSE(Server-Sent Events) は、受信専用の「わんこそば」

通知・ログ配信・株価など「サーバー → クライアント」だけで十分な場合

3. WebSocket は、最初だけHTTPで挨拶して切り替える、超高速の「双方向電話」

チャット・ゲームなど「双方向でリアルタイム性が重要」な場合


チャットやゲームなど「もっとリアルタイムに!」というニーズから生まれたのが、これらの技術です。

大事なのは
リアルタイム通信を使うこと」ではなく、「その場面に合った手段を選べること」です。

SSEで十分なのか、それともWebSocketが必要なのか。

この判断ができれば、もう迷うことはありません。

それではまた、次回の記事で!

104
44
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
104
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?