Átjáróösszesítési minta

Azure Traffic Manager

Több egyéni kérést összesíthet egyetlen kérésbe egy átjáró segítségével. Ez a minta akkor lehet hasznos, ha az ügyfélnek különböző háttérrendszereket kell több alkalommal hívnia egy művelet végrehajtásához.

Kontextus és probléma

Előfordulhat, hogy az ügyfélnek különböző háttérszolgáltatásokat kell többször hívnia egy feladat végrehajtásához. Ha egy alkalmazás számos szolgáltatásra támaszkodik egy feladat végrehajtásakor, minden kéréshez erőforrásokat kell felhasználnia. Ha bármilyen új funkciót vagy szolgáltatást adnak hozzá az alkalmazáshoz, további kérések válnak szükségessé, ami még több erőforrást és hálózati hívást igényel. Az ügyfél és a háttérrendszerek közötti forgalom csökkentheti az alkalmazás teljesítményét és skálázhatóságát. A mikroszolgáltatás-architektúrák még gyakoribbá tették ezt a problémát, mivel a számos kisebb szolgáltatásra épülő alkalmazásokban több szolgáltatások közötti hívás fordul elő.

A következő ábrán az ügyfél minden egyes szolgáltatásnak (1,2,3) kéréseket küld. A szolgáltatások feldolgozzák a kéréseket, és válaszolnak az alkalmazásnak (4,5,6). A jellemzően nagy hálózati késésű mobilhálózatokon az egyedi kérések ilyen módon történő használata nem hatékony, és ilyenkor előfordulhat, hogy megszakad a kapcsolat, vagy a kérések csak részlegesen teljesülnek. Bár az egyes kérések feldolgozása párhuzamosan történik, az alkalmazásnak minden kérés adatait el kell küldenie, megvárni a választ, és feldolgoznia az egyes kérések adatait. Mindez önálló kapcsolatokkal történik, ami növeli a hiba esélyét.

Problem diagram for the Gateway Aggregation pattern

Megoldás

Egy átjáró használatával csökkentheti az ügyfél és a szolgáltatások közötti forgalmat. Az átjáró fogadja az ügyfél kéréseit, továbbítja a kéréseket a különböző háttérrendszerekhez, majd összesíti az eredményeket, és visszaküldi őket a kérést küldő ügyfélnek.

Ez a minta csökkentheti az alkalmazás által a háttérszolgáltatásoknak küldött kérések számát, ami javítja az alkalmazás teljesítményét a nagy késésű hálózatokban.

A következő ábrán az alkalmazás egy kérést küld az átjárónak (1). A kérésben egy további kéréseket tartalmazó csomag található. Az átjáró kibontja a csomagot, és feldolgozza az egyes kéréseket úgy, hogy a megfelelő szolgáltatáshoz irányítja őket (2). Minden egyes szolgáltatás elküldi a választ az átjárónak (3). Az átjáró egyesíti az egyes szolgáltatásoktól érkező válaszokat, és azokat egyetlen válaszként továbbítja az alkalmazásnak (4). Az alkalmazás egyetlen kérést küld, és egyetlen választ kap az átjárótól.

Solution diagram for the Gateway Aggregation pattern

Problémák és megfontolandó szempontok

  • Érdemes ügyelni rá, hogy az átjáró ne kapcsoljon össze háttérszolgáltatásokat.
  • Az átjárót a háttérszolgáltatások közelében kell elhelyezni, hogy a lehető legkisebb késés jelentkezzen.
  • Az átjárószolgáltatás kritikus meghibásodási pont lehet a rendszeren belül. Győződjön meg arról, hogy az átjáró megfelelően ki tudja szolgálni az alkalmazás rendelkezésre állási követelményeit.
  • Az átjáró szűk keresztmetszetté válhat. Ellenőrizze, hogy az átjáró teljesítménye megfelelő-e a várható terhelés kezeléséhez, és skálázható-e az esetleges későbbi növekedésnek megfelelően.
  • Végezzen terhelésteszteket az átjárón annak ellenőrzéséhez, hogy az nem indít-e el hibasorozatokat a szolgáltatásokban.
  • Implementáljon egy rugalmas rendszert válaszfalak, áramkör-megszakítás, újrapróbálkozások, időtúllépés és hasonló technikák használatával.
  • Ha egy vagy több szolgáltatáshívás túl sokáig tart, elfogadható lehet időtúllépés és részleges adathalmaz visszaadása. Gondolja át, hogyan fogja kezelni az alkalmazása ezt a forgatókönyvet.
  • Alkalmazzon aszinkron I/O-t, hogy a háttérrendszer késése ne legyen hatással az alkalmazás teljesítményére.
  • Implementáljon elosztott nyomkövetést korrelációs azonosítók használatával az egyes hívások nyomon követéséhez.
  • Monitorozza a kérésmetrikákat és a válaszok méretét.
  • Fontolja meg gyorsítótárazott adatok visszaadását a feladatátvételi stratégia részeként a hibák kezelésére.
  • Megteheti, hogy nem az átjáróba építi be az összesítést, hanem egy összesítési szolgáltatást helyez el az átjáró mögött. A kérések összesítésének valószínűleg eltérő erőforrásigénye van, mint az átjáró többi szolgáltatásának, ami befolyásolhatja az átjáró útválasztási és kiszervezési funkcióit.

