Quickstart: Realtimegebeurtenissen verwerken met behulp van Azure Functions

In dit artikel gebruikt u de Azure Developer CLI (azd) om een Event Hubs-triggerfunctie te maken voor realtime gebeurtenisverwerking in Azure Functions. Nadat u de code lokaal hebt gecontroleerd, implementeert u deze in een nieuwe serverloze functie-app die wordt uitgevoerd in een Flex Consumption-abonnement in Azure.

De projectbron gebruikt azd om de functie-app en gerelateerde resources te maken en uw code te implementeren in Azure. Deze implementatie volgt de huidige aanbevolen procedures voor veilige en schaalbare Azure Functions implementaties.

Het Flex Consumption-abonnement volgt standaard een factureringsmodel waarbij u betaalt voor wat u gebruikt. Dit betekent dat u dit artikel kunt voltooien en slechts een paar centen of minder kosten maakt in uw Azure-account.

Dit artikel ondersteunt versie 4 van het Node.js programmeermodel voor Azure Functions.

Dit artikel ondersteunt versie 2 van het Python-programmeermodel voor Azure Functions.

Vereiste voorwaarden

Het project initialiseren

Gebruik de azd init opdracht om een lokaal Azure Functions-codeproject te maken op basis van een sjabloon.

Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:

azd init --template functions-quickstart-dotnet-azd-eventhub -e eventhub-dotnet

Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.

Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:

azd init --template functions-quickstart-typescript-azd-eventhub -e eventhub-ts

Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.

Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:

azd init --template functions-quickstart-python-azd-eventhub -e eventhub-py

Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.

Een virtuele omgeving maken en activeren

Voer in de hoofdmap deze commando's uit om een virtuele omgeving met de naam .venv te creëren en te activeren.

python3 -m venv .venv
source .venv/bin/activate

Als Python het venv-pakket niet installeert in uw Linux-distributie, voert u de volgende opdracht uit:

sudo apt-get install python3-venv

Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:

azd init --template functions-quickstart-java-azd-eventhub -e eventhub-java

Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.

Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:

azd init --template functions-quickstart-javascript-azd-eventhub -e eventhub-js

Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.

Voer in uw lokale terminal of opdrachtprompt deze azd init opdracht uit in een lege map:

azd init --template functions-quickstart-powershell-azd-eventhub -e eventhub-ps

Met deze opdracht worden de projectbestanden opgehaald uit de sjabloonopslagplaats en wordt het project in de huidige map geïnitialiseerd. Met -e de vlag wordt een naam ingesteld voor de huidige omgeving. In azdde omgeving wordt een unieke implementatiecontext voor uw app onderhouden en kunt u meer dan één definiëren. De omgevingsnaam wordt ook gebruikt in de naam van de resourcegroep die u in Azure maakt.

Azure-resources maken

Voordat u uw functie lokaal kunt uitvoeren, moet u een Event Hubs-naamruimte en -hub maken in Azure. Gebruik azd provision om deze resources te maken en uw lokale instellingen te configureren door het vereiste local.settings.json-bestand toe te voegen.

  1. Voer de volgende opdracht uit om u aan te melden bij Azure:

    azd auth login
    

    Volg de aanwijzingen om te verifiëren met behulp van uw Azure-account.

  2. Voer vanuit de hoofdmap de volgende opdracht uit om uw Azure-resources te maken:

    azd provision
    
  3. Geef de volgende vereiste implementatieparameters op wanneer u hierom wordt gevraagd:

    Kenmerk Beschrijving
    Azure-abonnement Abonnement waarin u uw resources creëert.
    Azure-locatie De Azure-regio waar de resourcegroep wordt gecreëerd die de nieuwe Azure-resources bevat. Alleen regio's die momenteel ondersteuning bieden voor het Flex Consumption-abonnement, worden weergegeven.
    vnetEnabled Gebruik een waarde van False om de extra overhead van het maken van virtuele netwerkbronnen te voorkomen.

    Met de azd provision opdracht worden de vereiste Azure-resources gemaakt, waaronder een Event Hubs-naamruimte en -hub, een Flex Consumption-functie-app, Application Insights en een opslagaccount. Het configureert ook uw local.settings.json-bestand met de Event Hubs-verbindingsgegevens.

