Ugrás a tartalomra
Rapcsány Krisztián Rapcsány Krisztián
← Összes cikk
2 perc olvasás

Mikor szabad újrapróbálni egy hívást?

React Native API Megbízhatóság

A beléptető appomat olyan helyen használják, ahol nem mindig jó a térerő. Hálózati hiba esetén nem akartam, hogy a beléptető újra és újra rákoppintson, ezért az app maga próbál újra. Van viszont egy szabály, amit nem szeghetek meg: csak olyan hívást próbálok újra, aminek az ismétlése nem okozhat kárt.

Mi számít hálózati hibának?

Ha nincs válasz, nem tudhatom, hogy a szerver megkapta-e a kérést. Lehet, hogy nem, és lehet, hogy megkapta, csak a válasz nem ért vissza. Ezért nálam hálózati hiba csak az, amikor egyáltalán nem érkezett válasz. Ha a szerver válaszolt, akár 4xx-szel, akár 5xx-szel, az nem hálózati hiba, és azt nem próbálom újra.

network-retry.ts
/** No response at all = network failure (offline, timeout). A 4xx/5xx reply is not. */
function isNetworkError(error: unknown): boolean {
  return axios.isAxiosError(error) && !error.response;
}

/**
 * Retries a call once on a network failure. ONLY use it for calls that are
 * safe to repeat: reads, or writes that are idempotent on the server.
 */
async function withNetworkRetry<T>(call: () => Promise<T>, retries = 1): Promise<T> {
  try {
    return await call();
  } catch (error) {
    if (retries > 0 && isNetworkError(error)) {
      await new Promise((resolve) => setTimeout(resolve, 700));
      return withNetworkRetry(call, retries - 1);
    }
    throw error;
  }
}

Kivonat valódi kódból, anonimizálva.

Az írás a veszélyes

Egy olvasó hívás ismételhető. Egy beléptetés viszont nem feltétlenül: ha az első kérés átment, de a válasz elveszett, a második kérés kétszer léptetne be valakit. Ezért az újrapróbálást csak olvasásra használom, vagy olyan írásra, ami a szerveren idempotens.

Az idempotens azt jelenti, hogy ugyanazt a kérést kétszer elküldve ugyanaz az eredmény lesz, mint egyszer. Ezt a szerveren kell megoldani, a kliens nem tudja garantálni.

Újrapróbálás előtt rövid várakozás van, nálam 700 ezredmásodperc, és csak egyszer próbálom újra. A beléptetőnek gyors válasz kell, nem hosszú várakozás.

Hasonló problémán dolgozol?

Ha elakadtál, vagy átnéztetnéd a megoldásodat, írj, szívesen megnézem.

Írok neked →
Ajánlatot kérek →