回線の切り替わり・圏外・遅い回線を前提に、タイムアウト・リトライ・再接続を設計する。
アプリの通信の不具合は、開発中の安定した Wi‑Fi ではほとんど再現しません。ところが利用者の多くは移動中に使うので、「固まる」「二重に注文された」といったレビューや問い合わせは、回線が不安定なときの作りの甘さから来ることがよくあります。
ここでは、待つ時間・やり直し方・待っている間の見せ方を、最初に決めておくことを押さえます。
スマホの回線は、電車・地下・エレベーター・Wi-Fi と 4G/5G の切り替わりで、切れたり極端に遅くなったりします。「通信は失敗するもの」として作るのが前提です。
| 対策 | 具体的に |
|---|---|
| タイムアウトを決める | 接続と全体の時間を分けて決める。何十秒も待たせず、画面には読み込み中と再試行のボタンを出す |
| 再試行は安全なものだけ | GET や冪等キーを付けた POST だけ自動で再試行。決済の二重送信を防ぐ |
| 待ってから再試行 | 指数バックオフとジッター(下で説明)。429・503 の Retry-After は守る |
| つながるまで待つ | iOS は URLSessionConfiguration.waitsForConnectivity、Android は WorkManager のネットワーク条件 |
| 通信量を減らす | 画像は表示する大きさで取る。一覧はページ単位。キャッシュと ETag を使う |
通信を待つ間・失敗したときに画面に何を見せるかは、次の回線が悪くても使える画面にする(キャッシュを先に見せる)で説明します。
(SRE)HTTP/1.1・HTTP/2・HTTP/3 の比較
下の「ブラウザで試す」の図では、電車の中で注文を送り、サーバーは処理したのに返事が途中で消える場面から始まります。アプリは1秒・2秒・4秒と待ち時間を倍にし、ランダムなずれ(ジッター)を足してやり直し(指数バックオフ)、同じ冪等キーで送り直すので、サーバーは注文を作り直さずに前回の結果を返します。上の表の「再試行は安全なものだけ」「待ってから再試行」が、どの手順にあたるかを見てください。
面接ではこう答える
スマホの回線は、電車や地下、Wi-Fi とモバイル回線の切り替わりで切れたり極端に遅くなったりするので、通信は失敗するものとして作ります。接続と全体のタイムアウトを決めて何十秒も待たせず、自動で再試行するのは GET や冪等キーを付けた POST だけにし、指数バックオフとジッターで間をあけます。つながるまで待つ仕組みや、画像を表示の大きさで取るなど通信量を減らす工夫も合わせて使います。
Appとの関わり通信まわりの実装と、「アプリが固まる」「二重に投稿された」といった問い合わせの調査で使います。
ネットワーク図を読み込んでいます…