Pipeline zur Datenstromverarbeitung mit Azure Stream AnalyticsStream processing pipeline with Azure Stream Analytics

Diese Referenzarchitektur zeigt eine End-to-End-Pipeline zur Datenstromverarbeitung.This reference architecture shows an end-to-end stream processing pipeline. Die Pipeline erfasst Daten aus zwei Quellen, korreliert Datensätze in den beiden Datenströmen und berechnet einen gleitenden Durchschnitt über ein Zeitfenster.The pipeline ingests data from two sources, correlates records in the two streams, and calculates a rolling average across a time window. Die Ergebnisse werden zur weiteren Analyse gespeichert.The results are stored for further analysis.

GitHub-Logo Eine Referenzimplementierung dieser Architektur ist auf GitHub verfügbar.GitHub logo A reference implementation for this architecture is available on GitHub.

Referenzarchitektur für die Erstellung einer Pipeline zur Datenstromverarbeitung mit Azure Stream Analytics

Szenario: Ein Taxiunternehmen erfasst Daten zu jeder Taxifahrt.Scenario: A taxi company collects data about each taxi trip. In diesem Szenario gehen wir davon aus, dass zwei separate Geräte Daten senden.For this scenario, we assume there are two separate devices sending data. Das Taxi verfügt ein Messgerät, das Informationen zu jeder Fahrt sendet – die Dauer, die Strecke sowie die Abhol- und Zielorte.The taxi has a meter that sends information about each ride — the duration, distance, and pickup and dropoff locations. Ein separates Gerät akzeptiert Zahlungen von Kunden und sendet Daten zu den Fahrpreisen.A separate device accepts payments from customers and sends data about fares. Das Taxiunternehmen möchte das durchschnittliche Trinkgeld pro gefahrener Meile in Echtzeit berechnen, um Trends zu erkennen.The taxi company wants to calculate the average tip per mile driven, in real time, in order to spot trends.

ArchitectureArchitecture

Die Architektur umfasst die folgenden Komponenten.The architecture consists of the following components.

Datenquellen:Data sources. In dieser Architektur gibt es zwei Datenquellen, die Datenströme in Echtzeit generieren.In this architecture, there are two data sources that generate data streams in real time. Der erste Datenstrom enthält Informationen zur Fahrt und der zweite Informationen zum Fahrpreis.The first stream contains ride information, and the second contains fare information. Die Referenzarchitektur umfasst einen simulierten Datengenerator, der aus einem Satz von statischen Dateien liest und die Daten an Event Hubs pusht.The reference architecture includes a simulated data generator that reads from a set of static files and pushes the data to Event Hubs. In einer echten Anwendung würde es sich bei den Datenquellen um Geräte handeln, die in den Taxis installiert sind.In a real application, the data sources would be devices installed in the taxi cabs.

Azure Event Hubs:Azure Event Hubs. Event Hubs ist ein Ereigniserfassungsdienst.Event Hubs is an event ingestion service. Die hier gezeigte Architektur verwendet zwei Event Hub-Instanzen, eine für jede Datenquelle.This architecture uses two event hub instances, one for each data source. Jede Datenquelle sendet einen Datenstrom an den zugehörigen Event Hub.Each data source sends a stream of data to the associated event hub.

Azure Stream Analytics:Azure Stream Analytics. Stream Analytics ist ein Ereignisverarbeitungsmodul.Stream Analytics is an event-processing engine. Ein Stream Analytics-Auftrag liest die Datenströme aus den beiden Event Hubs und führt die Datenstromverarbeitung durch.A Stream Analytics job reads the data streams from the two event hubs and performs stream processing.

Cosmos DB:Cosmos DB. Die Ausgabe des Stream Analytics-Auftrags ist eine Reihe von Datensätzen, die als JSON-Dokumente in eine Cosmos DB-Dokumentdatenbank geschrieben werden.The output from the Stream Analytics job is a series of records, which are written as JSON documents to a Cosmos DB document database.

