0Pricing
React Academy · レッスン

ロングポーリングのパターンと再接続ロジック

useEffectとAbortControllerを使い、指数バックオフと自動再接続を備えたロングポーリングを実装します。

「ロングポーリングのパターンと再接続ロジック」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

ロングポーリングの流れ

ロングポーリングは、クライアントが HTTP リクエストを送信し、サーバーが新しいデータを利用できるようになるまで(または通常30〜60秒のタイムアウトになるまで)接続を開いたままにし、サーバーがデータを応答として返し、クライアントがすぐに別のリクエストを送信するというサイクルで動作します。これにより、サーバープッシュに近い性質を持つ、ほぼ継続的な接続が実現します。

useEffect でのロングポーリングの実装

React でロングポーリングを行うには、useEffect 内で非同期の再帰関数を使用します。この関数は fetch リクエストを実行し、応答を処理した後、自分自身をもう一度呼び出します。AbortController のシグナルによって、コンポーネントのアンマウント時に再帰を停止します。コンポーネントがマウントされていて、abort が通知されていない限り、関数はループします。

クリーンアップ用の AbortController

useEffect の先頭で AbortController を作成し、すべての fetch 呼び出しに controller.signal を渡します。クリーンアップ関数では controller.abort() を呼び出します。これにより、コンポーネントのアンマウント時に実行中のリクエストがキャンセルされ、アンマウント済みのコンポーネントへの状態更新やネットワークリソースのリークを防げます。

エラー時の指数バックオフ

ロングポーリングのリクエストが失敗したときは、すぐに再試行せず、次の試行まで待機してください。指数バックオフでは、連続して失敗するたびに遅延時間を2倍にします(1秒、2秒、4秒、8秒、16秒)。ただし、最大30秒までとします。これにより、失敗しているサーバーへの過剰なリクエストを防ぎ、一時的な問題が解消する時間を確保できます。応答が成功したら、遅延時間を1秒に戻します。

バックオフへのジッターの追加

多くのクライアントが同じサーバーをポーリングする場合、ジッターなしの指数バックオフでは「thundering herd(サンダリングハード)」が発生します。すべてのクライアントが同じ時間だけ待機して同時に再試行するため、サーバーに再び過大な負荷がかかります。遅延時間を delay + Math.random() * delay のようにランダム化してジッターを追加してください。これにより、再試行が時間帯全体に分散され、サーバー負荷の急増を抑えられます。

接続状態のステート

接続状態のステートを管理し、ポーリングのライフサイクルを反映します。isConnecting は初回接続中またはエラー後の再接続中、isConnected は直前のポーリングが成功した状態、isError は連続失敗が発生して最大再試行回数に達した状態を表します。ユーザーがリアルタイムデータの信頼性を理解できるよう、この状態を UI に表示してください。

次回ポーリングタイマーの表示

次の再試行までのバックオフ待機中に、進捗インジケーター付きで「8秒後に再接続します…」のようなカウントダウンを表示できます。バックオフタイマーを設定するときに再試行のタイムスタンプを計算し、毎秒表示を更新します。このように状況を見える化すると、アプリが積極的に復旧を試みていることが伝わり、ユーザーを安心させられます。

再帰的な setTimeout と setInterval

ポーリングには setInterval ではなく、再帰的な setTimeout(応答ハンドラー内で次のポーリングを呼び出す方法)を使用してください。setInterval は前のリクエストにかかった時間に関係なく一定間隔で実行されるため、時間のかかるリクエストによってポーリングが重複することがあります。再帰的な setTimeout では、前のポーリングが完了してから次のポーリングを開始します。

ポーリング間隔の設定

フックの設定オプションとしてポーリング間隔を公開してください。useLongPoll({ url, interval: 5000 }) のように指定します。データソースによって必要な更新頻度は異なります。たとえば「オンラインユーザー」の表示は30秒ごと、タスクのステータスは5秒ごとにポーリングする場合があります。実装コードに間隔をハードコードするのは避けてください。

ポーリングから SSE への移行

API が成熟したら、効率を高めるためにポーリングを SSE に置き換えることがあります。ポーリングフックを使用する React コンポーネントは、トランスポート層から切り離しておくべきです。フックが同じインターフェース(onData、status、error)を公開していれば、内部の実装をポーリングから EventSource に切り替えても、そのフックを利用するコンポーネントを変更する必要はありません。

サーバー側のタイムアウト処理

サーバーがロングポーリングの接続を保持している間にデータが届かない場合、接続が無期限に開いたままになるのを防ぐため、タイムアウトとして応答する必要があります(空の本文を持つ 200、または 204 No Content)。その後、クライアントはすぐに再度ポーリングします。このサーバー側のタイムアウト(30〜60秒)は、クライアント側の fetch タイムアウト(より長い時間、たとえば90秒)とは別のものです。

指数バックオフの目的

接続エラーの後に再試行するとき、ロングポーリングで指数バックオフを使用するのはなぜですか?

レッスンのまとめ:ロングポーリング

ロングポーリングでは、クライアントがリクエストを送信し、サーバーがデータを利用できるようになるかタイムアウトするまで保持し、応答後すぐにクライアントが再度リクエストします。useEffect 内で再帰的な非同期 fetch を使用し、AbortController でクリーンアップします。エラー時は、サンダリングハードを防ぐために指数バックオフ(1秒、2秒、4秒…、最大30秒)とジッターを組み合わせます。ポーリングの重複を防ぐため、setInterval ではなく再帰的な setTimeout を使用します。UI へのフィードバック用に、isConnecting、isConnected、isError の状態を追跡します。

よくある質問

「ロングポーリングのパターンと再接続ロジック」レッスンは無料ですか?

はい。「ロングポーリングのパターンと再接続ロジック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「ロングポーリングのパターンと再接続ロジック」で何を学びますか?

useEffectとAbortControllerを使い、指数バックオフと自動再接続を備えたロングポーリングを実装します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ロングポーリングのパターンと再接続ロジック」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. SSE、WebSockets、ポーリングの比較
  2. EventSourceを使ったReactでのSSEストリーム利用
  3. ロングポーリングのパターンと再接続ロジック
  4. リアルタイム通知フィードの構築
← React Academyに戻る