Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
-
Java 21 Developer Kit
- Ange miljövariabeln
JAVA_HOMEtill installationsplatsen för rätt version av Java Development Kit (JDK).
- Ange miljövariabeln
- Apache Maven 3.8.x
- Node.js 22 eller senare
- Python 3.11 eller senare
Ett Azure-konto med en aktiv prenumeration. Skapa ett konto kostnadsfritt.
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.
Kör följande kommando för att logga in på Azure:
azd auth loginFölj anvisningarna för att autentisera med ditt Azure-konto.
Från rotmappen kör du följande kommando för att skapa dina Azure-resurser:
azd provisionAnge 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 Falseför för att undvika extra kostnader för att skapa virtuella nätverksresurser.Kommandot
azd provisionskapar 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ö
Starta Azurite Storage-emulatorn i ett separat terminalfönster:
azuriteDen lokala Functions-värdprocessen använder Azurite-emulatorn för den interna lagringsanslutningen (
AzureWebJobsStorage) som krävs av körmiljön.
Starta funktionsappen genom att köra dessa kommandon i en terminal eller kommandotolk för att navigera till projektmappen
srcoch starta funktionsappen:cd src func start
Starta funktionsappen genom att köra det här kommandot i en terminal eller kommandotolk:
func start
Om du vill skapa och starta funktionsappen kör du dessa kommandon i en terminal eller kommandotolk:
mvn clean package mvn azure-functions:run
Om du vill installera beroenden och starta funktionsappen kör du dessa kommandon i en terminal eller kommandotolk:
npm install npm start
Om du vill installera beroenden och starta funktionsappen kör du dessa kommandon i en terminal eller kommandotolk:
cd src npm install npm start
Starta funktionsappen genom att köra det här kommandot i en terminal eller kommandotolk:
func start
Om du uppmanas att göra det kan du låta Core Tools (func.exe) anropas via brandväggen.
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)
När du är klar trycker du på Ctrl+C i terminalfönstret för att stoppa
func.exevärdprocessen.Stäng fönstret där Azurite körs.
- Kör
deactivatefö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.
I Azure-portalen går du till din nya funktionsapp.
Välj Loggström i den vänstra menyn för att övervaka funktionskörningarna i realtid.
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.