Snabbstart: Bearbeta realtidshändelser med hjälp av Azure Functions

I den här artikeln använder du Azure Developer CLI (azd) för att skapa en Event Hubs-utlösarfunktion för händelsebearbetning i realtid i Azure Functions. När du har verifierat koden lokalt distribuerar du den till en ny serverlös funktionsapp som körs i en Flex Consumption-plan i Azure.

Projektkällan använder azd för att skapa funktionsappen och relaterade resurser och för att distribuera din kod till Azure. Den här distributionen följer aktuella metodtips för säkra och skalbara Azure Functions distributioner.

Som standard följer Flex Consumption-planen en faktureringsmodell för att betala för vad du använder , vilket innebär att du kan slutföra den här artikeln och bara medföra en liten kostnad på några USD cent eller mindre på ditt Azure-konto.

Den här artikeln stöder version 4 av Node.js programmeringsmodellen för Azure Functions.

Den här artikeln stöder version 2 av Python-programmeringsmodellen för Azure Functions.

Förutsättningar

Initiera projektet

azd init Använd kommandot för att skapa ett lokalt Azure Functions-kodprojekt från en mall.

Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

Skapa och aktivera en virtuell miljö

I rotmappen kör du dessa kommandon för att skapa och aktivera en virtuell miljö med namnet .venv:

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

Om Python inte installerar venv-paketet på Linux-distributionen kör du följande kommando:

sudo apt-get install python3-venv

Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

Kör det här azd init kommandot i en tom mapp i den lokala terminalen eller kommandotolken:

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

Det här kommandot hämtar projektfilerna från malllagringsplatsen och initierar projektet i den aktuella mappen. Flaggan -e anger ett namn för den aktuella miljön. I azdbehåller miljön en unik distributionskontext för din app och du kan definiera mer än en. Miljönamnet används också i namnet på den resursgrupp som du skapar i Azure.

Skapa Azure-resurser

Innan du kan köra funktionen lokalt måste du skapa ett Event Hubs-namnområde och en hubb i Azure. Använd azd provision för att skapa dessa resurser och konfigurera dina lokala inställningar genom att lägga till den nödvändiga local.settings.json filen.

  1. Kör följande kommando för att logga in på Azure:

    azd auth login
    

    Följ anvisningarna för att autentisera med ditt Azure-konto.

  2. Från rotmappen kör du följande kommando för att skapa dina Azure-resurser:

    azd provision
    
  3. Ange följande nödvändiga distributionsparametrar när du uppmanas att göra det:

    Parameter Beskrivning
    Azure-prenumeration Prenumeration där du skapar dina resurser.
    Azure-lokalisering Azure-region där du kan skapa resursgruppen som innehåller de nya Azure-resurserna. Endast regioner som för närvarande stöder Flex Consumption-planen visas.
    vnetEnabled Använd värdet False för för att undvika extra kostnader för att skapa virtuella nätverksresurser.

    Kommandot azd provision skapar nödvändiga Azure-resurser, inklusive en Event Hubs-namnrymd och hubb, en Flex Consumption-funktionsapp, Application Insights och ett lagringskonto. Den konfigurerar även din local.settings.json-fil med händelsehubbars-anslutningsinformationen.

