Mikor szabad újrapróbálni egy hívást?
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.
/** 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 →További cikkek
Webhook küldés újrapróbálással, kétszeri küldés nélkül
Növekvő várakozású újrapróbálás és zárolt ellenőrzés, hogy ugyanaz a visszahívás ne menjen ki kétszer.
Elolvasom →Mobilapp-frissítés áruházi várakozás nélkül
Hogyan érkeznek a kisebb javítások a telefonokra úgy, hogy közben nem szakad meg egy beléptetés.
Elolvasom →