Mikor érdemes ezt a mintát használni?

Használja ezt a mintát, ha:

  • Az ügyfélnek több háttérszolgáltatással kell kommunikálnia az adott művelet végrehajtásához.
  • Előfordulhat, hogy az ügyfél csak nagy késésű hálózatokhoz, például mobilhálózatokhoz fér hozzá.

Nem érdemes ezt a mintát használni, ha:

  • Csökkenteni szeretné az ügyfél és egy szolgáltatás közötti hívások számát több műveletben. Ebben az esetben fontolja meg egy kötegelt művelet hozzáadását a szolgáltatáshoz.
  • Az ügyfél vagy alkalmazás a háttérszolgáltatások közelében található, és a késés nem jelentős tényező.

Számítási feladatok tervezése

Az építészeknek értékelniük kell, hogyan használható az átjáró-aggregációs minta a számítási feladatok kialakításában az Azure Well-Architected Framework pilléreiben foglalt célok és alapelvek kezelése érdekében. Példa:

Pillér Hogyan támogatja ez a minta a pillércélokat?
A megbízhatósági tervezési döntések segítenek a számítási feladatnak ellenállóvá válni a hibás működéssel szemben, és biztosítani, hogy a hiba bekövetkezése után teljesen működőképes állapotba kerüljön. Ez a topológia többek között lehetővé teszi, hogy az átmeneti hibakezelést az ügyfelek közötti elosztott implementációról egy központosított implementációra váltsa.

- RE:07 Átmeneti hibák
A biztonsági tervezési döntések segítenek biztosítani a számítási feladatok adatainak és rendszereinek titkosságát, integritását és rendelkezésre állását. Ez a topológia gyakran csökkenti az ügyfél által a rendszerhez tartozó érintési pontok számát, ami csökkenti a nyilvános felületet és a hitelesítési pontokat. Az összesített háttérrendszerek teljes mértékben hálózati elkülönítésben maradhatnak az ügyfelektől.

- Standard kiadás:04 Szegmentálás
- Standard kiadás:08 Keményítés
Az operatív kiválóság szabványosított folyamatok és a csapat kohéziója révén segít a számítási feladatok minőségének biztosításában. Ez a minta lehetővé teszi, hogy a háttérlogika az ügyfelektől függetlenül fejlődjön, lehetővé téve a láncolt szolgáltatás implementációinak vagy akár adatforrásainak módosítását anélkül, hogy módosítania kellene az ügyfél érintőpontjait.

- OE:04 Eszközök és folyamatok
A teljesítményhatékonyság a skálázás, az adatok és a kód optimalizálásával segíti a számítási feladatok hatékony kielégítését . Ez a kialakítás kisebb késést okozhat, mint egy olyan terv, amelyben az ügyfél több kapcsolatot létesít. Az aggregációs implementációk gyorsítótárazása minimalizálja a háttérrendszerek hívásait.

- PE:03 Szolgáltatások kiválasztása
- PE:08 Adatteljesítmény

Mint minden tervezési döntésnél, fontolja meg az ezzel a mintával bevezethető többi pillér céljaival szembeni kompromisszumokat.

Példa

A következő példa azt mutatja be, hogyan hozhat létre egyszerű átjáró-összesítési NGINX szolgáltatást a Lua használatával.

worker_processes  4;

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;

    location = /batch {
      content_by_lua '
        ngx.req.read_body()

        -- read json body content
        local cjson = require "cjson"
        local batch = cjson.decode(ngx.req.get_body_data())["batch"]

        -- create capture_multi table
        local requests = {}
        for i, item in ipairs(batch) do
          table.insert(requests, {item.relative_url, { method = ngx.HTTP_GET}})
        end

        -- execute batch requests in parallel
        local results = {}
        local resps = { ngx.location.capture_multi(requests) }
        for i, res in ipairs(resps) do
          table.insert(results, {status = res.status, body = cjson.decode(res.body), header = res.header})
        end

        ngx.say(cjson.encode({results = results}))
      ';
    }

    location = /service1 {
      default_type application/json;
      echo '{"attr1":"val1"}';
    }

    location = /service2 {
      default_type application/json;
      echo '{"attr2":"val2"}';
    }
  }
}