Kiszolgáló nélküli eseményfeldolgozás

Azure Cosmos DB
Azure Functions
Azure Monitor
Azure Pipelines
Azure Storage

Ez a referenciaarchitektúra egy kiszolgáló nélküli, eseményvezérelt architektúrát mutat be, amely betölt egy adatfolyamot, feldolgozza az adatokat, és az eredményeket egy háttéradatbázisba írja.

Architektúra

Az Azure Functions használatával történő kiszolgáló nélküli eseményfeldolgozás referenciaarchitektúráját bemutató ábra.

Munkafolyamat

  • Az események az Azure Event Hubsba érkeznek.
  • Egy függvényalkalmazás aktiválódik az esemény kezeléséhez.
  • Az esemény egy Azure Cosmos DB-adatbázisban van tárolva.
  • Ha a függvényalkalmazás nem tudja sikeresen tárolni az eseményt, a rendszer menti az eseményt egy storage-üzenetsorba, amelyet később feldolgoz.

Összetevők

  • Az Event Hubs betölti az adatfolyamot. Az Event Hubs nagy átviteli sebességű adatstreamelési forgatókönyvekhez készült.

    Feljegyzés

    Az IoT-forgatókönyvek esetében az Azure IoT Hubot javasoljuk. Az IoT Hub egy olyan beépített végponttal rendelkezik, amely kompatibilis az Azure Event Hubs API-val, így ebben az architektúrában bármelyik szolgáltatást használhatja, a háttérfeldolgozásban nincs jelentős változás. További információt az IoT-eszközök Azure-ba való Csatlakozás: IoT Hub és Event Hubs.

  • Függvényalkalmazás. Az Azure Functions egy kiszolgáló nélküli számítási lehetőség. Eseményvezérelt modellt használ, ahol egy eseményindító meghív egy kódrészletet (egy függvényt). Ebben az architektúrában, amikor események érkeznek az Event Hubsba, elindítanak egy függvényt, amely feldolgozza az eseményeket, és az eredményeket a tárolóba írja.

    A Function Apps az Event Hubs egyes rekordjainak feldolgozására alkalmas. Összetettebb streamfeldolgozási forgatókönyvek esetén fontolja meg az Apache Spark használatát az Azure Databricks vagy az Azure Stream Analytics használatával.

  • Azure Cosmos DB. Az Azure Cosmos DB egy többmodelles adatbázis-szolgáltatás, amely kiszolgáló nélküli, használatalapú módban érhető el. Ebben az esetben az eseményfeldolgozó függvény JSON-rekordokat tárol az Azure Cosmos DB for NoSQL használatával.

  • Várólista-tároló. Az üzenetsor-tároló a kézbesítetlen üzenetekhez használatos. Ha hiba történik egy esemény feldolgozása során, a függvény az eseményadatokat egy kézbesítetlen levelek üzenetsorában tárolja későbbi feldolgozás céljából. További információt a cikk rugalmassági szakaszában talál.

  • Azure Monitor. A Monitor a megoldásban üzembe helyezett Azure-szolgáltatások teljesítménymetrikáit gyűjti. Ha ezeket egy irányítópulton vizualizálja, áttekintheti a megoldás állapotát.

  • Azure Pipelines. A folyamatok egy folyamatos integrációs (CI) és folyamatos kézbesítési (CD) szolgáltatás, amely létrehozza, teszteli és üzembe helyezi az alkalmazást.

Megfontolások

Ezek a szempontok implementálják az Azure Well-Architected Framework alappilléreit, amely a számítási feladatok minőségének javítására használható vezérelvek halmaza. További információ: Microsoft Azure Well-Architected Framework.

Elérhetőség