Uitvoeren in uw lokale omgeving

  1. Open een apart terminalvenster en start de Azurite-opslagemulator.

    azurite
    

    Het lokale Functions-hostproces maakt gebruik van de Azurite-emulator voor de interne opslagverbinding (AzureWebJobsStorage) die vereist is voor de runtime.

  1. Als u de functie-app wilt starten, voert u deze opdrachten uit in een terminal of opdrachtprompt om naar de src projectmap te navigeren en de functie-app te starten:

    cd src
    func start
    
  1. Als u de functie-app wilt starten, voert u deze opdracht uit in een terminal of opdrachtprompt:

    func start
    
  1. Als u de functie-app wilt bouwen en starten, voert u deze opdrachten uit in een terminal of opdrachtprompt:

    mvn clean package
    mvn azure-functions:run
    
  1. Als u afhankelijkheden wilt installeren en de functie-app wilt starten, voert u deze opdrachten uit in een terminal of opdrachtprompt:

    npm install
    npm start  
    
  1. Als u afhankelijkheden wilt installeren en de functie-app wilt starten, voert u deze opdrachten uit in een terminal of opdrachtprompt:

    cd src
    npm install
    npm start  
    
  1. Als u de functie-app wilt starten, voert u deze opdracht uit in een terminal of opdrachtprompt:

    func start
    
  1. Als u hierom wordt gevraagd, staat u toe dat Core Tools (func.exe) via de firewall worden aangeroepen.

  2. Wanneer de Functions-host wordt gestart in uw lokale projectmap, schrijft deze informatie over uw functies naar de terminaluitvoer.

    Dit voorbeeld bevat een timertriggerfunctie waarmee elke 10 seconden automatisch nieuwsartikelen worden gegenereerd en naar Event Hubs worden verzonden. De Event Hubs-triggerfunctie verwerkt deze gebeurtenissen en voert sentimentanalyses en betrokkenheidstracering uit.

    U ziet uitvoer die vergelijkbaar is met dit voorbeeld:

     [2026-03-02T22:37:30.151Z] Executing 'Functions.EventHubsTrigger'
     [2026-03-02T22:37:30.159Z] Trigger Details: PartitionId: 24, OffsetString: 0, EnqueueTimeUtc: 2026-03-02T22:37:29.1790000+00:00, SequenceNumber: 0, Count: 1, Offset: 0, PartionId: 24
     [2026-03-02T22:37:30.169Z] ⭐ High-engagement article NEWS-20260302-0580CB82 (Views: 6123, Sentiment: 0.57) featured!
     [2026-03-02T22:37:30.174Z] 🔥 Viral article: NEWS-20260302-0580CB82 - 6,123 views
     [2026-03-02T22:37:30.181Z] 🌟 Featured article: NEWS-20260302-0580CB82
     [2026-03-02T22:37:30.185Z] ✅ Successfully processed article NEWS-20260302-0580CB82 - 'Technology Breakthrough in Renewable Energy Technology' by Sarah Johnson
     [2026-03-02T22:37:30.191Z] 📰 Processed 1 news articles, 0 failed in batch of 1
     [2026-03-02T22:37:30.196Z] 📊 NEWS BATCH SUMMARY: 1 articles | Total Views: 6,123 | Avg Views: 6,123 | Avg Sentiment: 0.57 | Status: [Featured: 1]
     [2026-03-02T22:37:30.200Z] 📂 Top Categories: [Health: 1] | Top Sources: [Innovation Weekly: 1]
     [2026-03-02T22:37:30.204Z] 🔥 Viral articles in batch: 1
     [2026-03-02T22:37:30.207Z] Executed 'Functions.EventHubsTrigger' (Succeeded, Duration=55ms)
     
  3. Wanneer u klaar bent, drukt u op Ctrl+C in het terminalvenster om het func.exe hostproces te stoppen.

  4. Sluit het raam waarin Azurite loopt.

  1. Voer deactivate uit om de virtuele omgeving af te sluiten.

De code bekijken (optioneel)

U kunt de code bekijken waarmee de Event Hubs-triggerfunctie wordt gedefinieerd:

using System.Text.Json;
using Azure.Messaging.EventHubs;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace function_app;

public class EventHubsTrigger
{
    private readonly ILogger<EventHubsTrigger> _logger;
    private readonly NewsProcessingService _newsService;

    public EventHubsTrigger(ILogger<EventHubsTrigger> logger, NewsProcessingService newsService)
    {
        _logger = logger;
        _newsService = newsService;
    }

    [Function(nameof(EventHubsTrigger))]
    public async Task Run([EventHubTrigger("news", Connection = "EventHubConnection")] EventData[] input)
    {
        var processedArticles = new List<NewsArticle>();
        var failedEvents = 0;
        
        foreach (var message in input)
        {
            try
            {
                var messageBody = message.EventBody.ToString();

                // Parse the news article event
                var article = ParseNewsArticleEvent(messageBody);

                if (article != null)
                {
                    processedArticles.Add(article);
                }
                else
                {
                    failedEvents++;
                }
            }
            catch (Exception ex)
            {
                failedEvents++;
                _logger.LogWarning($"Error processing message: {ex.Message}");
            }
        }

        // Log summary of this execution
        _logger.LogInformation($"📰 Processed {processedArticles.Count} news articles, {failedEvents} failed in batch of {input.Length}");

U kunt het volledige sjabloonproject bekijken here.

package com.function;

import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.*;

import java.time.Instant;
import java.util.*;
import java.util.logging.Logger;

/**
 * Azure Function that processes messages from an input Event Hub,
 * adds metadata, and sends processed messages to an output Event Hub.
 */
public class EventHubsTriggerFunction {

    @FunctionName("EventHubsTrigger")
    public void run(
            @EventHubTrigger(
                name = "messages",
                eventHubName = "%INPUT_EVENTHUB_NAME%",
                connection = "EventHubConnection",
                cardinality = Cardinality.MANY)
            List<String> messages,
            @EventHubOutput(
                name = "output",
                eventHubName = "%OUTPUT_EVENTHUB_NAME%",
                connection = "EventHubConnection")
            OutputBinding<List<String>> output,
            final ExecutionContext context) {

        Logger logger = context.getLogger();
        logger.info(String.format("🔄 Event hub function processing %d message(s)", messages.size()));

        List<String> processedMessages = new ArrayList<>();

        for (String message : messages) {
            try {
                logger.info("📨 Processing event: " + message);

                // Create processed message with additional metadata
                String processedMessage = String.format(
                    "{\"id\":\"%s\",\"message\":%s,\"timestamp\":\"%s\"}",
                    UUID.randomUUID().toString(),
                    message,
                    Instant.now().toString());

                processedMessages.add(processedMessage);
                logger.info("\u2728 Message processed: " + processedMessage);

            } catch (Exception e) {
                logger.severe("\u274C Error processing message: " + e.getMessage());
            }
        }

        // Send processed messages to output Event Hub
        if (!processedMessages.isEmpty()) {
            output.setValue(processedMessages);
            logger.info(String.format("📤 Sent %d message(s) to output Event Hub", processedMessages.size()));
        }
    }
}

U kunt het volledige sjabloonproject bekijken here.

const { app, output } = require("@azure/functions");

const eventHubOutput = output.eventHub({
    connection: 'EventHubConnection',
    eventHubName: '%OUTPUT_EVENTHUB_NAME%'
});

async function EventHubsTrigger(messages, context) {
    context.log(`🔄 Event hub function processing ${messages.length} message(s)`);
    
    const processedMessages = [];
    
    for (const message of messages) {
        try {
            // Parse the incoming message
            const eventData = typeof message === 'string' ? JSON.parse(message) : message;
            context.log('📨 Processing event:', eventData);
            
            // Create processed message with additional metadata
            const processedMessage = {
                id: eventData.id || crypto.randomUUID(),
                message: eventData.message || JSON.stringify(eventData),
                timestamp: new Date().toISOString()
            };
            
            processedMessages.push(processedMessage);
            context.log('✨ Message processed:', processedMessage);
            
        } catch (error) {
            context.error(`❌ Error processing message: ${error}`);
        }
    }
    
    // Send processed messages to output Event Hub
    if (processedMessages.length > 0) {
        context.extraOutputs.set(eventHubOutput, processedMessages);
        context.log(`📤 Sent ${processedMessages.length} message(s) to output Event Hub`);
    }
}

app.eventHub('EventHubsTrigger', {
    connection: 'EventHubConnection',
    eventHubName: '%INPUT_EVENTHUB_NAME%',
    cardinality: 'many',
    extraOutputs: [eventHubOutput],
    handler: EventHubsTrigger
});

U kunt het volledige sjabloonproject bekijken here.

import { app, InvocationContext, output } from "@azure/functions";

interface EventMessage {
    id: string;
    message: string;
    timestamp: string;
}

const eventHubOutput = output.eventHub({
    connection: 'EventHubConnection',
    eventHubName: '%OUTPUT_EVENTHUB_NAME%'
});

export async function EventHubsTrigger(messages: unknown[], context: InvocationContext): Promise<void> {
    context.log(`🔄 Event hub function processing ${messages.length} message(s)`);
    
    const processedMessages: EventMessage[] = [];
    
    for (const message of messages) {
        try {
            // Parse the incoming message
            const eventData = typeof message === 'string' ? JSON.parse(message) : message;
            context.log('📨 Processing event:', eventData);
            
            // Create processed message with additional metadata
            const processedMessage: EventMessage = {
                id: eventData.id || crypto.randomUUID(),
                message: eventData.message || JSON.stringify(eventData),
                timestamp: new Date().toISOString()
            };
            
            processedMessages.push(processedMessage);
            context.log('✨ Message processed:', processedMessage);
            
        } catch (error) {
            context.error(`❌ Error processing message: ${error}`);
        }
    }
    
    // Send processed messages to output Event Hub
    if (processedMessages.length > 0) {
        context.extraOutputs.set(eventHubOutput, processedMessages);
        context.log(`📤 Sent ${processedMessages.length} message(s) to output Event Hub`);
    }
}

app.eventHub('EventHubsTrigger', {
    connection: 'EventHubConnection',
    eventHubName: '%INPUT_EVENTHUB_NAME%',
    cardinality: 'many',
    extraOutputs: [eventHubOutput],
    handler: EventHubsTrigger
});

U kunt het volledige sjabloonproject bekijken here.

param($InputEvents, $TriggerMetadata)

Write-Host "🔄 Event hub function processing $($InputEvents.Count) message(s)"

$processedMessages = @()

foreach ($message in $InputEvents) {
    try {
        # Parse the incoming message
        $eventData = $message | ConvertFrom-Json -ErrorAction SilentlyContinue
        if (-not $eventData) {
            $eventData = @{ message = $message }
        }

        Write-Host "📨 Processing event: $($eventData | ConvertTo-Json -Compress)"

        # Create processed message with additional metadata
        $processedMessage = @{
            id        = if ($eventData.id) { $eventData.id } else { [guid]::NewGuid().ToString() }
            message   = if ($eventData.message) { $eventData.message } else { ($eventData | ConvertTo-Json -Compress) }
            timestamp = (Get-Date).ToUniversalTime().ToString('o')
        }

        $processedMessages += $processedMessage
        Write-Host "✨ Message processed: $($processedMessage | ConvertTo-Json -Compress)"
    }
    catch {
        Write-Error "❌ Error processing message: $_"
    }
}

# Send processed messages to output Event Hub
if ($processedMessages.Count -gt 0) {
    Push-OutputBinding -Name OutputEvents -Value ($processedMessages | ConvertTo-Json -Compress)
    Write-Host "📤 Sent $($processedMessages.Count) message(s) to output Event Hub"
}

De trigger wordt gedefinieerd in de bijbehorende function.json.

U kunt het volledige sjabloonproject bekijken here.

import azure.functions as func
import logging
import json
from datetime import datetime, timezone
import random
import uuid
from typing import List

app = func.FunctionApp()

# News article data model
class NewsArticle:
            title=random.choice(titles_templates).format(topic=topic),
            content=f"Comprehensive coverage of the latest developments in {topic}. " * random.randint(10, 20),
            author=random.choice(authors),
            source=random.choice(sources),
            category=random.choice(categories),
            published_date=datetime.now(timezone.utc),
            view_count=random.randint(100, 10000),
            sentiment_score=round(random.uniform(-1.0, 1.0), 2),
            status=random.choice(["Published", "Featured"]),
            tags=[random.choice(topics) for _ in range(random.randint(3, 5))]
        )
        articles.append(article)
    
    # Send articles to Event Hub
    events_json = json.dumps([article.to_dict() for article in articles])
    event.set(events_json)
    
    logging.info(f'✅ HIGH-THROUGHPUT: Successfully generated {num_articles} news articles in ~10 seconds')


# Event Hub trigger - processes news articles
@app.event_hub_message_trigger(arg_name="events", event_hub_name="news",
                                connection="EventHubConnection")
def EventHubsTrigger(events: List[func.EventHubEvent]):
    """Process news articles from Event Hub with sentiment analysis and engagement tracking"""
    
    # Handle both single event and list of events
    if not isinstance(events, list):
        events = [events]
    
    batch_articles = []
    failed_count = 0
    
    for event in events:
        try:
            # Parse the event data
            event_data = json.loads(event.get_body().decode('utf-8'))
            
            # Handle both single article and array of articles
            articles = event_data if isinstance(event_data, list) else [event_data]
            
            for article_data in articles:
                # Process each article
                article_id = article_data.get('ArticleId')
                title = article_data.get('Title')
                author = article_data.get('Author')

U kunt het volledige sjabloonproject bekijken here.

Nadat u uw functie lokaal hebt gecontroleerd, is het tijd om deze te publiceren naar Azure.

Implementeren in Azure

Dit project is geconfigureerd om de azd up opdracht te gebruiken om uw code te implementeren in een nieuwe functie-app in een Flex Consumption-abonnement in Azure. Omdat u al resources hebt ingericht, implementeert deze opdracht uw code in de bestaande functie-app.

Aanbeveling

nl-NL: Dit project bevat een set Bicep-bestanden die azd gebruiken om een beveiligde implementatie te maken voor een Flex Consumption-plan dat de aanbevolen procedures volgt.

Voer vanuit de hoofdmap van de opslagplaats de volgende opdracht uit om uw codeproject te implementeren in de functie-app in Azure:

azd deploy

De implementatie verpakt uw code en implementeert deze in de functie-app. Wanneer de opdracht is voltooid, ziet u koppelingen naar de resources die u hebt gemaakt.

Implementatie verifiëren

Nadat de implementatie is voltooid, start uw Event Hubs-triggerfunctie automatisch met het verwerken van gebeurtenissen wanneer ze binnenkomen in de Event Hub.

  1. Ga in Azure Portal naar uw nieuwe functie-app.

  2. Selecteer Logboekstream vanuit het linkermenu om uw functie-uitvoeringen in realtime te monitoren.

  3. U ziet logboekvermeldingen die laten zien dat uw Event Hubs-triggerfunctie gebeurtenissen verwerkt die zijn gegenereerd door de Timer trigger.

Uw code opnieuw implementeren

Voer de opdracht azd up zo vaak uit als u nodig hebt om uw Azure-resources in te richten en code-updates voor uw functie-app te implementeren.

Opmerking

Geïmplementeerde codebestanden worden altijd overschreven door het nieuwste implementatiepakket.

Uw eerste reacties op azd-prompts en eventuele door azd gegenereerde omgevingsvariabelen worden lokaal opgeslagen in uw benoemde omgeving. Gebruik de azd env get-values opdracht om alle variabelen in uw omgeving te controleren die zijn gebruikt bij het maken van Azure-resources.

De hulpbronnen opschonen

Wanneer u klaar bent met het werken met uw functie-app en gerelateerde resources, gebruikt u deze opdracht om de functie-app en de bijbehorende resources uit Azure te verwijderen en te voorkomen dat er verdere kosten in rekening worden gebracht:

azd down --no-prompt

Opmerking

Met de --no-prompt optie krijgt u de opdracht azd om uw resourcegroep te verwijderen zonder een bevestiging van u.

Deze opdracht heeft geen invloed op uw lokale codeproject.