Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Quickstart lernst du, wie du ein Durable Task SDK-Beispiel ausführst, das die Filterung von Arbeitselementen verwendet, um Orchestrierungen und Aktivitäten an dedizierte Worker weiterzuleiten.
Arbeitsitem-Filterung ist derzeit in den .NET-, Java- und Python Durable Task SDKs verfügbar. Wählen Sie Ihre Sprache über die Tabs oben auf der Seite aus. Um zu erfahren, wie Workitem-Filterung funktioniert und wie es flache Vernetzung über heterogene Rechenleistungen hinweg ermöglicht, siehe Work Item-Filterung im Durable Task Scheduler.
Note
Die Filterung von Arbeitselementen ist für die JavaScript- und PowerShell-Durable-Task-SDKs noch nicht verfügbar. Um diese Funktion heute auszuprobieren, wählen Sie oben auf der Seite den Tab C#, Java oder Python aus.
- Richten Sie den Emulator "Durable Task Scheduler" für die lokale Entwicklung ein und führen Sie diesen aus.
- Führe die Worker Orchestrator, Validator und Shipper sowie den Client aus.
- Stellen Sie sicher, dass Arbeitsaufgaben nur an übereinstimmende Mitarbeiter weitergeleitet werden.
- Stellen Sie das Beispiel für Azure-Container-Apps mithilfe der Azure Developer CLI bereit.
Voraussetzungen
Bevor Sie beginnen:
- Installieren Sie .NET 10 SDK oder höher.
- Installieren Sie Docker zum Ausführen des Emulators.
- Installieren Sie die Azure Developer CLI.
- Klonen Sie das GitHub-Repository "Durable Task Scheduler".
Vorbereiten des Projekts
Navigieren Sie aus dem Azure-Samples/Durable-Task-Scheduler Stammverzeichnis zum Beispielverzeichnis:
cd samples/scenarios/WorkItemFilteringSplitActivities
Lokal mit dem Emulator ausführen
Laden Sie das Emulator-Image herunter:
docker pull mcr.microsoft.com/durable-task/emulator:latestFühren Sie den Emulator aus:
docker run -d --name dts-emulator -p 8080:8080 -p 8082:8082 mcr.microsoft.com/durable-task/emulator:latestErstellen Sie das Beispiel:
dotnet buildFühre jeden Worker in einem separaten Terminal aus:
Terminal 1 – Orchestrator-Worker
dotnet run --project src/OrchestratorWorkerTerminal 2 – Validator-Arbeiter
dotnet run --project src/ValidatorWorkerTerminal 3 – Versandarbeiter
dotnet run --project src/ShipperWorkerFühren Sie in einem vierten Terminal den Client aus:
dotnet run --project src/ClientÖffnen Sie das Emulatordashboard unter
http://localhost:8082, um die Orchestrierungsaktivität zu überwachen.
Tip
Als Alternative zum manuellen Öffnen von vier Terminals können Sie das enthaltene Komfortskript ausführen:
./run-local.sh
Er startet den Emulator, erstellt die Lösung und startet alle Mitarbeiter und den Client.
Erwartetes Ergebnis der Arbeitsvorgangsfilterung
Der Client startet alle 30 Sekunden eine Gruppe von drei Orchestrierungen und wiederholt dies etwa 10 Minuten lang. Über die Terminals hinweg sehen Sie:
- Der Client plant Orchestrierungs-Batches und wartet, bis jeder Batch abgeschlossen ist. Ein fertiger Batch protokolliert
3 completed, 0 failed. - Der Orchestrator-Worker setzt
ValidateOrder- undShipOrder-Aktivitätsaufrufe ab. - Der Validator-Worker bearbeitet nur
ValidateOrder-Aktivitätsarbeitselemente. - Der Versender-Arbeiter übernimmt nur
ShipOrderAktivitätsaufgaben.
Dieses Verhalten bestätigt, dass die Filterung von Arbeitsaufgaben Elemente nur an Mitarbeiter weitergibt, die übereinstimmende Aufgabentypen registriert haben.
Wenn man mindestens einen Batch-Bericht 3 completed, 0 failedsieht, funktioniert die Probe wie erwartet. Du musst nicht warten, bis die vollständige Schleife vorbei ist – drücke in jedem Terminal Strg+C, um den Client und die Arbeiter zu stoppen. Wenn du den Client bis zum Ende laufen lässt, druckt er eine Endergebniszusammenfassung und bleibt dann lebendig, bis du ihn mit Strg+C stoppst.
Probieren Sie es aus: Striktes Routing-Experiment
Um festzustellen, dass das Routing streng ist (kein Fallback für andere Mitarbeiter):
- Beenden Sie den Versandarbeiter (STRG+C in Terminal 3).
- Führen Sie den Client erneut aus, um neue Orchestrierungen zu planen.
- Beachten Sie Folgendes:
- Der Orchestrator-Worker nimmt Orchestrierungen auf und startet sie.
- Der Validator-Worker führt
ValidateOrderfür jeden Auftrag aus. -
ShipOrderArbeitselemente bleiben ausstehend – die Validator- und Orchestrator-Worker empfangen sie nicht. - Die Orchestrierungen bleiben im Status „Wird ausgeführt“ und warten, bis
ShipOrderabgeschlossen ist.
- Starte den Shipper Worker neu – die ausstehenden
ShipOrderArbeitsaufgaben werden sofort geliefert und die Orchestrierungen abgeschlossen.
Dieses Experiment zeigt, dass Arbeitsobjekte nur an Arbeiter mit passenden Filtern weitergeleitet werden. Es gibt keine Ausweichmöglichkeit.
Bereitstellen mithilfe der Azure Developer CLI
Authentifizieren mit Azure (sofern noch nicht geschehen):
azd auth loginVon
samples/scenarios/WorkItemFilteringSplitActivitiesaus ausführen:azd upWenn Sie im Terminal dazu aufgefordert werden, geben Sie die folgenden Parameter an:
Parameter Beschreibung Umgebungsname Präfix für die Ressourcengruppe, die erstellt wurde, um alle Azure Ressourcen zu enthalten. Azure-Standort Der Azure-Speicherort für Ihre Ressourcen. Azure-Abonnement Das Azure-Abonnement für Ihre Ressourcen.
Der azd up Befehl stellt Azure-Ressourcen bereit und stellt vier containerisierte Dienste aus diesem Beispiel bereit: Client-, Orchestrator-Worker, Validator-Worker und Versandmitarbeiter.
Erfolgreiche Bereitstellung bestätigen
Kopieren Sie in der
azd upAusgabe den Ressourcengruppennamen.Öffnen Sie im Azure-Portal diese Ressourcengruppe.
Öffnen Sie für jede bereitgestellte Container-App (
client,orchestrator-worker,validator-workershipper-worker), denÜberwachungsprotokolldatenstrom>.Überprüfen Sie, ob jede App nur die erwarteten Arbeitsaufgaben protokolliert:
-
orchestrator-worker: Orchestrierungsarbeit. -
validator-worker:ValidateOrderAktivität. -
shipper-worker:ShipOrderAktivität.
-
Note
Jede Container-App wird mit einer KEDA-Skalierungsregel (azure-durabletask-scheduler) konfiguriert, die Worker basierend auf dem ausstehenden Arbeitselementbacklog automatisch von 0 auf 10 Replikate skaliert. Wenn der Client seine Schleife beendet hat und keine Arbeitselemente verbleiben, werden die Worker auf Null zurückskaliert. Weitere Informationen finden Sie unter Automatisches Skalieren von langlebigen Aufgabenplanern in Azure Container Apps.
Verstehe den Arbeitsitem-Filtercode in C #
Die Orchestrierung ruft zwei Aktivitäten in Folge auf. Der Scheduler leitet jedes Aktivitätselement an den Arbeiter weiter, der es registriert hat.
public override async Task<string> RunAsync(TaskOrchestrationContext context, string orderId)
{
string validationResult = await context.CallActivityAsync<string>("ValidateOrder", orderId);
string shippingResult = await context.CallActivityAsync<string>("ShipOrder", orderId);
return $"Order '{orderId}' => Validation: [{validationResult}], Shipping: [{shippingResult}]";
}
Jeder Mitarbeiter registriert nur seine lokalen Aufgaben. Das SDK generiert automatisch Arbeitsitem-Filter aus der Task-Registry, sodass du dich nicht explizit anmelden musst.
builder.Services.AddDurableTaskWorker()
.AddTasks(registry =>
{
// Only this worker's tasks are registered.
// Work item filters are auto-generated from the registry, so this
// worker only receives matching work items.
registry.AddAllGeneratedTasks();
})
.UseDurableTaskScheduler(connectionString);
Note
Im .NET Durable Task SDK werden Filter für Arbeitselemente automatisch anhand dessen generiert, was jeder Worker jeweils registriert. Um die generierten Filter zu überschreiben oder das Filtern zu deaktivieren, rufen Sie jeweils UseWorkItemFilters(null) bzw. UseWorkItemFilters(customFilters) auf.
Beispiel:
-
OrchestratorWorkerregistriertOrderProcessingOrchestration. -
ValidatorWorkerregistriertValidateOrder. -
ShipperWorkerregistriertShipOrder.
Wenn ein Worker eine Verbindung mit dem permanenten Aufgabenplaner herstellt, sendet das SDK seine Filterliste. Der Scheduler erstellt Warteschlangen pro Filter und leitet jede Arbeitsaufgabe an die entsprechende Warteschlange weiter. Mitarbeiter erhalten nie Arbeitsaufgabentypen, die sie nicht registriert haben.
Bereinigen von Ressourcen
Stoppe den lokalen Emulator-Container.
docker rm -f dts-emulatorWenn Sie in Azure bereitgestellt haben, identifizieren Sie den Namen der Ressourcengruppe:
- Kopieren Sie es aus der
azd upAusgabe. - Oder benutze im Azure-Portal das globale Suchfeld am oberen Rand und suche nach
rg-oder dem Präfix deines Umgebungsnamens.
- Kopieren Sie es aus der
Öffnen Sie die Ressourcengruppe aus den Suchergebnissen.
Wählen Sie "Ressourcengruppe löschen", geben Sie den zu bestätigenden Namen der Ressourcengruppe ein, und wählen Sie dann "Löschen" aus.
Nächste Schritte
- Erfahren Sie mehr über die automatische Skalierung des permanenten Aufgabenplanungsmoduls in Azure-Container-Apps.
- Lesen Sie anleitungen zur Problembehandlung.
- Richten Sie den Emulator "Durable Task Scheduler" für die lokale Entwicklung ein und führen Sie diesen aus.
- Führe die Worker Orchestrator, Validator und Shipper sowie den Client aus.
- Stellen Sie sicher, dass Arbeitsaufgaben nur an übereinstimmende Mitarbeiter weitergeleitet werden.
- Stellen Sie das Beispiel für Azure-Container-Apps mithilfe der Azure Developer CLI bereit.
Voraussetzungen
Bevor Sie beginnen:
- Java 21 oder höher.
- Docker zum Ausführen des Emulators.
- Azure Developer CLI.
- Klonen Sie das GitHub-Repository "Durable Task Scheduler".
Vorbereiten des Projekts
Vom Azure-Samples/Durable-Task-Scheduler Root-Verzeichnis aus gehen Sie zum Beispielverzeichnis:
cd samples/scenarios/WorkItemFilteringSplitActivitiesJava
Lokal mit dem Emulator ausführen
Zieh das Emulator-Image herunter.
docker pull mcr.microsoft.com/dts/dts-emulator:latestFühren Sie den Emulator aus.
docker run -d --name dts-emulator -p 8080:8080 -p 8082:8082 mcr.microsoft.com/dts/dts-emulator:latestErstellen Sie das Beispiel.
./gradlew buildFühre jeden Worker in einem separaten Terminal aus:
Terminal 1 – Orchestrator-Worker
./gradlew :orchestrator-worker:runTerminal 2 – Validator-Arbeiter
./gradlew :validator-worker:runTerminal 3 – Versandarbeiter
./gradlew :shipper-worker:runFühren Sie den Client in einem vierten Terminal aus.
./gradlew :client:runÖffnen Sie das Emulatordashboard unter
http://localhost:8082, um die Orchestrierungsaktivität zu überwachen.
Erwartetes Ergebnis der Arbeitsvorgangsfilterung
Der Client startet alle 30 Sekunden eine Gruppe von drei Orchestrierungen und wiederholt dies etwa 10 Minuten lang. Über die Terminals hinweg sehen Sie:
- Der Client plant Orchestrierungs-Batches und wartet, bis jeder Batch abgeschlossen ist. Ein fertiger Batch protokolliert
3 completed, 0 failed. - Der Orchestrator-Worker setzt
ValidateOrder- undShipOrder-Aktivitätsaufrufe ab. - Der Validator-Worker bearbeitet nur
ValidateOrder-Aktivitätsarbeitselemente. - Der Versender-Arbeiter übernimmt nur
ShipOrderAktivitätsaufgaben.
Dieses Verhalten bestätigt, dass die Filterung von Arbeitsaufgaben Elemente nur an Mitarbeiter weitergibt, die übereinstimmende Aufgabentypen registriert haben.
Wenn man mindestens einen Batch-Bericht 3 completed, 0 failedsieht, funktioniert die Probe wie erwartet. Du musst nicht warten, bis die vollständige Schleife vorbei ist – drücke in jedem Terminal Strg+C, um den Client und die Arbeiter zu stoppen. Wenn du den Client bis zum Ende laufen lässt, druckt er eine Endergebniszusammenfassung und bleibt dann lebendig, bis du ihn mit Strg+C stoppst.
Probieren Sie es aus: Striktes Routing-Experiment
Um festzustellen, dass das Routing streng ist (kein Fallback für andere Mitarbeiter):
- Beenden Sie den Versandarbeiter (STRG+C in Terminal 3).
- Führen Sie den Client erneut aus, um neue Orchestrierungen zu planen.
- Beachten Sie Folgendes:
- Der Orchestrator-Worker nimmt Orchestrierungen auf und startet sie.
- Der Validator-Worker führt
ValidateOrderfür jeden Auftrag aus. -
ShipOrderArbeitselemente bleiben ausstehend – die Validator- und Orchestrator-Worker empfangen sie nicht. - Die Orchestrierungen bleiben im Status „Wird ausgeführt“ und warten, bis
ShipOrderabgeschlossen ist.
- Starte den Shipper Worker neu – die ausstehenden
ShipOrderArbeitsaufgaben werden sofort geliefert und die Orchestrierungen abgeschlossen.
Dieses Experiment zeigt, dass Arbeitsobjekte nur an Arbeiter mit passenden Filtern weitergeleitet werden. Es gibt keine Ausweichmöglichkeit.
Bereitstellen mithilfe der Azure Developer CLI
Authentifizieren mit Azure (sofern noch nicht geschehen):
azd auth loginVon
samples/scenarios/WorkItemFilteringSplitActivitiesJavaaus ausführen:azd upWenn Sie im Terminal dazu aufgefordert werden, geben Sie die folgenden Parameter an:
Parameter Beschreibung Umgebungsname Präfix für die Ressourcengruppe, die erstellt wurde, um alle Azure Ressourcen zu enthalten. Azure-Standort Der Azure-Speicherort für Ihre Ressourcen. Azure-Abonnement Das Azure-Abonnement für Ihre Ressourcen.
Der azd up Befehl stellt Azure-Ressourcen bereit und stellt vier containerisierte Dienste aus diesem Beispiel bereit: Client-, Orchestrator-Worker, Validator-Worker und Versandmitarbeiter.
Erfolgreiche Bereitstellung bestätigen
Kopieren Sie in der
azd upAusgabe den Ressourcengruppennamen.Öffnen Sie im Azure-Portal diese Ressourcengruppe.
Öffnen Sie für jede bereitgestellte Container-App (
client,orchestrator-worker,validator-workershipper-worker), denÜberwachungsprotokolldatenstrom>.Überprüfen Sie, ob jede App nur die erwarteten Arbeitsaufgaben protokolliert:
-
orchestrator-worker: Orchestrierungsarbeit. -
validator-worker:ValidateOrderAktivität. -
shipper-worker:ShipOrderAktivität.
-
Note
Jede Container-App wird mit einer KEDA-Skalierungsregel (azure-durabletask-scheduler) konfiguriert, die Worker basierend auf dem ausstehenden Arbeitselementbacklog automatisch von 0 auf 10 Replikate skaliert. Wenn der Client seine Schleife beendet hat und keine Arbeitselemente verbleiben, werden die Worker auf Null zurückskaliert. Weitere Informationen finden Sie unter Automatisches Skalieren von langlebigen Aufgabenplanern in Azure Container Apps.
Verstehen Sie den Code zur Filterung von Arbeitsgegenständen in Java
Die Orchestrierung ruft zwei Aktivitäten in Folge auf. Der Scheduler leitet jedes Aktivitätselement an den Arbeiter weiter, der es registriert hat.
String validationResult = ctx.callActivity("ValidateOrder", orderId, String.class).await();
String shippingResult = ctx.callActivity("ShipOrder", orderId, String.class).await();
String combined = String.format("Order '%s' => Validation: [%s], Shipping: [%s]",
orderId, validationResult, shippingResult);
ctx.complete(combined);
Jeder Mitarbeiter registriert nur seine lokalen Aufgaben und Aufrufe useWorkItemFilters() , um die Filterung zu aktivieren. Anschließend generiert das SDK Arbeitsaufgabenfilter aus der Aufgabenregistrierung.
DurableTaskGrpcWorker worker = DurableTaskSchedulerWorkerExtensions
.createWorkerBuilder(connectionString)
.addActivity(new TaskActivityFactory() {
// ...
})
.useWorkItemFilters() // auto-generate from registered tasks
.build();
Note
Jeder Worker muss useWorkItemFilters() explizit aufrufen, um das Filtern zu aktivieren. Worker, die keine Aufrufe ausführen, erhalten alle Arten von Arbeitselementen.
Beispiel:
-
OrchestratorWorkerregistriertOrderProcessingOrchestration. -
ValidatorWorkerregistriertValidateOrder. -
ShipperWorkerregistriertShipOrder.
Wenn ein Worker eine Verbindung mit dem permanenten Aufgabenplaner herstellt, sendet das SDK seine Filterliste. Der Scheduler erstellt Warteschlangen pro Filter und leitet jede Arbeitsaufgabe an die entsprechende Warteschlange weiter. Mitarbeiter erhalten nie Arbeitsaufgabentypen, die sie nicht registriert haben.
Um explizite Filter anstelle der automatischen Generierung aus dem Register bereitzustellen, übergebe a WorkItemFilter an useWorkItemFilters():
WorkItemFilter filter = WorkItemFilter.newBuilder()
.addOrchestration("OrderProcessingOrchestration")
.addActivity("ValidateOrder")
.build();
builder.useWorkItemFilters(filter);
Bereinigen von Ressourcen
Stoppe den lokalen Emulator-Container.
docker rm -f dts-emulatorWenn Sie in Azure bereitgestellt haben, identifizieren Sie den Namen der Ressourcengruppe:
- Kopieren Sie es aus der
azd upAusgabe. - Oder benutze im Azure-Portal das globale Suchfeld am oberen Rand und suche nach
rg-oder dem Präfix deines Umgebungsnamens.
- Kopieren Sie es aus der
Öffnen Sie die Ressourcengruppe aus den Suchergebnissen.
Wählen Sie "Ressourcengruppe löschen", geben Sie den zu bestätigenden Namen der Ressourcengruppe ein, und wählen Sie dann "Löschen" aus.
Nächste Schritte
- Erfahren Sie mehr über die automatische Skalierung des permanenten Aufgabenplanungsmoduls in Azure-Container-Apps.
- Lesen Sie anleitungen zur Problembehandlung.
- Richten Sie den Emulator "Durable Task Scheduler" für die lokale Entwicklung ein und führen Sie diesen aus.
- Starte Worker A, Worker B und den Client.
- Stellen Sie sicher, dass Arbeitsaufgaben nur an übereinstimmende Mitarbeiter weitergeleitet werden.
Voraussetzungen
Bevor Sie beginnen:
- Python 3.10 oder höher.
- Docker zum Ausführen des Emulators.
- Azure CLI, wenn du einen bereitgestellten Durable Task Scheduler verwendest.
- Klonen Sie das GitHub-Repository "Durable Task Scheduler".
Vorbereiten des Projekts
Vom Azure-Samples/Durable-Task-Scheduler Root-Verzeichnis aus gehen Sie zum Beispielverzeichnis:
cd samples/durable-task-sdks/python/work-item-filtering
Lokal mit dem Emulator ausführen
Zieh das Emulator-Image herunter.
docker pull mcr.microsoft.com/dts/dts-emulator:latestFühren Sie den Emulator aus.
docker run -d --name dts-emulator -p 8080:8080 -p 8082:8082 mcr.microsoft.com/dts/dts-emulator:latestDas Beispiel verwendet die Standard-Emulator-Einstellungen (Endpunkt
http://localhost:8080und Task-Hubdefault), sodass du keine Umgebungsvariablen setzen musst.(Optional) Erstellen und aktivieren Sie eine virtuelle Python-Umgebung.
python -m venv venv source venv/bin/activate # On Windows, use: venv\Scripts\activateInstallieren Sie die erforderlichen Pakete.
pip install -r requirements.txtFühre jeden Worker in einem separaten Terminal aus:
Terminal 1 – Arbeiter A (Begrüßung)
python worker_a.pyTerminal 2 – Arbeiter B (Mathematik)
python worker_b.pyIn einem dritten Terminal starten Sie den Client.
python client.pyÖffnen Sie das Emulatordashboard unter
http://localhost:8082, um die Orchestrierungsaktivität zu überwachen.
Erwartetes Ergebnis der Arbeitsvorgangsfilterung
Der Client plant eine Begrüßungsorchestrierung und eine mathematische Orchestrierung und wartet dann, bis beide fertig sind. Über die Terminals hinweg sehen Sie:
- Arbeiter A verarbeitet nur die Begrüßungsorchestrierung und ihre zugehörige
say_hello-Aktivität. - Arbeiter B verarbeitet nur die mathematische Orchestrierung und deren
add_numbersAktivität. - Der Client druckt das Ergebnis jeder Orchestrierung.
Dieses Verhalten bestätigt, dass die Filterung von Arbeitsaufgaben Elemente nur an Mitarbeiter weitergibt, die übereinstimmende Aufgabentypen registriert haben.
Verstehe den Code zum Filtern von Arbeitsobjekten in Python
Jeder Mitarbeiter registriert nur seine lokalen Aufgaben und Aufrufe use_work_item_filters() , um die Filterung zu aktivieren. Das SDK generiert die Arbeitsitem-Filter aus den registrierten Aufgaben.
worker.add_orchestrator(greeting_orchestrator)
worker.add_activity(say_hello)
worker.use_work_item_filters() # Auto-generate from the registry
Note
Jeder Worker muss use_work_item_filters() explizit aufrufen, um das Filtern zu aktivieren. Worker, die keine Aufrufe ausführen, erhalten alle Arten von Arbeitselementen.
Beispiel:
- Arbeiter A registriert
greeting_orchestratorundsay_hello. - Arbeiter B registriert
math_orchestratorundadd_numbers.
Wenn ein Worker eine Verbindung mit dem permanenten Aufgabenplaner herstellt, sendet das SDK seine Filterliste. Der Scheduler erstellt Warteschlangen pro Filter und leitet jede Arbeitsaufgabe an die entsprechende Warteschlange weiter. Mitarbeiter erhalten nie Arbeitsaufgabentypen, die sie nicht registriert haben.
Um explizite Filter bereitzustellen, anstatt sie automatisch aus dem Register zu generieren, gib WorkItemFilters:
from durabletask.worker import WorkItemFilters, OrchestrationWorkItemFilter, ActivityWorkItemFilter
worker.use_work_item_filters(WorkItemFilters(
orchestrations=[
OrchestrationWorkItemFilter(name="greeting_orchestrator"),
],
activities=[
ActivityWorkItemFilter(name="say_hello"),
],
))
Bereinigen von Ressourcen
Stoppe den lokalen Emulator-Container.
docker rm -f dts-emulator
Nächste Schritte
- Erfahren Sie mehr über die automatische Skalierung des permanenten Aufgabenplanungsmoduls in Azure-Container-Apps.
- Lesen Sie anleitungen zur Problembehandlung.