Skip to content
Language:hu Author:Laborci Gergely
distributed-systems

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:

  • 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

  1. Miért lehet sikeres a távoli módosítás időtúllépés mellett?
  2. Mi a különbség az üzleti elutasítás és a technikai hiba között?
  3. Mire való a műveletazonosító, a trace-azonosító és az üzenetazonosító?

Források

Prerequisites (1)

  • szoftverarchitektúra

Teaches (2)

  • távoli hívás
  • részleges hiba