Megosztás a következőn keresztül:


Eseményreplikációs feladatok mintái

Az összevonási áttekintés és a replikátorfüggvények áttekintése ismerteti a replikációs feladatok indokait és alapvető elemeit, ezért a cikk folytatása előtt érdemes megismerkednie velük.

Ebben a cikkben részletesen bemutatjuk az áttekintés szakaszban kiemelt minták implementálási útmutatóját.

Replikáció

A replikációs minta eseményeket másol egyik eseményközpontból a másikba, vagy egy eseményközpontból egy másik helyre, például egy Service Bus-üzenetsorba. Az eseményeket a rendszer anélkül továbbítja, hogy módosításokat végezne az esemény hasznos adatain.

Ennek a mintának a megvalósítását az Event Hubs és a Service Bus-minták közötti eseményreplikáció és eseményreplikáció, valamint az Apache Kafka MirrorMaker használata az Event Hubs-oktatóanyaggal az Apache Kafka-közvetítő adatainak az Event Hubsba való replikálásának konkrét esete fedi le.

adatfolyamok és a rend megőrzése

Az Azure Functionsen vagy az Azure Stream Analyticsen keresztüli replikáció nem célja, hogy biztosítsa a forrás eseményközpont pontos 1:1 klónjainak létrehozását egy céleseményközpontba, hanem az alkalmazás által igényelt események relatív sorrendjének megőrzésére összpontosít. Az alkalmazás ezt úgy kommunikálja, hogy a kapcsolódó eseményeket ugyanarra a partíciókulcsra csoportosítja, és az Event Hubs ugyanabban a partícióban egymás után rendezi az azonos partíciókulcsú üzeneteket.

Fontos

Az "eltolás" információ minden eseményközpont esetében egyedi, és az azonos események eltolásai az Event Hub-példányok között eltérőek lesznek. A másolt eseménystreamek helyének megkereséséhez használjon időalapú eltolásokat, és tekintse meg a propagált szolgáltatás által hozzárendelt metaadatokat.

Az időalapú eltolások egy adott időpontban indítják el a fogadót:

  • EventPosition.FromStart() – Olvassa újra az összes megtartott adatot.
  • EventPosition.FromEnd() – Az összes új adat beolvasása a kapcsolat időpontjából.
  • EventPosition.FromEnqueuedTime(dateTime) – Minden adat egy adott dátumtól és időponttól kezdve.

Az EventProcessorban a pozíciót az EventProcessorOptions InitialOffsetProviderén keresztül állíthatja be. A többi fogadó API-kkal a helyzet áthalad a konstruktoron.

Az Azure Functions-alapú útmutatóban használt mintákként megadott előre összeállított replikációs függvény-segítők biztosítják, hogy a forráspartícióból lekért azonos partíciókulcsú eseménystreamek az eredeti streamben kötegként és ugyanazzal a partíciókulcsmal legyenek elküldve a cél eseményközpontba.

Ha a forrás és a cél eseményközpont partíciószáma azonos, a célban lévő összes stream ugyanarra a partícióra lesz megfeleltetve, mint a forrásban. Ha a partíciók száma eltérő, ami az alábbiakban ismertetett további minták némelyikében számít, a leképezés eltérő lesz, de a streamek mindig együtt és sorrendben maradnak.

A különböző streamekhez vagy független eseményekhez tartozó események relatív sorrendje a célpartíció partíciókulcsa nélkül mindig eltérhet a forráspartíciótól.

Szolgáltatáshoz rendelt metaadatok

A forrás Eseményközpontból beszerzett esemény szolgáltatás által hozzárendelt metaadatait, az eredeti lekérési időt, a sorszámot és az eltolást a cél eseményközpont új, szolgáltatáshoz rendelt értékei váltják fel, de a segédfüggvényekkel, a mintáinkban megadott replikációs feladatokkal az eredeti értékek megmaradnak a felhasználói tulajdonságokban: repl-enqueue-time (ISO8601 sztring), repl-sequence, repl-offset.

Ezek a tulajdonságok típussztringek, és tartalmazzák a megfelelő eredeti tulajdonságok sztringezett értékét. Ha az eseményt többször továbbítja a rendszer, a rendszer hozzáfűzi az azonnali forrás szolgáltatás által hozzárendelt metaadatait a már meglévő tulajdonságokhoz, pontosvesszővel elválasztott értékekkel.

Feladatátvétel

Ha replikációt használ vészhelyreállítási célokra, az Event Hubs szolgáltatásban a regionális rendelkezésre állási események elleni védelemhez vagy a hálózat megszakadása ellen, az ilyen meghibásodási forgatókönyvekhez feladatátvételre lesz szükség az egyik Eseményközpontból a következőre, és meg kell kérni a gyártókat és/vagy a fogyasztókat a másodlagos végpont használatára.

Minden feladatátvételi forgatókönyv esetében feltételezzük, hogy a névterek szükséges elemei szerkezetileg azonosak, ami azt jelenti, hogy az Event Hubs és a fogyasztói csoportok neve azonos, és a közös hozzáférés-aláírási szabályok és/vagy szerepköralapú hozzáférés-vezérlési szabályok ugyanúgy vannak beállítva. Létrehozhat (és frissíthet) egy másodlagos névteret a névterek áthelyezésével és a törlési lépés kihagyásával kapcsolatos útmutatást követve.

Ahhoz, hogy a gyártókat és a fogyasztókat váltásra kényszerítse, meg kell adnia az információkat arról, hogy melyik névteret kell használnia a kereséshez egy könnyen elérhető és frissíthető helyen. Ha a gyártók vagy a fogyasztók gyakori vagy állandó hibákba ütköznek, konzultálniuk kell ezen a helyen, és módosítaniuk kell a konfigurációjukat. Ezt a konfigurációt többféleképpen is megoszthatja, de az alábbiakban két elemet mutatunk be: DNS- és fájlmegosztásokat.

DNS-alapú feladatátvételi konfiguráció

Az egyik jelölt megközelítés az, hogy egy ön által vezérelt DNS-ben tárolja a DNS SRV-rekordjainak adatait, és a megfelelő Event Hub-végpontokra mutat.

Fontos

Ne feledje, hogy az Event Hubs nem teszi lehetővé, hogy a végpontok közvetlenül CNAME rekordokkal aliasosodjanak, ami azt jelenti, hogy a DNS-t rugalmas keresési mechanizmusként fogja használni a végpontcímekhez, és nem fogja közvetlenül feloldani az IP-címadatokat.

Tegyük fel, hogy Ön a tartomány example.com tulajdonosa, és az alkalmazás számára egy zóna test.example.com. Két alternatív Event Hub esetében most két további beágyazott zónát és egy SRV rekordot fog létrehozni mindegyikben.

Az SRV-rekordok a gyakori konvenciók szerint két végpontrekorddal vannak előtaggal _azure_eventhubs._amqp elnevezve és tárolva: egyet az AMQP-over-TLS-hez az 5671-es porton, egyet pedig a 443-as porton lévő AMQP-over-WebSocketshez, mindkettő a zónának megfelelő névtér Event Hubs-végpontjára mutat.

Zóna SRV rekord
eh1.test.example.com _azure_servicebus._amqp.eh1.test.example.com
1 1 5671 eh1-test-example-com.servicebus.windows.net
2 2 443 eh1-test-example-com.servicebus.windows.net
eh2.test.example.com _azure_servicebus._amqp.eh2.test.example.com
1 1 5671 eh2-test-example-com.servicebus.windows.net
2 2 443 eh2-test-example-com.servicebus.windows.net

Az alkalmazás zónájában ezután létre fog hozni egy CNAME bejegyzést, amely az elsődleges eseményközpontnak megfelelő alárendelt zónára mutat:

CNAME-rekord Alias
eventhub.test.example.com eh1.test.example.com

Ha olyan DNS-ügyfelet használ, amely lehetővé teszi a CNAME- és SRV-rekordok explicit lekérdezését (a Java és a .NET beépített ügyfelei csak a nevek egyszerű feloldását teszik lehetővé AZ IP-címekre), akkor feloldhatja a kívánt végpontot. A DnsClient.NET esetében például a keresési függvény a következő:

static string GetEventHubName(string aliasName)
{
    const string SrvRecordPrefix = "_azure_eventhub._amqp.";
    LookupClient lookup = new LookupClient();

    return (from CNameRecord alias in (lookup.Query(aliasName, QueryType.CNAME).Answers)
            from SrvRecord srv in lookup.Query(SrvRecordPrefix + alias.CanonicalName, QueryType.SRV).Answers
            where srv.Port == 5671
            select srv.Target).FirstOrDefault()?.Value.TrimEnd('.');
}

A függvény a zóna 5671-as portjához regisztrált cél gazdagépnevet adja vissza, amely jelenleg a CNAME-val van aliasban, a fent látható módon.

A feladatátvétel végrehajtásához szerkeszteni kell a CNAME rekordot, és a másik zónára kell mutatni.

A DNS és különösen az Azure DNS használatának előnye, hogy az Azure DNS-információk globálisan replikálódnak, és így rugalmasak az egyrégiós kimaradásokkal szemben.

Ez az eljárás hasonló az Event Hubs Geo-DR működéséhez, de teljes mértékben saját felügyelete alatt áll, és aktív/aktív forgatókönyvekkel is működik.

Fájlmegosztás-alapú feladatátvételi konfiguráció

A legegyszerűbb alternatíva a DNS használata a végpontadatok megosztásához, ha az elsődleges végpont nevét egy egyszerű szöveges fájlba helyezi, és egy olyan infrastruktúrából szolgáltatja a fájlt, amely robusztus a kimaradásokkal szemben, és továbbra is lehetővé teszi a frissítéseket.

Ha már futtat egy magas rendelkezésre állású webhelyinfrastruktúrát globális rendelkezésre állással és tartalomreplikációs szolgáltatással, adjon hozzá egy ilyen fájlt, és szükség esetén tegye közzé újra a fájlt.

Figyelemfelhívás

A végpont nevét csak így teheti közzé, a titkos kulcsokat tartalmazó teljes kapcsolati sztring nem.

További szempontok a fogyasztók feladatátvétele esetén

Az Event Hub felhasználói számára a feladatátvételi stratégia további szempontjai az eseményfeldolgozó igényeitől függnek.

Ha olyan katasztrófa történik, amely szükségessé teszi egy rendszer , köztük az adatbázisok újraépítését a biztonsági mentési adatokból, és az adatbázisokat közvetlenül vagy köztes feldolgozással eteti az Eseményközpontban tárolt eseményekből, akkor visszaállítja a biztonsági mentést, majd meg szeretné kezdeni az események újratelepítését a rendszerbe attól a pillanattól kezdve, amikor az adatbázis biztonsági mentését létrehozták, és nem attól a pillanattól kezdve, amikor az eredeti rendszer megsemmisült.

Ha egy hiba csak a rendszer egy szeletét érinti, vagy csak egyetlen eseményközpontot, amely elérhetetlenné vált, valószínűleg körülbelül ugyanabból a helyről szeretné folytatni az események feldolgozását, ahol a feldolgozás megszakadt.

A forgatókönyvek megvalósításához és a megfelelő Azure SDK eseményfeldolgozójának használatához létre fog hozni egy új ellenőrzőpont-tárolót, és megadja a kezdeti partíciópozíciót a feldolgozás folytatásához használt időbélyeg alapján.

Ha továbbra is rendelkezik hozzáféréssel az átkapcsolt Eseményközpont ellenőrzőpont-tárához, a fent ismertetett propagált metaadatok segítségével kihagyhatja a már kezelt eseményeket, és pontosan onnan folytathatja azokat, ahol legutóbb abbahagyta.

Összefűzés

Az egyesítési minta egy vagy több replikációs feladattal rendelkezik, amely egy célra mutat, esetleg egyidejűleg a rendszeres gyártók is ugyanahhoz a célhoz küldik az eseményeket.

Ezeknek a pattereknek a változatai a következők:

  • Két vagy több replikációs függvény egyidejűleg különböző forrásokból szerzi be az eseményeket, és ugyanahhoz a célhoz küldi őket.
  • Még egy replikációs függvény, amely eseményeket szerez be egy forrásból, miközben a célértéket közvetlenül a gyártók is használják.
  • Az előző minta, de két vagy több Event Hub között tükrözve, így az eseményközpontok ugyanazokat a streameket tartalmazzák, függetlenül attól, hogy hol jönnek létre események.

Az első két mintaváltozat triviális, és nem különbözik az egyszerű replikációs feladatoktól.

Az utolsó forgatókönyvben a már replikált események ismételt replikálásának kizárása szükséges. A technikát az EventHubToEventHubMerge mintában mutatjuk be és mutatjuk be.

Szerkesztő

A szerkesztőminta a replikációs mintára épül, de az üzenetek továbbításuk előtt módosulnak.

Ilyen módosítások például a következők:

  • Átkódolás – Ha az esemény tartalma (más néven "törzs" vagy "hasznos adat") az Apache Avro formátummal vagy valamilyen védett szerializálási formátummal kódolt forrásból érkezik, de a célrendszer elvárása, hogy a tartalom JSON-kódolású legyen, a transzkódolási replikációs feladat először deszerializálja az Apache Avro hasznos adatait egy memórián belüli objektumgráfba, majd szerializálja a gráfot a JSON-ba formátumot a továbbított eseményhez. A transzkódolás tartalomtömörítési és dekompressziós feladatokat is tartalmaz.
  • Átalakítás – A strukturált adatokat tartalmazó események szükségessé tehetik az adatok átalakítását az alsóbb rétegbeli felhasználók általi könnyebb felhasználás érdekében. Ez magában foglalhatja a beágyazott struktúrák simítását, a felesleges adatelemek metszését, vagy a hasznos adatoknak az adott sémához való igazítását.
  • Kötegelés – Az események kötegekben (több esemény egyetlen átvitelben) fogadhatók egy forrásból, de egyenként kell továbbítani egy célnak, vagy fordítva. A tevékenységek ezért több eseményt is továbbíthatnak egyetlen bemeneti eseményátvitel alapján, vagy összesíthetik azokat az eseményeket, amelyeket aztán együtt adnak át.
  • Ellenőrzés – A külső forrásokból származó eseményadatokat gyakran ellenőrizni kell, hogy azok megfelelnek-e egy szabálykészletnek, mielőtt továbbítanák őket. A szabályok sémák vagy kódok használatával fejezhetők ki. Előfordulhat, hogy a nem megfelelő eseményeket a naplókban feljegyzett problémával együtt elvetik, vagy egy speciális célhelyre továbbítják, hogy tovább kezeljék őket.
  • Bővítés – Egyes forrásokból származó eseményadatok további környezettel bővíthetők ahhoz, hogy felhasználhatók legyenek a célrendszerekben. Ez magában foglalhatja a referenciaadatok megtekintését és az adatok eseménybe való beágyazását, vagy a replikációs feladat által ismert, de az eseményekben nem szereplő forrás információinak hozzáadását.
  • Szűrés – Előfordulhat, hogy a forrásból érkező egyes eseményeket valamilyen szabály alapján el kell zárni a céltól. Egy szűrő ellenőrzi az eseményt egy szabályon, és elveti az eseményt, ha az esemény nem felel meg a szabálynak. Az ismétlődő események kiszűrése bizonyos feltételek megfigyelésével és az azonos értékekkel rendelkező későbbi események elvetésével a szűrés egyik formája.
  • Titkosítás – Előfordulhat, hogy egy replikációs feladatnak vissza kell fejtenie a forrásból érkező tartalmakat, és/vagy titkosítania kell a célnak továbbított tartalmat, és/vagy ellenőriznie kell a tartalom és a metaadatok integritását az esemény során szállított aláíráshoz képest, vagy csatolnia kell egy ilyen aláírást.
  • Igazolás – A replikációs feladat a potenciálisan digitális aláírással védett metaadatokat csatolhatja egy olyan eseményhez, amely igazolja, hogy az esemény egy adott csatornán keresztül vagy adott időpontban érkezett.
  • Láncolás – A replikációs feladat aláírásokat alkalmazhat az események streamjeire, így a stream integritása védett, és a hiányzó események észlelhetők.

Az átalakítás, a kötegelés és a bővítési minták általában az Azure Stream Analytics-feladatok esetében a legjobban implementálódnak.

Ezek a minták az Azure Functions használatával implementálhatók az Event Hubs-eseményindítóval az események beszerzéséhez és az Event Hub kimeneti kötésének használatával.

Útválasztás

Az útválasztási minta a replikációs mintára épül, de egy forrás és egy cél helyett a replikációs feladat több célhoz is tartozik, amelyet itt a C#-ban mutatunk be:

[FunctionName("EH2EH")]
public static async Task Run(
    [EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
    [EventHub("dest1", Connection = "EventHubConnectionAppSetting")] EventHubClient output1,
    [EventHub("dest2", Connection = "EventHubConnectionAppSetting")] EventHubClient output2,
    ILogger log)
{
    foreach (EventData eventData in events)
    {
        // send to output1 and/or output2 based on criteria
        EventHubReplicationTasks.ConditionalForwardToEventHub(input, output1, log, (eventData) => {
            return ( inputEvent.SystemProperties.SequenceNumber%2==0 ) ? inputEvent : null;
        });
        EventHubReplicationTasks.ConditionalForwardToEventHub(input, output2, log, (eventData) => {
            return ( inputEvent.SystemProperties.SequenceNumber%2!=0 ) ? inputEvent : null;
        });
    }
}

Az útválasztási függvény figyelembe veszi az üzenet metaadatait és/vagy az üzenet hasznos adatait, majd kiválasztja az elérhető célhelyek egyikét.

Az Azure Stream Analyticsben ugyanezt úgy érheti el, hogy több kimenetet határoz meg, majd kimenetenként végrehajt egy lekérdezést.

select * into dest1Output from inputSource where Info = 1
select * into dest2Output from inputSource where Info = 2

Naplóvetítés

A naplóvetítési minta egy indexelt adatbázisba simítja az eseményfolyamot, és az események rekordjai lesznek az adatbázisban. Az események általában ugyanahhoz a gyűjteményhez vagy táblához vannak hozzáadva, és az Event Hub partíciókulcsa az elsődleges kulcs részévé válik, és egyedivé teszi a rekordot.

A naplóvetítés az eseményadatok idősoros történészét vagy egy tömörített nézetet hozhat létre, amellyel minden partíciókulcshoz csak a legújabb esemény marad meg. A céladatbázis alakja végső soron Önön és az alkalmazás igényein múlik. Ezt a mintát "esemény-forrásnak" is nevezik.

Tipp.

Az Azure Stream Analyticsben egyszerűen hozhat létre naplóvetítéseket az Azure SQL Database-ben és az Azure Cosmos DB-ben, és ezt a lehetőséget érdemes előnyben részesítenie.

Az alábbi Azure-függvény egy Azure Cosmos DB-gyűjteménybe tömörített Event Hub tartalmát alakítja ki.

[FunctionName("Eh1ToCosmosDb1Json")]
[ExponentialBackoffRetry(-1, "00:00:05", "00:05:00")]
public static async Task Eh1ToCosmosDb1Json(
    [EventHubTrigger("eh1", ConsumerGroup = "Eh1ToCosmosDb1", Connection = "Eh1ToCosmosDb1-source-connection")] EventData[] input,
    [CosmosDB(databaseName: "SampleDb", collectionName: "foo", ConnectionStringSetting = "CosmosDBConnection")] IAsyncCollector<object> output,
    ILogger log)
{
    foreach (var ev in input)
    {
        if (!string.IsNullOrEmpty(ev.SystemProperties.PartitionKey))
        {
            var record = new
            {
                id = ev.SystemProperties.PartitionKey,
                data = JsonDocument.Parse(ev.Body),
                properties = ev.Properties
            };
            await output.AddAsync(record);
        }
    }
}

Következő lépések