Az itt látható üzembe helyezés egyetlen Azure-régióban található. A vészhelyreállítás rugalmasabb megközelítéséhez használja ki a különböző szolgáltatások földrajzi eloszlási funkcióit:

  • Event Hubs. Hozzon létre két Event Hubs-névteret, egy elsődleges (aktív) névteret és egy másodlagos (passzív) névteret. Az üzenetek automatikusan az aktív névtérbe lesznek irányítva, kivéve, ha a feladatátvétel a másodlagos névtérbe kerül. További információ: Azure Event Hubs Geo-vészhelyreállítás.
  • Függvényalkalmazás. Helyezzen üzembe egy második függvényalkalmazást, amely a másodlagos Event Hubs-névtérből való olvasásra vár. Ez a függvény egy másodlagos tárfiókba ír egy kézbesítetlen levelek üzenetsorához.
  • Azure Cosmos DB. Az Azure Cosmos DB több írási régiót is támogat, amely lehetővé teszi az írást az Azure Cosmos DB-fiókhoz hozzáadott bármely régióba. Ha nem engedélyezi a több írást, továbbra is feladatátvételt végezhet az elsődleges írási régión. Az Azure Cosmos DB ügyféloldali SDK-k és az Azure-függvénykötések automatikusan kezelik a feladatátvételt, így nem kell frissítenie az alkalmazáskonfigurációs beállításokat.
  • Azure Storage. Használja az RA-GRS-tárolót a kézbesítetlen levelek üzenetsorához. Ez egy írásvédett replikát hoz létre egy másik régióban. Ha az elsődleges régió elérhetetlenné válik, elolvashatja az üzenetsor aktuális elemeit. Emellett ki kell építenie egy másik tárfiókot a másodlagos régióban, amelybe a függvény a feladatátvétel után írhat.

Méretezhetőség

Event Hubs

Az Event Hubs átviteli kapacitását átviteli egységekben mérik. Az eseményközpontok automatikus méretezéséhez engedélyezze az automatikus felfújást, amely automatikusan skálázza az átviteli egységeket a forgalom alapján, egy konfigurált maximális értékre.

Az Event Hubs-eseményindító a függvényalkalmazásban az eseményközpont partícióinak száma alapján skálázható. Minden partícióhoz egyszerre egy függvénypéldány van hozzárendelve. Az átviteli sebesség maximalizálása érdekében az eseményeket kötegben fogadhatja, nem pedig egyenként.

Azure Cosmos DB

Az Azure Cosmos DB két különböző kapacitásmódban érhető el:

  • Kiszolgáló nélküli, időszakos vagy kiszámíthatatlan forgalommal és alacsony átlagos és csúcsforgalommal rendelkező számítási feladatokhoz.
  • Kiosztott átviteli sebesség a kiszámítható teljesítményt igénylő, tartós forgalmat igénylő számítási feladatokhoz.

Ahhoz, hogy a számítási feladat méretezhető legyen, fontos, hogy az Azure Cosmos DB-tárolók létrehozásakor megfelelő partíciókulcsot válasszon. A jó partíciókulcs néhány jellemzője:

  • A kulcs értéktartománya nagy.
  • Az olvasási/írási műveletek egyenletes eloszlása lesz kulcsértékenként, elkerülve a gyorsbillentyűket.
  • Az egyetlen kulcsértékhez tárolt maximális adatok nem lépik túl a fizikai partíció maximális méretét (20 GB).
  • A dokumentum partíciókulcsa nem változik. Meglévő dokumentum partíciókulcsa nem frissíthető.

A referenciaarchitektúra forgatókönyvében a függvény pontosan egy dokumentumot tárol eszközönként, amely adatokat küld. A függvény egy upsert művelettel folyamatosan frissíti a dokumentumokat a legújabb eszközállapottal. Az eszközazonosító egy jó partíciókulcs ebben a forgatókönyvben, mivel az írások egyenletesen oszlanak el a kulcsok között, és az egyes partíciók mérete szigorúan korlátozott lesz, mert minden kulcsértékhez egyetlen dokumentum tartozik. További információ a partíciókulcsokról: Partíció és méretezés az Azure Cosmos DB-ben.

Tartósság

Ha az Event Hubs-eseményindítót a Functions használatával használja, észlelje a feldolgozási cikluson belüli kivételeket. Ha nem kezelt kivétel történik, a Functions-futtatókörnyezet nem próbálkozik újra az üzenetekkel. Ha egy üzenet nem dolgozható fel, helyezze az üzenetet egy kézbesítetlen üzenetsorba. Sávon kívüli eljárással vizsgálja meg az üzeneteket, és határozza meg a korrekciós műveletet.

