A lecke végére el tudod magyarázni, miért más a távoli hívás, mint a helyi, meg tudod nevezni a hívás négy lehetséges kimenetét, és értelmezni tudod a részleges hibát.
Miért kell?
A kód szintaxisában egy távoli hívás hasonlíthat egy függvényhívásra, mégis alapvetően más. Az elosztott rendszerekről szóló tévhitek jól összefoglalják, mit szoktak elfelejteni: a „nyolc tévedés” (Peter Deutsch és James Gosling, Sun) szerint tévesen feltételezik, hogy a hálózat megbízható, a késleltetés nulla, a sávszélesség végtelen, a hálózat biztonságos, a topológia nem változik, egyetlen rendszergazda van, az átvitel költsége nulla, és a hálózat homogén.
Mi változik?
Helyi hívásnál a hívó és a hívott ugyanazon folyamat memóriájában dolgozik. Távoli híváskor a kérés és a válasz üzenetként utazik, ezért:
az adatot szerializálni kell (átalakítani üzenetté), majd a másik oldalon visszaalakítani;
a helyi objektumreferencia nem küldhető át; csak az egyeztetett reprezentáció;
a hívás időbe telik, és az idő ingadozik;
a hívott fél lehet elérhetetlen, lassú vagy hibás, miközben a hívó fut.
sequenceDiagram
participant A as Hívó
participant N as Hálózat
participant B as Hívott
A->>A: Szerializáció
A->>N: Kérés
N->>B: Kérés
B->>B: Feldolgozás
B-->>N: Válasz
N-->>A: Válasz
A->>A: Eredmény kezelése
A hívás négy kimenete
A hívó számára négy kimenet lehetséges: siker, üzleti elutasítás (például „nincs elegendő készlet”), technikai hiba, és ismeretlen eredmény. Az első három kezelhető; a negyedik a legveszélyesebb. A technikai hiba és az üzleti elutasítás eltérő műveletet indokol: az elutasítást nem javítja meg a kérés automatikus ismétlése.
Ismeretlen eredmény akkor keletkezik, ha a szerver végrehajtotta a módosítást, de a válasz elveszett. Az időtúllépés (timeout) csak azt mutatja, hogy a hívó időkerete lejárt; nem bizonyítja, hogy a művelet nem hajtódott végre. Ezért módosító művelet ismétlése csak úgy biztonságos, ha a művelet azonosítható vagy lekérdezhető (6.5).
Részleges hiba
Elosztott rendszerben az egyik rész működhet, miközben a másik nem érhető el. A hiba lehet a hálózat, egy közbenső komponens vagy csak egy szolgáltatáspéldány. Egy lassú válasz és egy kiesés a hívó számára sokáig ugyanúgy nézhet ki. Ezért a távoli hívás hibakezelése a tervezés része, nem utólagos kiegészítés. A Fowler–Lewis-cikk is úgy fogalmaz: az alkalmazásokat úgy kell megtervezni, hogy elviseljék a szolgáltatások kiesését, és a kliensnek erre a lehető legzökkenőmentesebben kell reagálnia.
Azonosítók a diagnosztikához
Hasznos három különböző azonosító: a műveletazonosító az ismétlés biztonságához, a trace-azonosító a hívási lánc megfigyeléséhez, és a kérés/üzenet-azonosító a válasz párosításához. A három nem ugyanaz; egy újrapróbálás több hálózati próbálkozást hozhat létre ugyanahhoz az üzleti művelethez.
Gyakori tévhitek
Állítás
Pontosítás
„A távoli hívás csak lassabb helyi hívás.”
Új hibaosztályok (részleges hiba, ismeretlen eredmény) is megjelennek.
„Az időtúllépés azt jelenti, hogy a művelet nem történt meg.”
Csak azt, hogy a válasz nem érkezett meg az időkereten belül.
„A hálózat megbízható.”
A nyolc tévedés első pontja.
„Az üzleti elutasítás és a technikai hiba ugyanúgy kezelhető.”
Az egyiket ismételni értelmetlen, a másikat érdemes lehet.
Röviden
A távoli hívás üzenet: szerializálni kell, idejétől és kimenetétől nem lehet függetlenedni.
Négy kimenet: siker, üzleti elutasítás, technikai hiba, ismeretlen eredmény.
Az időtúllépés nem bizonyítja a végrehajtás hiányát.
A részleges hiba természetes; a hibakezelés a tervezés része.
Ellenőrző kérdések
Miért lehet sikeres a távoli módosítás időtúllépés mellett?
Mi a különbség az üzleti elutasítás és a technikai hiba között?
Mire való a műveletazonosító, a trace-azonosító és az üzenetazonosító?
A távoli hívás nem helyi függvényhívás
Célok
A lecke végére el tudod magyarázni, miért más a távoli hívás, mint a helyi, meg tudod nevezni a hívás négy lehetséges kimenetét, és értelmezni tudod a részleges hibát.
Miért kell?
A kód szintaxisában egy távoli hívás hasonlíthat egy függvényhívásra, mégis alapvetően más. Az elosztott rendszerekről szóló tévhitek jól összefoglalják, mit szoktak elfelejteni: a „nyolc tévedés” (Peter Deutsch és James Gosling, Sun) szerint tévesen feltételezik, hogy a hálózat megbízható, a késleltetés nulla, a sávszélesség végtelen, a hálózat biztonságos, a topológia nem változik, egyetlen rendszergazda van, az átvitel költsége nulla, és a hálózat homogén.
Mi változik?
Helyi hívásnál a hívó és a hívott ugyanazon folyamat memóriájában dolgozik. Távoli híváskor a kérés és a válasz üzenetként utazik, ezért:
A hívás négy kimenete
A hívó számára négy kimenet lehetséges: siker, üzleti elutasítás (például „nincs elegendő készlet”), technikai hiba, és ismeretlen eredmény. Az első három kezelhető; a negyedik a legveszélyesebb. A technikai hiba és az üzleti elutasítás eltérő műveletet indokol: az elutasítást nem javítja meg a kérés automatikus ismétlése.
Ismeretlen eredmény akkor keletkezik, ha a szerver végrehajtotta a módosítást, de a válasz elveszett. Az időtúllépés (timeout) csak azt mutatja, hogy a hívó időkerete lejárt; nem bizonyítja, hogy a művelet nem hajtódott végre. Ezért módosító művelet ismétlése csak úgy biztonságos, ha a művelet azonosítható vagy lekérdezhető (6.5).
Részleges hiba
Elosztott rendszerben az egyik rész működhet, miközben a másik nem érhető el. A hiba lehet a hálózat, egy közbenső komponens vagy csak egy szolgáltatáspéldány. Egy lassú válasz és egy kiesés a hívó számára sokáig ugyanúgy nézhet ki. Ezért a távoli hívás hibakezelése a tervezés része, nem utólagos kiegészítés. A Fowler–Lewis-cikk is úgy fogalmaz: az alkalmazásokat úgy kell megtervezni, hogy elviseljék a szolgáltatások kiesését, és a kliensnek erre a lehető legzökkenőmentesebben kell reagálnia.
Azonosítók a diagnosztikához
Hasznos három különböző azonosító: a műveletazonosító az ismétlés biztonságához, a trace-azonosító a hívási lánc megfigyeléséhez, és a kérés/üzenet-azonosító a válasz párosításához. A három nem ugyanaz; egy újrapróbálás több hálózati próbálkozást hozhat létre ugyanahhoz az üzleti művelethez.
Gyakori tévhitek
Röviden
Ellenőrző kérdések
Források