Microsoft Power BI:Microsoft Power BI. Power BI ist eine Suite aus Business Analytics-Tools zum Analysieren von Daten für Einblicke in Geschäftsvorgänge.Power BI is a suite of business analytics tools to analyze data for business insights. In dieser Architektur lädt Power BI die Daten aus Cosmos DB.In this architecture, it loads the data from Cosmos DB. Dadurch können Benutzer den vollständigen Satz von historischen Daten, die gesammelt wurden, analysieren.This allows users to analyze the complete set of historical data that's been collected. Sie könnten die Ergebnisse auch direkt von Stream Analytics an Power BI streamen, um die Daten in Echtzeit anzuzeigen.You could also stream the results directly from Stream Analytics to Power BI for a real-time view of the data. Weitere Informationen finden Sie unter Echtzeitstreaming in Power BI.For more information, see Real-time streaming in Power BI.

Azure Monitor:Azure Monitor. Azure Monitor erfasst Leistungsmetriken zu den in der Lösung bereitgestellten Azure-Diensten.Azure Monitor collects performance metrics about the Azure services deployed in the solution. Durch die Visualisierung dieser Metriken in einem Dashboard können Sie Erkenntnisse über die Integrität der Lösung gewinnen.By visualizing these in a dashboard, you can get insights into the health of the solution.

DatenerfassungData ingestion

Um eine Datenquelle zu simulieren, verwendet die Referenzarchitektur das Dataset New York City Taxi Data[1].To simulate a data source, this reference architecture uses the New York City Taxi Data dataset[1]. Dieses Dataset enthält Daten zu Taxifahrten in New York City für einen Zeitraum von vier Jahren (2010 - 2013).This dataset contains data about taxi trips in New York City over a four-year period (2010–2013). Es umfasst zwei Datensatztypen: Fahrtdaten und Fahrpreisdaten.It contains two types of record: ride data and fare data. Die Fahrtdaten enthalten die Fahrtdauer, die Fahrtstrecke sowie die Abhol- und Zielorte.Ride data includes trip duration, trip distance, and pickup and dropoff location. Die Fahrpreisdaten enthalten die Beträge von Fahrpreis, Steuern und Trinkgeld.Fare data includes fare, tax, and tip amounts. Gemeinsame Felder in beiden Datensatztypen sind die Taxinummer (Medallion), die Taxilizenz (Hack license) und die Anbieter-ID (Vendor ID).Common fields in both record types include medallion number, hack license, and vendor ID. Anhand dieser drei Felder werden ein Taxi und ein Fahrer eindeutig identifiziert.Together these three fields uniquely identify a taxi plus a driver. Die Daten werden im CSV-Format gespeichert.The data is stored in CSV format.

[1] Donovan, Brian; Work, Dan (2016): New York City Taxi Trip Data (2010 – 2013).[1] Donovan, Brian; Work, Dan (2016): New York City Taxi Trip Data (2010-2013). Universität Illinois in Urbana-Champaign.University of Illinois at Urbana-Champaign. https://doi.org/10.13012/J8PN93H8https://doi.org/10.13012/J8PN93H8

Der Datengenerator ist eine .NET Core-Anwendung, die Datensätze liest und an Azure Event Hubs sendet.The data generator is a .NET Core application that reads the records and sends them to Azure Event Hubs. Der Generator sendet Fahrtdaten im JSON-Format und Fahrpreisdaten im CSV-Format.The generator sends ride data in JSON format and fare data in CSV format.

Event Hubs verwendet Partitionen zum Segmentieren der Daten.Event Hubs uses partitions to segment the data. Partitionen ermöglichen es einem Consumer, die einzelnen Partitionen gleichzeitig zu lesen.Partitions allow a consumer to read each partition in parallel. Wenn Sie Daten an Event Hubs senden, können Sie den Partitionsschlüssel explizit angeben.When you send data to Event Hubs, you can specify the partition key explicitly. Andernfalls werden Datensätze nach einem Roundrobinverfahren Partitionen zugewiesen.Otherwise, records are assigned to partitions in round-robin fashion.

In diesem speziellen Szenario sollen Fahrtdaten und Fahrpreisdaten für ein bestimmtes Taxi die gleiche Partitions-ID erhalten.In this particular scenario, ride data and fare data should end up with the same partition ID for a given taxi cab. Dadurch kann Stream Analytics beim Korrelieren der beiden Datenströme einen Grad an Parallelität anwenden.This enables Stream Analytics to apply a degree of parallelism when it correlates the two streams. Ein Datensatz in der Partition n der Fahrtdaten entspricht einem Datensatz in der Partition n der Fahrpreisdaten.A record in partition n of the ride data will match a record in partition n of the fare data.