Az alábbi kód bemutatja, hogy a betöltési függvény hogyan hárítja el a kivételeket, és hogyan helyezi a feldolgozatlan üzeneteket egy kézbesítetlen üzenetsorba.

 [Function(nameof(RawTelemetryFunction))]
 public async Task RunAsync([EventHubTrigger("%EventHubName%", Connection = "EventHubConnection")] EventData[] messages,
     FunctionContext context)
 {
     _telemetryClient.GetMetric("EventHubMessageBatchSize").TrackValue(messages.Length);
     DeviceState? deviceState = null;
     // Create a new CosmosClient
     var cosmosClient = new CosmosClient(Environment.GetEnvironmentVariable("COSMOSDB_CONNECTION_STRING"));

     // Get a reference to the database and the container
     var database = cosmosClient.GetDatabase(Environment.GetEnvironmentVariable("COSMOSDB_DATABASE_NAME"));
     var container = database.GetContainer(Environment.GetEnvironmentVariable("COSMOSDB_DATABASE_COL"));

     // Create a new QueueClient
     var queueClient = new QueueClient(Environment.GetEnvironmentVariable("DeadLetterStorage"), "deadletterqueue");
     await queueClient.CreateIfNotExistsAsync();

     foreach (var message in messages)
     {
         try
         {
             deviceState = _telemetryProcessor.Deserialize(message.Body.ToArray(), _logger);
             try
             {
                 // Add the device state to Cosmos DB
                 await container.UpsertItemAsync(deviceState, new PartitionKey(deviceState.DeviceId));
             }
             catch (Exception ex)
             {
                  _logger.LogError(ex, "Error saving on database", message.PartitionKey, message.SequenceNumber);
                 var deadLetterMessage = new DeadLetterMessage { Issue = ex.Message, MessageBody = message.Body.ToArray(), DeviceState = deviceState };
                 // Convert the dead letter message to a string
                 var deadLetterMessageString = JsonConvert.SerializeObject(deadLetterMessage);

                 // Send the message to the queue
                 await queueClient.SendMessageAsync(deadLetterMessageString);
             }

         }
         catch (Exception ex)
         {
             _logger.LogError(ex, "Error deserializing message", message.PartitionKey, message.SequenceNumber);
             var deadLetterMessage = new DeadLetterMessage { Issue = ex.Message, MessageBody = message.Body.ToArray(), DeviceState = deviceState };
             // Convert the dead letter message to a string
             var deadLetterMessageString = JsonConvert.SerializeObject(deadLetterMessage);

             // Send the message to the queue
             await queueClient.SendMessageAsync(deadLetterMessageString);
         }
     }
 }

A megjelenő kód az Alkalmazás Elemzések kivételeit is naplózza. A partíciókulcs és a sorszám használatával korrelálhatja a halottbetűs üzeneteket a naplók kivételeivel.

A kézbesítetlen levelek üzenetsorában lévő üzeneteknek elegendő információval kell rendelkezniük ahhoz, hogy megérthesse a hiba kontextusát. Ebben a példában az DeadLetterMessage osztály tartalmazza a kivételüzenetet, az eredeti esemény törzsadatait és a deszerializált eseményüzenetet (ha elérhető).

    public class DeadLetterMessage
    {
        public string? Issue { get; set; }
        public byte[]? MessageBody { get; set; }
        public DeviceState? DeviceState { get; set; }
    }

Az Eseményközpont monitorozása az Azure Monitor használatával. Ha azt látja, hogy van bemenet, de nincs kimenet, az azt jelenti, hogy az üzenetek feldolgozása nem történik meg. Ebben az esetben lépjen a Log Analyticsbe, és keressen kivételeket vagy egyéb hibákat.

DevOps

Ha lehetséges, használja az infrastruktúrát kódként (IaC). Az IaC deklaratív megközelítéssel, például az Azure Resource Managerrel kezeli az infrastruktúrát, az alkalmazást és a tárolási erőforrásokat. Ez segít automatizálni az üzembe helyezést a DevOps használatával folyamatos integrációs és folyamatos kézbesítési (CI/CD) megoldásként. A sablonokat a kiadási folyamat részeként kell verziószámba venni és belefoglalni.

Sablonok létrehozásakor csoportosítsa az erőforrásokat számítási feladatonkénti rendszerezésre és elkülönítésre. A számítási feladatok közös gondolkodási módja egyetlen kiszolgáló nélküli alkalmazás vagy virtuális hálózat. A számítási feladatok elkülönítésének célja, hogy az erőforrásokat egy csapathoz társítsa, hogy a DevOps-csapat önállóan felügyelhesse az erőforrások minden aspektusát, és ci/CD-t hajthass végre.

A szolgáltatások üzembe helyezésekor figyelnie kell őket. Fontolja meg az Alkalmazás Elemzések használatát, hogy a fejlesztők figyelhessék a teljesítményt és észlelhessék a problémákat.

További információkért tekintse meg a DevOps ellenőrzőlistát.

Vészhelyreállítás