Kör i din lokala miljö

  1. Starta Azurite Storage-emulatorn i ett separat terminalfönster:

    azurite
    

    Den lokala Functions-värdprocessen använder Azurite-emulatorn för den interna lagringsanslutningen (AzureWebJobsStorage) som krävs av körmiljön.

  1. Starta funktionsappen genom att köra dessa kommandon i en terminal eller kommandotolk för att navigera till projektmappen src och starta funktionsappen:

    cd src
    func start
    
  1. Starta funktionsappen genom att köra det här kommandot i en terminal eller kommandotolk:

    func start
    
  1. Om du vill skapa och starta funktionsappen kör du dessa kommandon i en terminal eller kommandotolk:

    mvn clean package
    mvn azure-functions:run
    
  1. Om du vill installera beroenden och starta funktionsappen kör du dessa kommandon i en terminal eller kommandotolk:

    npm install
    npm start  
    
  1. Om du vill installera beroenden och starta funktionsappen kör du dessa kommandon i en terminal eller kommandotolk:

    cd src
    npm install
    npm start  
    
  1. Starta funktionsappen genom att köra det här kommandot i en terminal eller kommandotolk:

    func start
    
  1. Om du uppmanas att göra det kan du låta Core Tools (func.exe) anropas via brandväggen.

  2. När Functions-värden startar i den lokala projektmappen skriver den information om dina funktioner till terminalens utdata.

    Det här exemplet innehåller en Timer-utlösarfunktion som automatiskt genererar nyhetsartiklar var 10:e sekund och skickar dem till Event Hubs. Utlösarfunktionen Event Hubs bearbetar sedan dessa händelser och utför attitydanalys och interaktionsspårning.

    Du ser utdata som liknar det här exemplet:

     [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. När du är klar trycker du på Ctrl+C i terminalfönstret för att stoppa func.exe värdprocessen.

  4. Stäng fönstret där Azurite körs.

  1. Kör deactivate för att stänga av den virtuella miljön.

Granska koden (valfritt)

Du kan granska koden som definierar event hubs-utlösarfunktionen:

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}");

Du kan granska hela mallprojektet 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()));
        }
    }
}

Du kan granska hela mallprojektet 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
});

Du kan granska hela mallprojektet 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
});

Du kan granska hela mallprojektet 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"
}

Utlösaren definieras i motsvarande function.json.

Du kan granska hela mallprojektet 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')

Du kan granska hela mallprojektet here.

När du har verifierat funktionen lokalt är det dags att publicera den till Azure.

Distribuera till Azure

Det här projektet är konfigurerat för att använda azd up kommandot för att distribuera koden till en ny funktionsapp i en Flex Consumption-plan i Azure. Eftersom du redan har etablerat resurser distribuerar det här kommandot koden till den befintliga funktionsappen.

Tips/Råd

Det här projektet innehåller en uppsättning Bicep-filer som azd använder för att skapa en säker distribution till en Flex Consumption-plan som följer bästa praxis.

Från lagringsplatsens rotmapp kör du följande kommando för att distribuera kodprojektet till funktionsappen i Azure:

azd deploy

Distributionen packar koden och distribuerar den till funktionappen. När kommandot har slutförts visas länkar till de resurser som du har skapat.

Verifiera driftsättningen

När distributionen är klar börjar händelsehubbens utlösarfunktion automatiskt bearbeta händelser när de kommer till händelsehubben.

  1. I Azure-portalen går du till din nya funktionsapp.

  2. Välj Loggström i den vänstra menyn för att övervaka funktionskörningarna i realtid.

  3. Du ser loggposter som visar att Event Hubs-utlösarfunktionen bearbetar händelser som genereras av Timer-utlösaren.

Åter driftsätt din kod

azd up Kör kommandot så många gånger du behöver både etablera dina Azure-resurser och distribuera koduppdateringar till funktionsappen.

Anmärkning

Distribuerade kodfiler skrivs alltid över av det senaste distributionspaketet.

Dina första svar på azd frågor och eventuella miljövariabler som genereras av azd lagras lokalt i din namngivna miljö. azd env get-values Använd kommandot för att granska alla variabler i din miljö som användes när du skapade Azure-resurser.

Rensa resurser

När du är klar med funktionsappen och relaterade resurser använder du det här kommandot för att ta bort funktionsappen och dess relaterade resurser från Azure och undvika ytterligare kostnader:

azd down --no-prompt

Anmärkning

Alternativet --no-prompt instruerar azd dig att ta bort resursgruppen utan någon bekräftelse från dig.

Det här kommandot påverkar inte ditt lokala kodprojekt.