Diagramm der Datenstromverarbeitung mit Azure Stream Analytics und Event Hubs

Im Datengenerator enthält das gemeinsame Datenmodell für beide Datensatztypen eine PartitionKey-Eigenschaft, bei der es sich um die Verkettung von Medallion, HackLicense und VendorId handelt.In the data generator, the common data model for both record types has a PartitionKey property which is the concatenation of Medallion, HackLicense, and VendorId.

public abstract class TaxiData
{
    public TaxiData()
    {
    }

    [JsonProperty]
    public long Medallion { get; set; }

    [JsonProperty]
    public long HackLicense { get; set; }

    [JsonProperty]
    public string VendorId { get; set; }

    [JsonProperty]
    public DateTimeOffset PickupTime { get; set; }

    [JsonIgnore]
    public string PartitionKey
    {
        get => $"{Medallion}_{HackLicense}_{VendorId}";
    }

Diese Eigenschaft wird verwendet, um beim Senden der Daten an Event Hubs einen expliziten Partitionsschlüssel bereitzustellen:This property is used to provide an explicit partition key when sending to Event Hubs:

using (var client = pool.GetObject())
{
    return client.Value.SendAsync(new EventData(Encoding.UTF8.GetBytes(
        t.GetData(dataFormat))), t.PartitionKey);
}

DatenstromverarbeitungStream processing

Der Auftrag zur Datenstromverarbeitung wird anhand einer SQL-Abfrage mit mehreren separaten Schritten definiert.The stream processing job is defined using a SQL query with several distinct steps. In den ersten beiden Schritten werden lediglich Datensätze aus den zwei Eingabedatenströmen ausgewählt.The first two steps simply select records from the two input streams.

WITH
Step1 AS (
    SELECT PartitionId,
           TRY_CAST(Medallion AS nvarchar(max)) AS Medallion,
           TRY_CAST(HackLicense AS nvarchar(max)) AS HackLicense,
           VendorId,
           TRY_CAST(PickupTime AS datetime) AS PickupTime,
           TripDistanceInMiles
    FROM [TaxiRide] PARTITION BY PartitionId
),
Step2 AS (
    SELECT PartitionId,
           medallion AS Medallion,
           hack_license AS HackLicense,
           vendor_id AS VendorId,
           TRY_CAST(pickup_datetime AS datetime) AS PickupTime,
           tip_amount AS TipAmount
    FROM [TaxiFare] PARTITION BY PartitionId
),

Im nächsten Schritt werden die beiden Eingabedatenströme verknüpft, um übereinstimmende Datensätze aus jedem Datenstrom auszuwählen.The next step joins the two input streams to select matching records from each stream.

Step3 AS (
  SELECT
         tr.Medallion,
         tr.HackLicense,
         tr.VendorId,
         tr.PickupTime,
         tr.TripDistanceInMiles,
         tf.TipAmount
    FROM [Step1] tr
    PARTITION BY PartitionId
    JOIN [Step2] tf PARTITION BY PartitionId
      ON tr.Medallion = tf.Medallion
     AND tr.HackLicense = tf.HackLicense
     AND tr.VendorId = tf.VendorId
     AND tr.PickupTime = tf.PickupTime
     AND tr.PartitionId = tf.PartitionId
     AND DATEDIFF(minute, tr, tf) BETWEEN 0 AND 15
)

Diese Abfrage verknüpft Datensätze für eine Gruppe von Feldern, die übereinstimmende Datensätze eindeutig identifizieren („Medallion“, „HackLicense“, „VendorId“ und „PickupTime“).This query joins records on a set of fields that uniquely identify matching records (Medallion, HackLicense, VendorId, and PickupTime). Die JOIN-Anweisung enthält auch die Partitions-ID.The JOIN statement also includes the partition ID. Wie bereits erwähnt, wird hierbei die Tatsache genutzt, dass übereinstimmende Datensätze in diesem Szenario immer die gleiche Partitions-ID aufweisen.As mentioned, this takes advantage of the fact that matching records always have the same partition ID in this scenario.

In Stream Analytics sind Verknüpfungen temporal, d. h. Datensätze werden innerhalb eines bestimmten Zeitfensters verknüpft.In Stream Analytics, joins are temporal, meaning records are joined within a particular window of time. Andernfalls müsste der Auftrag möglicherweise unbegrenzt auf eine Übereinstimmung warten.Otherwise, the job might need to wait indefinitely for a match. Die Funktion DATEDIFF gibt an, wie weit zwei übereinstimmende Datensätze zeitlich auseinander liegen können, um als Übereinstimmung ermittelt zu werden.The DATEDIFF function specifies how far two matching records can be separated in time for a match.

Im letzten Schritt des Auftrags wird das durchschnittliche Trinkgeld pro Meile gruppiert anhand eines springenden Fensters von fünf Minuten berechnet.The last step in the job computes the average tip per mile, grouped by a hopping window of 5 minutes.

SELECT System.Timestamp AS WindowTime,
       SUM(tr.TipAmount) / SUM(tr.TripDistanceInMiles) AS AverageTipPerMile
  INTO [TaxiDrain]
  FROM [Step3] tr
  GROUP BY HoppingWindow(Duration(minute, 5), Hop(minute, 1))

Stream Analytics bietet mehrere Windowing-Funktionen.Stream Analytics provides several windowing functions. Ein springendes Fenster bewegt sich um einen festen Zeitraum vorwärts (in diesem Fall eine Minute pro Sprung).A hopping window moves forward in time by a fixed period, in this case 1 minute per hop. Auf diese Weise wird ein gleitender Durchschnitt für die letzten fünf Minuten berechnet.The result is to calculate a moving average over the past 5 minutes.

In der hier gezeigten Architektur werden nur die Ergebnisse des Stream Analytics-Auftrags in Cosmos DB gespeichert.In the architecture shown here, only the results of the Stream Analytics job are saved to Cosmos DB. Für ein Big Data-Szenario sollten Sie auch die Verwendung von Event Hubs Capture zum Speichern der Rohereignisdaten in Azure Blob Storage in Erwägung ziehen.For a big data scenario, consider also using Event Hubs Capture to save the raw event data into Azure Blob storage. Das Speichern der Rohdaten bietet Ihnen die Möglichkeit, zu einem späteren Zeitpunkt Batchabfragen für Ihre historischen Daten auszuführen, um neue Erkenntnisse aus den Daten zu gewinnen.Keeping the raw data will allow you to run batch queries over your historical data at later time, in order to derive new insights from the data.

Überlegungen zur SkalierbarkeitScalability considerations

Event HubsEvent Hubs

Die Durchsatzkapazität von Event Hubs wird in Durchsatzeinheiten gemessen.The throughput capacity of Event Hubs is measured in throughput units. Sie können einen Event Hub automatisch skalieren, indem Sie die Funktion für automatische Vergrößerung aktivieren. Dadurch werden die Durchsatzeinheiten basierend auf dem Datenverkehr automatisch bis zu einem konfigurierten Höchstwert hochskaliert.You can autoscale an event hub by enabling auto-inflate, which automatically scales the throughput units based on traffic, up to a configured maximum.

Stream AnalyticsStream Analytics

Für Stream Analytics werden die Computingressourcen, die einem Auftrag zugeordnet sind, in Streamingeinheiten gemessen.For Stream Analytics, the computing resources allocated to a job are measured in Streaming Units. Stream Analytics-Aufträge lassen sich am besten skalieren, wenn der Auftrag parallelisiert werden kann.Stream Analytics jobs scale best if the job can be parallelized. Auf diese Weise kann Stream Analytics den Auftrag auf mehrere Computeknoten verteilen.That way, Stream Analytics can distribute the job across multiple compute nodes.

Verwenden Sie für die Event Hubs-Eingabe das Schlüsselwort PARTITION BY, um den Stream Analytics-Auftrag zu partitionieren.For Event Hubs input, use the PARTITION BY keyword to partition the Stream Analytics job. Die Daten werden basierend auf den Event Hubs-Partitionen in Teilmengen aufgeteilt.The data will be divided into subsets based on the Event Hubs partitions.

Windowing-Funktionen und temporale Verknüpfungen erfordern zusätzliche Streamingeinheiten (SU).Windowing functions and temporal joins require additional SU. Verwenden Sie nach Möglichkeit PARTITION BY, sodass jede Partition separat verarbeitet wird.When possible, use PARTITION BY so that each partition is processed separately. Weitere Informationen finden Sie unter Überblick über Streamingeinheiten und Informationen zu Anpassungen.For more information, see Understand and adjust Streaming Units.

Falls es nicht möglich ist, den gesamten Stream Analytics-Auftrag zu parallelisieren, versuchen Sie, den Auftrag beginnend mit einem oder mehreren parallelen Schritten in mehrere Schritte zu unterteilen.If it's not possible to parallelize the entire Stream Analytics job, try to break the job into multiple steps, starting with one or more parallel steps. So können die ersten Schritte parallel ausgeführt werden.That way, the first steps can run in parallel. Für die hier gezeigte Referenzarchitektur gilt beispielsweise Folgendes:For example, in this reference architecture:

  • Die Schritte 1 und 2 sind einfache SELECT-Anweisungen, die Datensätze in einer einzelnen Partition auswählen.Steps 1 and 2 are simple SELECT statements that select records within a single partition.
  • Schritt 3 führt eine partitionierte Verknüpfung für zwei Eingabedatenströme durch.Step 3 performs a partitioned join across two input streams. Dieser Schritt macht sich die Tatsache zu Nutze, dass übereinstimmende Datensätze den gleichen Partitionsschlüssel aufweisen und daher immer in jedem Eingabedatenstrom die gleiche Partitions-ID haben.This step takes advantage of the fact that matching records share the same partition key, and so are guaranteed to have the same partition ID in each input stream.
  • Schritt 4 aggregiert Daten über alle Partitionen hinweg.Step 4 aggregates across all of the partitions. Dieser Schritt kann nicht parallelisiert werden.This step cannot be parallelized.

Verwenden Sie das Stream Analytics-Auftragsdiagramm, um festzustellen, wie viele Partitionen den einzelnen Schritten im Auftrag zugewiesen sind.Use the Stream Analytics job diagram to see how many partitions are assigned to each step in the job. Das folgende Diagramm zeigt das Auftragsdiagramm für diese Referenzarchitektur:The following diagram shows the job diagram for this reference architecture:

Auftragsdiagramm

Cosmos DBCosmos DB

Die Durchsatzkapazität für Cosmos DB wird in Anforderungseinheiten (RU) gemessen.Throughput capacity for Cosmos DB is measured in Request Units (RU). Um einen Cosmos DB-Container auf eine Kapazität über 10.000 RU zu skalieren, müssen Sie beim Erstellen des Containers einen Partitionsschlüssel angeben und den Partitionsschlüssel in jedem Dokument hinzufügen.In order to scale a Cosmos DB container past 10,000 RU, you must specify a partition key when you create the container, and include the partition key in every document.

In dieser Referenzarchitektur werden neue Dokumente nur einmal pro Minute (Intervall des springenden Fensters) erstellt, sodass die Durchsatzanforderungen relativ gering sind.In this reference architecture, new documents are created only once per minute (the hopping window interval), so the throughput requirements are quite low. In diesem Szenario ist es daher nicht erforderlich, einen Partitionsschlüssel zuzuweisen.For that reason, there's no need to assign a partition key in this scenario.

Aspekte der ÜberwachungMonitoring considerations

Bei jeder Lösung zur Verarbeitung von Datenströmen ist es wichtig, die Leistung und Integrität des Systems zu überwachen.With any stream processing solution, it's important to monitor the performance and health of the system. Azure Monitor erfasst Metriken und Diagnoseprotokolle für die in der Architektur verwendeten Azure-Dienste.Azure Monitor collects metrics and diagnostics logs for the Azure services used in the architecture. Azure Monitor ist in die Azure-Plattform integriert und erfordert keinen zusätzlichen Code in Ihrer Anwendung.Azure Monitor is built into the Azure platform and does not require any additional code in your application.

Jedes der folgenden Warnsignale weist darauf hin, dass Sie die jeweilige Azure-Ressource horizontal hochskalieren sollten:Any of the following warning signals indicate that you should scale out the relevant Azure resource:

  • Event Hubs drosselt Anforderungen oder nähert sich dem täglichen Nachrichtenkontingent.Event Hubs throttles requests or is close to the daily message quota.
  • Der Stream Analytics-Auftrag nutzt regelmäßig mehr als 80 % der zugeordneten Streamingeinheiten (SU).The Stream Analytics job consistently uses more than 80% of allocated Streaming Units (SU).
  • Cosmos DB beginnt, Anforderungen zu drosseln.Cosmos DB begins to throttle requests.

Die Referenzarchitektur enthält ein im Azure-Portal bereitgestelltes benutzerdefiniertes Dashboard.The reference architecture includes a custom dashboard, which is deployed to the Azure portal. Nachdem Sie die Architektur bereitgestellt haben, können Sie das Dashboard anzeigen, indem Sie das Azure-Portal öffnen und in der Liste mit den Dashboards den Eintrag TaxiRidesDashboard auswählen.After you deploy the architecture, you can view the dashboard by opening the Azure portal and selecting TaxiRidesDashboard from list of dashboards. Weitere Informationen zum Erstellen und Bereitstellen von benutzerdefinierten Dashboards im Azure-Portal finden Sie unter Programmgesteuertes Erstellen von Azure-Dashboards.For more information about creating and deploying custom dashboards in the Azure portal, see Programmatically create Azure Dashboards.

Die folgende Abbildung zeigt das Dashboard, nachdem der Stream Analytics-Auftrag etwa eine Stunde lang ausgeführt wurde.The following image shows the dashboard after the Stream Analytics job ran for about an hour.

Screenshot des Dashboards für Taxifahrten

Im unteren linken Bereich können Sie sehen, dass der SU-Verbrauch für den Stream Analytics-Auftrag während der ersten 15 Minuten ansteigt und dann gleichbleibt.The panel on the lower left shows that the SU consumption for the Stream Analytics job climbs during the first 15 minutes and then levels off. Dies ist ein typisches Muster, da der Auftrag einen stabilen Zustand erreicht.This is a typical pattern as the job reaches a steady state.

Beachten Sie, dass Event Hubs Anforderungen drosselt. Dies können Sie im oberen rechten Bereich sehen.Notice that Event Hubs is throttling requests, shown in the upper right panel. Das gelegentliche Drosseln einer Anforderung stellt kein Problem dar, da das Event Hubs-Client-SDK den Vorgang automatisch wiederholt, wenn es einen Drosselungsfehler empfängt.An occasional throttled request is not a problem, because the Event Hubs client SDK automatically retries when it receives a throttling error. Wenn jedoch regelmäßig Drosselungsfehler auftreten, bedeutet dies, dass der Event Hub mehr Durchsatzeinheiten benötigt.However, if you see consistent throttling errors, it means the event hub needs more throughput units. Das folgende Diagramm zeigt einen Testlauf mit der Event Hubs-Funktion zur automatischen Vergrößerung, die je nach Bedarf die Durchsatzeinheiten automatisch horizontal hochskaliert.The following graph shows a test run using the Event Hubs auto-inflate feature, which automatically scales out the throughput units as needed.

Screenshot der automatischen Skalierung von Event Hubs

Die automatische Vergrößerung wurde ungefähr bei 06:35 aktiviert.Auto-inflate was enabled at about the 06:35 mark. Wie Sie sehen, hat die Anzahl gedrosselter Anforderungen abgenommen, da Event Hubs automatisch auf drei Durchsatzeinheiten hochskaliert wurde.You can see the p drop in throttled requests, as Event Hubs automatically scaled up to 3 throughput units.

Als Nebenwirkung erhöhte sich dadurch interessanterweise die SU-Nutzung im Stream Analytics-Auftrag.Interestingly, this had the side effect of increasing the SU utilization in the Stream Analytics job. Durch die Drosselung hat Event Hubs die Erfassungsrate für den Stream Analytics-Auftrag künstlich reduziert.By throttling, Event Hubs was artificially reducing the ingestion rate for the Stream Analytics job. Tatsächlich kommt es häufig vor, dass durch die Behebung eines Leistungsengpasses ein anderer aufgedeckt wird.It's actually common that resolving one performance bottleneck reveals another. In diesem Fall konnte das Problem durch die Zuordnung zusätzlicher Streamingeinheiten für den Stream Analytics-Auftrag behoben werden.In this case, allocating additional SU for the Stream Analytics job resolved the issue.

Bereitstellen der LösungDeploy the solution

Führen Sie zum Bereitstellen und Ausführen der Referenzimplementierung die Schritte aus der GitHub-Infodatei aus.To the deploy and run the reference implementation, follow the steps in the GitHub readme.

Es wird empfohlen, sich das folgende Azure-Beispielszenario anzusehen. Darin wird veranschaulicht, wie einige dieser Technologien in spezifischen Lösungen verwendet werden:You may wish to review the following Azure example scenarios that demonstrate specific solutions using some of the same technologies: