本文へスキップ
webkida wiki
戻る

【HTTP】ロングポーリングの流れ

更新日:

通常のリクエスト、3秒ごとのショートポーリング、応答を最大30秒保留するロングポーリングで、8秒に届いたメッセージがいつ見えるかを比べる

新着メッセージのように、いつ届くか分からない変化をクライアントが知るとき、HTTP では問い合わせが先に必要です。

サーバーから先に、その変化を送ることはできません。

知る方法は3つです。1回だけ送る通常のリクエスト、3秒ごとに送り直すショートポーリング、応答を最大30秒保留するロングポーリングです。0秒に問い合わせを始め、8秒にメッセージが届く例で、見える時刻とリクエストの回数を比べます。

通常のリクエスト

問い合わせを受けた時点の状態を、サーバーはすぐ返します。新しいメッセージがなければ「ない」が返り、その1往復は終わります。

応答を待っているリクエストは残りません。

sequenceDiagram
  participant C as クライアント
  participant S as サーバー
  C->>S: 新しいメッセージはありますか
  S->>C: 今はありません
  Note over C,S: この往復は終わる

図: 問い合わせた時点の状態がすぐ返り、その往復は終わります。

8秒後にメッセージが届いても、終わった往復には載りません。知るには、クライアントがもう一度問い合わせる必要があります。

ショートポーリング

クライアントは、通常のリクエストを3秒ごとに送ります。時刻は0秒、3秒、6秒、9秒です。サーバーは毎回、問い合わせを受けた時点の状態をすぐ返します。応答を待っているリクエストは残りません。

新しいものがなくても「ない」が返ります。

変化がないあいだも、この往復は3秒ごとに続きます。

sequenceDiagram
    participant C as クライアント
    participant S as サーバー

    C->>S: ① 0秒 要求
    S-->>C: ② 即応答
    C->>S: ③ 3秒 要求
    S-->>C: ④ 即応答
    C->>S: ⑤ 6秒 要求
    S-->>C: ⑥ 即応答
    C->>S: ⑦ 9秒 要求
    S-->>C: ⑧ 即応答

図: 3秒ごとに短い要求と即時の返事が並びます。応答は保留しません。

8秒にメッセージが届いたとします。次の問い合わせは9秒です。届いてから見えるまで、最大で約3秒遅れます。

そのあいだ、サーバーに応答待ちのリクエストはありません。

ロングポーリング

クライアントが送るのは1回です。サーバーは、新しいメッセージが届くか、30秒たつまで、その応答を返しません。

30秒以内に届いたら、その時点で中身を返します。届かなければ、30秒の時点で「ない」と返します。クライアントはどちらの応答でも、受け取ったあとすぐに次の1回を送ります。待っているあいだ、応答を保留したリクエストは1件です。

sequenceDiagram
  participant C as クライアント
  participant S as サーバー
  C->>S: 新しいメッセージまで待ってください
  Note over S: 結果か30秒まで保留
  alt 30秒以内に届いた
    S->>C: 届いたメッセージ
  else 30秒たっても無い
    S->>C: 今はありません
  end
  C->>S: 応答のあと、すぐ次の1回を送る

図: 1回の問い合わせは、届いた時点か30秒まで応答を保留します。

3つの流れを並べる

流れ返事8秒のメッセージ応答待ち
通常のリクエスト問い合わせた時点の状態その1回には載らない往復が終わると残らない
ショートポーリング問い合わせた時点の状態9秒の問い合わせで見える待ちは残らない
ロングポーリング届いた中身か、30秒の「ない」届いた8秒で見える結果か30秒まで1件

メリットとデメリット

ショートポーリング

メリット

デメリット

ロングポーリング

メリット

デメリット

比べると

方式強み弱み
ショート単純で扱いやすいリクエストが増えやすく、見える速さは間隔による
ロング空のリクエストを減らし、届いた時刻に近づけられる応答待ちのリクエストを維持する管理が要る

まとめ

今の状態だけが要るなら、通常のリクエストで足ります。実装を単純に保ったまま変化を待つなら、ショートポーリングです。空のリクエストを減らし、届いた時刻に近づけたいなら、ロングポーリングです。

ロングポーリングでは、応答を保留したリクエストが1件残ります。クライアントは返事を受け取ったあと、すぐに次の1回を送ります。


この記事をシェア:

次の記事
【HTTP】Cookieの属性と送信条件