Az itt látható üzembe helyezés egyetlen Azure-régióban található. A vészhelyreállítás rugalmasabb megközelítéséhez használja ki a különböző szolgáltatások földrajzi eloszlási funkcióit:

  • Event Hubs. Hozzon létre két Event Hubs-névteret, egy elsődleges (aktív) névteret és egy másodlagos (passzív) névteret. Az üzenetek automatikusan az aktív névtérbe lesznek irányítva, kivéve, ha a feladatátvétel a másodlagos névtérbe kerül. További információ: Azure Event Hubs Geo-vészhelyreállítás.

  • Függvényalkalmazás. Helyezzen üzembe egy második függvényalkalmazást, amely a másodlagos Event Hubs-névtérből való olvasásra vár. Ez a függvény egy másodlagos tárfiókba ír a kézbesítetlen levelek üzenetsorához.

  • Azure Cosmos DB. Az Azure Cosmos DB több írási régiót is támogat, amely lehetővé teszi az írást az Azure Cosmos DB-fiókhoz hozzáadott bármely régióba. Ha nem engedélyezi a több írást, továbbra is feladatátvételt végezhet az elsődleges írási régión. Az Azure Cosmos DB ügyféloldali SDK-k és az Azure-függvénykötések automatikusan kezelik a feladatátvételt, így nem kell frissítenie az alkalmazáskonfigurációs beállításokat.

  • Azure Storage. Használja az RA-GRS-tárolót a kézbesítetlen levelek üzenetsorához. Ez egy írásvédett replikát hoz létre egy másik régióban. Ha az elsődleges régió elérhetetlenné válik, elolvashatja az üzenetsor aktuális elemeit. Emellett ki kell építenie egy másik tárfiókot a másodlagos régióban, amelybe a függvény a feladatátvétel után írhat.

Költségoptimalizálás

A költségoptimalizálás a szükségtelen kiadások csökkentésének és a működési hatékonyság javításának módjairól szól. További információ: A költségoptimalizálási pillér áttekintése.

A költségek becsléséhez használja az Azure Díjszabás kalkulátorát . Íme néhány egyéb szempont az Azure Functions és az Azure Cosmos DB esetében.

Azure Functions

Az Azure Functions két üzemeltetési modellt támogat:

  • Használati terv. A számítási teljesítmény automatikusan le lesz foglalva a kód futtatásakor.
  • App Service-csomag. A kódhoz virtuális gépek (virtuális gépek) vannak lefoglalva. Az App Service-csomag határozza meg a virtuális gépek számát és a virtuális gép méretét.

Ebben az architektúrában az Event Hubsra érkező összes esemény elindít egy függvényt, amely feldolgozza az eseményt. Költség szempontjából a javaslat a használati terv használata, mert csak a használt számítási erőforrásokért kell fizetnie.

Azure Cosmos DB

Az Azure Cosmos DB-vel csak az adatbázison elvégzett műveletekért és az adatok által felhasznált tárterületért kell fizetni.

  • Adatbázis-műveletek. Az adatbázis-műveletekért való díj felszámításának módja a használt Azure Cosmos DB-fiók típusától függ.
    • Kiszolgáló nélküli módban nem kell átviteli sebességet kiépítenie, amikor erőforrásokat hoz létre az Azure Cosmos DB-fiókjában. A számlázási időszak végén kiszámlázzuk az adatbázis-műveletek által felhasznált kérelemegységek mennyiségét.
    • Kiosztott átviteli módban meg kell adnia a másodpercenkénti kérelemegységekben (RU/s) szükséges átviteli sebességet, és óránként kell számlázni az adott óra maximális kiosztott átviteli sebességéért. Megjegyzés: Mivel a kiosztott átviteli sebesség modell erőforrásokat szentel a tárolónak vagy az adatbázisnak, a kiosztott átviteli sebességért akkor is fizetnie kell, ha nem futtat számítási feladatokat.
  • Tárhely. Az adatok és indexek által egy adott órán keresztül felhasznált teljes tárterület (AB-ben) átalánydíja lesz kiszámlázva.

Ebben a referenciaarchitektúrában a függvény eszközenként pontosan egy dokumentumot tárol, amely adatokat küld. A függvény folyamatosan frissíti a dokumentumokat a legújabb eszközállapottal egy upsert művelettel, amely költséghatékony a felhasznált tárterület szempontjából. További információkért tekintse meg az Azure Cosmos DB díjszabási modelljét.

Az Azure Cosmos DB kapacitáskalkulátorával gyors becslést kaphat a számítási feladatok költségeiről.

A forgatókönyv üzembe helyezése

GitHub-embléma Az architektúra referencia-implementációja elérhető a GitHubon.

Következő lépések