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.
Die Erweiterung "Durable Functions " führt drei Triggerbindungen ein, die die Ausführung von Orchestrator-, Entitäts- und Aktivitätsfunktionen steuern. Außerdem wird eine Ausgabebindung eingeführt, die als Client für die Durable Functions-Laufzeit fungiert.
Stellen Sie sicher, dass Sie ihre Entwicklungssprache für dauerhafte Funktionen oben im Artikel auswählen.
Von Bedeutung
Dieser Artikel unterstützt sowohl Python v1- als auch Python v2-Programmiermodelle für dauerhafte Funktionen.
Python v2-Programmiermodell
Dauerhafte Funktionen werden im neuen Python v2-Programmiermodell unterstützt. Um das v2-Modell zu verwenden, müssen Sie das Durable Functions SDK installieren, bei dem es sich um das PyPI-Paket azure-functions-durable
, die Version 1.2.2
oder eine höhere Version handelt. Sie müssen auch host.json
überprüfen, um sicherzustellen, dass Ihre App auf Version 4.x des Erweiterungsbundles verweist, sodass das v2-Modell mit Durable Functions verwendet wird.
Sie können Feedback und Vorschläge im Durable Functions SDK für Python-Repository bereitstellen.
Orchestrierungstrigger
Mit dem Orchestrierungstrigger können Sie dauerhafte Orchestratorfunktionen erstellen. Dieser Trigger wird ausgeführt, wenn eine neue Orchestrierungsinstanz geplant wird und eine vorhandene Orchestrierungsinstanz ein Ereignis empfängt. Beispiele für Ereignisse, die Orchestratorfunktionen auslösen können, sind dauerhafte Timerablauf, Aktivitätsfunktionsantworten und Ereignisse, die von externen Clients ausgelöst werden.
Wenn Sie Funktionen in .NET erstellen, wird der Orchestrierungstrigger mithilfe des OrchestrationTriggerAttribute .NET-Attributs konfiguriert.
Für Java wird die @DurableOrchestrationTrigger
Anmerkung verwendet, um den Orchestrierungstrigger zu konfigurieren.
Wenn Sie Orchestratorfunktionen schreiben, wird der Orchestrierungstrigger durch das folgende JSON-Objekt im bindings
Array der function.json Datei definiert:
{
"name": "<Name of input parameter in function signature>",
"orchestration": "<Optional - name of the orchestration>",
"type": "orchestrationTrigger",
"direction": "in"
}
-
orchestration
ist der Name der Orchestrierung, die Clients verwenden müssen, wenn sie neue Instanzen dieser Orchestratorfunktion starten möchten. Diese Eigenschaft ist optional. Wenn nicht angegeben, wird der Name der Funktion verwendet.
Azure Functions unterstützt zwei Programmiermodelle für Python. Die Art und Weise, wie Sie einen Orchestrierungstrigger definieren, hängt vom gewählten Programmiermodell ab.
Mit dem Python v2-Programmiermodell können Sie einen Orchestrierungstrigger mithilfe des orchestration_trigger
Dekorators direkt in Ihrem Python-Funktionscode definieren.
Im v2-Modell kann auf die Durable Functions-Trigger und -Bindungen von einer Instanz von DFApp
zugegriffen werden, d. h. einer Unterklasse von FunctionApp
, die zusätzlich für Durable Functions spezifische Decorator-Elemente exportiert.
Intern wird der konfigurierte permanente Speicher von dieser Triggerbindung nach neuen Orchestrierungsereignissen wie Orchestrierungsstartereignissen, dauerhaften Ablaufereignissen für Timer, Aktivitätsfunktionsantwortereignissen und externen Ereignissen, die von anderen Funktionen ausgelöst werden, abruft.
Triggerverhalten
Hier sind einige Notizen zum Orchestrierungsauslöser:
- Single-Threading – Ein einzelner Dispatcherthread wird für die Ausführung aller Orchestratorfunktionen in einer einzigen Hostinstanz verwendet. Aus diesem Grund ist es wichtig, sicherzustellen, dass der Orchestrator-Funktionscode effizient ist und keine Eingabe/Ausgabe durchführt. Es ist auch wichtig, sicherzustellen, dass dieser Thread keine asynchrone Arbeit abnimmt, außer wenn auf dauerhafte Funktionen spezifische Aufgabentypen gewartet wird.
- Behandlung von nicht verarbeitbaren Nachrichten: Orchestrierungstrigger weisen keine Unterstützung für nicht verarbeitbare Nachrichten auf.
- Sichtbarkeit von Nachrichten: Nachrichten des Orchestrierungstriggers werden aus der Warteschlange entfernt und bleiben für eine konfigurierbare Dauer unsichtbar. Die Sichtbarkeit dieser Nachrichten wird automatisch verlängert, solange die Funktions-App ausgeführt und fehlerfrei ist.
- Rückgabewerte – Rückgabewerte werden in JSON serialisiert und in der Orchestrierungsverlaufstabelle im Azure-Tabellenspeicher beibehalten. Diese Rückgabewerte können von der Orchestrierungsclientbindung abgefragt werden, die später beschrieben wird.
Warnung
Orchestratorfunktionen sollten niemals andere Eingabe- oder Ausgabebindungen als die Orchestrierungstriggerbindung verwenden. Wenn dies nicht beachtet wird, können sich unter Umständen Probleme mit der Erweiterung für langlebige Aufgaben ergeben, da sich diese Bindungen ggf. nicht an die Regeln für Single-Threading und E/A-Abläufe halten. Wenn Sie andere Bindungen verwenden möchten, fügen Sie sie zu einer Aktivitätsfunktion hinzu, die von Ihrer Orchestratorfunktion aufgerufen wird. Weitere Informationen zum Codieren von Einschränkungen für Orchestratorfunktionen finden Sie in der Dokumentation zu Orchestrator-Funktionscodeeinschränkungen .
Warnung
Orchestrator-Funktionen sollten niemals deklariert async
werden.
Triggerverwendung
Die Orchestrierungstriggerbindung unterstützt sowohl Ein- als auch Ausgaben. Hier sind einige Informationen zur Eingabe- und Ausgabebehandlung:
- Eingaben – Orchestrierungstrigger können mit Eingaben aufgerufen werden, auf die über das Kontexteingabeobjekt zugegriffen wird. Alle Eingaben müssen JSON-serialisierbar sein.
- Outputs – Orchestrierungstrigger unterstützen sowohl Ausgabe- als auch Eingabewerte. Der Rückgabewert der Funktion wird verwendet, um den Ausgabewert zuzuweisen, und muss JSON-serialisierbar sein.
Triggerbeispiel
Der folgende Beispielcode zeigt, wie die einfachste "Hello World"-Orchestratorfunktion aussehen könnte. In diesem Beispiel orchestrator werden keine Vorgänge geplant.
Das spezifische Attribut, das zum Definieren des Triggers verwendet wird, hängt davon ab, ob Sie Ihre C# -Funktionen im Prozess oder in einem isolierten Arbeitsprozess ausführen.
[FunctionName("HelloWorld")]
public static string Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
string name = context.GetInput<string>();
return $"Hello {name}!";
}
Hinweis
Der vorherige Code gilt für dauerhafte Funktionen 2.x. Für Durable Functions 1.x müssen Sie DurableOrchestrationContext
anstelle von IDurableOrchestrationContext
verwenden. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel "Durable Functions Versions".
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context) {
const name = context.df.getInput();
return `Hello ${name}!`;
});
Hinweis
Die durable-functions
Bibliothek übernimmt das Aufrufen der synchronen context.done
Methode, wenn die Generatorfunktion beendet wird.
param($Context)
$InputData = $Context.Input
$InputData
@FunctionName("HelloWorldOrchestration")
public String helloWorldOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
return String.format("Hello %s!", ctx.getInput(String.class));
}
Die meisten Orchestratorfunktionen rufen Aktivitätsfunktionen auf. Hier ist also ein Beispiel für "Hello World", das veranschaulicht, wie eine Aktivitätsfunktion aufgerufen wird:
[FunctionName("HelloWorld")]
public static async Task<string> Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
string name = context.GetInput<string>();
string result = await context.CallActivityAsync<string>("SayHello", name);
return result;
}
Hinweis
Der vorherige Code gilt für dauerhafte Funktionen 2.x. Für Durable Functions 1.x müssen Sie DurableOrchestrationContext
anstelle von IDurableOrchestrationContext
verwenden. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions-Versionen.
const df = require("durable-functions");
module.exports = df.orchestrator(function*(context) {
const name = context.df.getInput();
const result = yield context.df.callActivity("SayHello", name);
return result;
});
@FunctionName("HelloWorld")
public String helloWorldOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String input = ctx.getInput(String.class);
String result = ctx.callActivity("SayHello", input, String.class).await();
return result;
}
Aktivitätsauslöser
Mit dem Aktivitätsauslöser können Sie Funktionen erstellen, die von Orchestratorfunktionen aufgerufen werden, die als Aktivitätsfunktionen bezeichnet werden.
Der Aktivitätstrigger wird mithilfe des ActivityTriggerAttribute .NET-Attributs konfiguriert.
Der Aktivitätstrigger wird mithilfe der @DurableActivityTrigger
Anmerkung konfiguriert.
Der Aktivitätsauslöser wird durch das folgende JSON-Objekt im bindings
Array von function.jsondefiniert:
{
"name": "<Name of input parameter in function signature>",
"activity": "<Optional - name of the activity>",
"type": "activityTrigger",
"direction": "in"
}
-
activity
ist der Name der Aktivität. Dieser Wert ist der Name, den Orchestratorfunktionen zum Aufrufen dieser Aktivitätsfunktion verwenden. Diese Eigenschaft ist optional. Wenn nicht angegeben, wird der Name der Funktion verwendet.
Die Art und Weise, wie Sie einen Aktivitätsauslöser definieren, hängt vom gewählten Programmiermodell ab.
Intern werden mit dieser Triggerbindung neue Aktivitätsausführungsereignisse vom konfigurierten permanenten Speicher abgefragt.
Triggerverhalten
Hier sind einige Hinweise zum Aktivitätsauslöser:
- Threading – Im Gegensatz zum Orchestrierungstrigger haben Aktivitätstrigger keine Einschränkungen hinsichtlich Threading oder E/A. Sie können wie normale Funktionen behandelt werden.
- Umgang mit Giftnachrichten – Es gibt keine Unterstützung für Giftnachrichten in Aktivitätsauslösern.
- Sichtbarkeit von Nachrichten: Nachrichten des Aktivitätstriggers werden aus der Warteschlange entfernt und bleiben für eine konfigurierbare Dauer unsichtbar. Die Sichtbarkeit dieser Nachrichten wird automatisch verlängert, solange die Funktions-App ausgeführt und fehlerfrei ist.
- Rückgabewerte – Rückgabewerte werden in JSON serialisiert und im konfigurierten dauerhaften Speicher beibehalten.
Triggerverwendung
Die Aktivitätstriggerbindung unterstützt sowohl Eingaben als auch Ausgaben, genau wie der Orchestrierungstrigger. Hier sind einige Informationen zur Eingabe- und Ausgabebehandlung:
- Eingaben – Aktivitätstrigger können mit Eingaben aus einer Orchestratorfunktion aufgerufen werden. Alle Eingaben müssen JSON-serialisierbar sein.
- Outputs – Aktivitätsfunktionen unterstützen sowohl Ausgabe- als auch Eingabewerte. Der Rückgabewert der Funktion wird verwendet, um den Ausgabewert zuzuweisen, und muss JSON-serialisierbar sein.
-
Metadaten : .NET-Aktivitätsfunktionen können an einen
string instanceId
Parameter gebunden werden, um die Instanz-ID der aufrufenden Orchestrierung abzurufen.
Triggerbeispiel
Der folgende Beispielcode zeigt, wie eine einfache SayHello
Aktivitätsfunktion aussehen kann.
[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext helloContext)
{
string name = helloContext.GetInput<string>();
return $"Hello {name}!";
}
Der Standardparametertyp für die .NET-Bindung ActivityTriggerAttribute
ist IDurableActivityContext (oder DurableActivityContext für dauerhafte Funktionen v1). .NET-Aktivitätsauslöser unterstützen jedoch auch die direkte Bindung an JSON-serialisierbare Typen (einschließlich primitiver Typen), sodass die gleiche Funktion wie folgt vereinfacht werden kann:
[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] string name)
{
return $"Hello {name}!";
}
module.exports = async function(context) {
return `Hello ${context.bindings.name}!`;
};
JavaScript-Bindungen können auch als zusätzliche Parameter übergeben werden, sodass die gleiche Funktion wie folgt vereinfacht werden kann:
module.exports = async function(context, name) {
return `Hello ${name}!`;
};
param($name)
"Hello $name!"
@FunctionName("SayHello")
public String sayHello(@DurableActivityTrigger(name = "name") String name) {
return String.format("Hello %s!", name);
}
Verwenden von Eingabe- und Ausgabebindungen
Sie können neben der Aktivitätstriggerbindung auch reguläre Eingabe- und Ausgabebindungen verwenden.
Sie können z. B. die Eingabe an Ihre Aktivitätsbindung übernehmen und eine Nachricht mithilfe der Ausgabebindung "Event Hubs" an einen Event Hub senden:
{
"bindings": [
{
"name": "message",
"type": "activityTrigger",
"direction": "in"
},
{
"type": "eventHub",
"name": "outputEventHubMessage",
"connection": "EventhubConnectionSetting",
"eventHubName": "eh_messages",
"direction": "out"
}
]
}
module.exports = async function (context) {
context.bindings.outputEventHubMessage = context.bindings.message;
};
Orchestrierungsclient
Mit der Orchestrierungsclientbindung können Sie Funktionen schreiben, die mit Orchestratorfunktionen interagieren. Diese Funktionen werden häufig als Clientfunktionen bezeichnet. Sie können beispielsweise auf Orchestrierungsinstanzen in den folgenden Weisen reagieren:
- Starten
- Fragen Sie ihren Status ab.
- Eliminieren Sie sie.
- Senden von Ereignissen an die Instanzen während der Ausführung
- Löschen des Instanzverlaufs
Sie können eine Bindung an den Orchestrierungsclient mithilfe des Attributs DurableClientAttribute (OrchestrationClientAttribute in Durable Functions v1.x) herstellen.
Sie können eine Bindung an den Orchestrierungsclient mithilfe der @DurableClientInput
Anmerkung herstellen.
Der dauerhafte Clienttrigger wird durch das folgende JSON-Objekt im bindings
Array von function.jsondefiniert:
{
"name": "<Name of input parameter in function signature>",
"taskHub": "<Optional - name of the task hub>",
"connectionName": "<Optional - name of the connection string app setting>",
"type": "orchestrationClient",
"direction": "in"
}
-
taskHub
– Wird in Szenarien verwendet, in denen mehrere Funktions-Apps dasselbe Speicherkonto gemeinsam nutzen, aber voneinander isoliert werden müssen. Wenn nicht angegeben, wird der Standardwerthost.json
verwendet. Dieser Wert muss mit dem Wert übereinstimmen, der von den Ziel-Orchestratorfunktionen verwendet wird. -
connectionName
– Der Name einer App-Einstellung, die eine Verbindungszeichenfolge für Speicherkonten enthält. Das in dieser Verbindungszeichenfolge angegebene Speicherkonto muss dasselbe sein, das von den Ziel-Orchestratorfunktionen verwendet wird. Wenn nichts angegeben ist, wird die Speicherkonto-Standardverbindungszeichenfolge für die Funktionen-App verwendet.
Hinweis
In den meisten Fällen wird empfohlen, diese Eigenschaften wegzulassen und das Standardverhalten zu verwenden.
Die Art und Weise, wie Sie einen dauerhaften Clienttrigger definieren, hängt vom gewählten Programmiermodell ab.
Kundennutzung
In der Regel binden Sie an IDurableClient (DurableOrchestrationClient in Durable Functions v1.x), wodurch Sie vollständigen Zugriff auf alle Von Durable Functions unterstützten Orchestrierungsclient-APIs erhalten.
Sie binden in der Regel an die DurableClientContext
Klasse.
Sie müssen das sprachspezifische SDK verwenden, um Zugriff auf ein Clientobjekt zu erhalten.
Hier ist ein Beispiel für eine per Warteschlange ausgelöste Funktion angegeben, mit der eine „HelloWorld“-Orchestrierung gestartet wird.
[FunctionName("QueueStart")]
public static Task Run(
[QueueTrigger("durable-function-trigger")] string input,
[DurableClient] IDurableOrchestrationClient starter)
{
// Orchestration input comes from the queue message content.
return starter.StartNewAsync<string>("HelloWorld", input);
}
Hinweis
Der vorherige C#-Code gilt für dauerhafte Funktionen 2.x. Für Durable Functions 1.x müssen Sie das OrchestrationClient
Attribut anstelle des DurableClient
Attributs verwenden, und Sie müssen den DurableOrchestrationClient
Parametertyp anstelle von IDurableOrchestrationClient
verwenden. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel "Durable Functions Versions".
function.json
{
"bindings": [
{
"name": "input",
"type": "queueTrigger",
"queueName": "durable-function-trigger",
"direction": "in"
},
{
"name": "starter",
"type": "durableClient",
"direction": "in"
}
]
}
index.js
const df = require("durable-functions");
module.exports = async function (context) {
const client = df.getClient(context);
return instanceId = await client.startNew("HelloWorld", undefined, context.bindings.input);
};
run.ps1
param([string] $input, $TriggerMetadata)
$InstanceId = Start-DurableOrchestration -FunctionName $FunctionName -Input $input
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def durable_trigger(req: func.HttpRequest, client):
function_name = req.route_params.get('functionName')
instance_id = await client.start_new(function_name)
response = client.create_check_status_response(req, instance_id)
return response
function.json
{
"bindings": [
{
"name": "input",
"type": "queueTrigger",
"queueName": "durable-function-trigger",
"direction": "in"
},
{
"name": "starter",
"type": "durableClient",
"direction": "in"
}
]
}
run.ps1
param([string]$InputData, $TriggerMetadata)
$InstanceId = Start-DurableOrchestration -FunctionName 'HelloWorld' -Input $InputData
@FunctionName("QueueStart")
public void queueStart(
@QueueTrigger(name = "input", queueName = "durable-function-trigger", connection = "Storage") String input,
@DurableClientInput(name = "durableContext") DurableClientContext durableContext) {
// Orchestration input comes from the queue message content.
durableContext.getClient().scheduleNewOrchestrationInstance("HelloWorld", input);
}
Weitere Details zum Starten von Instanzen finden Sie in der Instanzverwaltung.
Entitätstrigger
Entitätstrigger ermöglichen es Ihnen, Entitätsfunktionen zu erstellen. Dieser Trigger unterstützt die Verarbeitung von Ereignissen für eine bestimmte Entitätsinstanz.
Hinweis
Entitätstrigger sind ab Durable Functions 2.x verfügbar.
Intern werden mit dieser Triggerbindung neue Entitätsvorgänge, die ausgeführt werden müssen, vom konfigurierten permanenten Speicher abgefragt.
Der Entitätstrigger wird mithilfe des EntityTriggerAttribute .NET-Attributs konfiguriert.
Der Entitätstrigger wird durch das folgende JSON-Objekt im bindings
Array von function.jsondefiniert:
{
"name": "<Name of input parameter in function signature>",
"entityName": "<Optional - name of the entity>",
"type": "entityTrigger",
"direction": "in"
}
Standardmäßig ist der Name einer Entität der Name der Funktion.
Hinweis
Entitätstrigger werden für Java noch nicht unterstützt.
Die Art und Weise, wie Sie einen Entitätstrigger definieren, hängt vom gewählten Programmiermodell ab.
Triggerverhalten
Hier sind einige Hinweise zum Entitätsauslöser:
- Single-Threaded: Ein einzelner Dispatcherthread wird verwendet, um Vorgänge für eine bestimmte Entität zu verarbeiten. Wenn mehrere Nachrichten gleichzeitig an eine einzelne Entität gesendet werden, werden die Vorgänge einzeln verarbeitet.
- Behandlung von Giftnachrichten – Es gibt keine Unterstützung für Giftnachrichten in Entitätstriggern.
- Sichtbarkeit von Nachrichten: Nachrichten des Entitätstriggers werden aus der Warteschlange entfernt und bleiben für eine konfigurierbare Dauer unsichtbar. Die Sichtbarkeit dieser Nachrichten wird automatisch verlängert, solange die Funktions-App ausgeführt und fehlerfrei ist.
- Rückgabewerte – Entitätsfunktionen unterstützen keine Rückgabewerte. Es gibt bestimmte APIs, die verwendet werden können, um Status zu speichern oder Werte zurück an Orchestrierungen zu übergeben.
Alle Zustandsänderungen, die während der Ausführung an einer Entität vorgenommen wurden, werden nach Abschluss der Ausführung automatisch beibehalten.
Weitere Informationen und Beispiele zum Definieren und Interagieren mit Entitätstriggern finden Sie in der Dokumentation zu dauerhaften Entitäten .
Entitäts-Client
Mit der Entitätsclientbindung können Sie Entitätsfunktionen asynchron auslösen. Diese Funktionen werden manchmal als Clientfunktionen bezeichnet.
Sie können eine Bindung an den Entitätsclient mithilfe des DurableClientAttribute .NET-Attributs in .NET-Klassenbibliotheksfunktionen herstellen.
Hinweis
[DurableClientAttribute]
kann auch verwendet werden, um eine Bindung mit dem Orchestrierungsclient herzustellen.
Der Entitätsclient wird durch das folgende JSON-Objekt im bindings
Array von function.jsondefiniert:
{
"name": "<Name of input parameter in function signature>",
"taskHub": "<Optional - name of the task hub>",
"connectionName": "<Optional - name of the connection string app setting>",
"type": "durableClient",
"direction": "in"
}
-
taskHub
– Wird in Szenarien verwendet, in denen mehrere Funktions-Apps dasselbe Speicherkonto gemeinsam nutzen, aber voneinander isoliert werden müssen. Wenn nicht angegeben, wird der Standardwerthost.json
verwendet. Dieser Wert muss mit dem Wert übereinstimmen, der von den Zielentitätsfunktionen verwendet wird. -
connectionName
– Der Name einer App-Einstellung, die eine Verbindungszeichenfolge für Speicherkonten enthält. Das Speicherkonto, das durch diese Verbindungszeichenfolge repräsentiert wird, muss dasselbe sein, das von den Zielentitätsfunktionen verwendet wird. Wenn nichts angegeben ist, wird die Speicherkonto-Standardverbindungszeichenfolge für die Funktionen-App verwendet.
Hinweis
In den meisten Fällen wird empfohlen, die optionalen Eigenschaften wegzulassen und das Standardverhalten zu verwenden.
Die Art und Weise, wie Sie einen Entitätsclient definieren, hängt vom gewählten Programmiermodell ab.
Hinweis
Entitätsclients werden für Java noch nicht unterstützt.
Weitere Informationen und Beispiele für die Interaktion mit Entitäten als Client finden Sie in der Dokumentation zu dauerhaften Entitäten .
Einstellungen für „host.json“
Konfigurationseinstellungen für Durable Functions.
Hinweis
Alle Hauptversionen von Durable Functions werden für alle Versionen der Azure Functions-Runtime unterstützt. Das Schema der host.json-Konfiguration unterscheidet sich jedoch geringfügig, abhängig von der verwendeten Version der Azure Functions-Runtime sowie der Durable Functions-Erweiterung. Die folgenden Beispiele sind für die Verwendung mit Azure Functions 2.0 und 3.0 vorgesehen. In beiden Beispielen, wenn Sie Azure Functions 1.0 verwenden, sind die verfügbaren Einstellungen identisch, der Abschnitt "durableTask" des host.json sollte jedoch im Stammverzeichnis der host.json-Konfiguration anstelle eines Felds unter "Erweiterungen" stehen.
{
"extensions": {
"durableTask": {
"hubName": "MyTaskHub",
"storageProvider": {
"connectionStringName": "AzureWebJobsStorage",
"controlQueueBatchSize": 32,
"controlQueueBufferThreshold": 256,
"controlQueueVisibilityTimeout": "00:05:00",
"maxQueuePollingInterval": "00:00:30",
"partitionCount": 4,
"trackingStoreConnectionStringName": "TrackingStorage",
"trackingStoreNamePrefix": "DurableTask",
"useLegacyPartitionManagement": false,
"useTablePartitionManagement": true,
"workItemQueueVisibilityTimeout": "00:05:00",
},
"tracing": {
"traceInputsAndOutputs": false,
"traceReplayEvents": false,
},
"notifications": {
"eventGrid": {
"topicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
"keySettingName": "EventGridKey",
"publishRetryCount": 3,
"publishRetryInterval": "00:00:30",
"publishEventTypes": [
"Started",
"Completed",
"Failed",
"Terminated"
]
}
},
"maxConcurrentActivityFunctions": 10,
"maxConcurrentOrchestratorFunctions": 10,
"maxConcurrentEntityFunctions": 10,
"extendedSessionsEnabled": false,
"extendedSessionIdleTimeoutInSeconds": 30,
"useAppLease": true,
"useGracefulShutdown": false,
"maxEntityOperationBatchSize": 50,
"maxOrchestrationActions": 100000,
"storeInputsInOrchestrationHistory": false
}
}
}
Aufgabenhubnamen müssen mit einem Buchstaben beginnen und bestehen nur aus Buchstaben und Ziffern. Wenn nicht angegeben, lautet der standardmäßige Aufgabenhubname für eine Funktions-App TestHubName. Weitere Informationen finden Sie unter Task Hubs.
Eigentum | Standard | BESCHREIBUNG |
---|---|---|
hubName | TestHubName (DurableFunctionsHub unter Verwendung von Durable Functions 1.x) | Alternative Namen für Aufgabenhubs können zum Isolieren von mehreren Durable Functions-Anwendungen verwendet werden, auch wenn sie dasselbe Speicher-Back-End verwenden. |
controlQueueBatchSize | 32 | Die Anzahl der aus der Steuerelement-Warteschlange jeweils abzurufenden Nachrichten. |
controlQueueBufferThreshold |
Verbrauchstarif für Python: 32 Verbrauchsplan für andere Sprachen: 128 Dedicated-/Premium-Plan: 256 |
Die Anzahl der Steuerelement-Warteschlangennachrichten, die gleichzeitig im Arbeitsspeicher gepuffert werden können. Zu diesem Zeitpunkt wartet der Verteiler, bevor zusätzliche Nachrichten aus der Warteschlange entfernt werden. In einigen Fällen kann die Verringerung dieses Werts die Arbeitsspeicherauslastung erheblich reduzieren. |
partitionCount | 4 | Die Anzahl der Partitionen für die Steuerelement-Warteschlange. Kann ein positiver Integerwert zwischen 1 und 16 sein. Zum Ändern dieses Werts muss ein neuer Aufgabenhub konfiguriert werden. |
controlQueueVisibilityTimeout | 5 Minuten | Das Sichtbarkeitstimeout von aus der Steuerelement-Warteschlange entfernten Nachrichten. |
workItemQueueVisibilityTimeout | 5 Minuten | Das Sichtbarkeitstimeout von aus der Warteschlange für Arbeitselemente entfernten Nachrichten. |
maxConcurrentActivityFunctions |
Verbrauchsplan: 10 Dedicated-/Premium-Plan: 10-fache Anzahl von Prozessoren auf dem aktuellen Computer |
Die maximale Anzahl von Aktivitätsfunktionen, die gleichzeitig auf einer einzelnen Hostinstanz verarbeitet werden können. |
maxConcurrentOrchestratorFunctions |
Verbrauchsplan: 5 Dedicated-/Premium-Plan: 10-fache Anzahl von Prozessoren auf dem aktuellen Computer |
Die maximale Anzahl von Orchestratorfunktionen, die gleichzeitig auf einer einzelnen Hostinstanz verarbeitet werden können. |
maxConcurrentEntityFunctions |
Verbrauchsplan: 5 Dedicated-/Premium-Plan: 10-fache Anzahl von Prozessoren auf dem aktuellen Computer |
Die maximale Anzahl von Entitätsfunktionen, die gleichzeitig in einer einzelnen Hostinstanz verarbeitet werden können. Diese Einstellung gilt nur bei Verwendung des dauerhaften Aufgabenplaners. Ansonsten ist die maximale Anzahl an gleichzeitigen Entitätsausführungen auf maxConcurrentOrchestratorFunctions beschränkt. |
maxQueuePollingInterval | 30 Sekunden | Das maximale Abrufintervall der Steuerelement- und Arbeitselement-Warteschlangen im Format hh:mm:ss. Höhere Werte können zu höherer Latenz bei der Nachrichtenverarbeitung führen. Niedrigere Werte können aufgrund verstärkter Speichertransaktionen zu höheren Speicherkosten führen. |
connectionName (2.7.0 und höher) connectionStringName (2.x) azureStorageConnectionStringName (1.x) |
AzureWebJobsStorage | Der Name einer App-Einstellung oder -Einstellungssammlung, die angibt, wie eine Verbindung mit den zugrunde liegenden Azure Storage-Ressourcen hergestellt werden soll. Wenn eine einzelne App-Einstellung bereitgestellt wird, sollte es sich um eine Azure Speicherverbindungszeichenfolge handeln. |
trackingStoreConnectionName (2.7.0 und höher) trackingStoreConnectionStringName |
Der Name einer App-Einstellung oder Einstellungssammlung, die angibt, wie eine Verbindung mit den Verlaufs-und Instanztabellen hergestellt wird. Wenn eine einzelne App-Einstellung bereitgestellt wird, sollte es sich um eine Azure Speicherverbindungszeichenfolge handeln. Wird kein Wert angegeben, wird die Verbindung connectionStringName (Durable 2.x) oder azureStorageConnectionStringName (Durable 1.x) verwendet. |
|
trackingStoreNamePrefix | Das für die Verlaufs- und Instanzentabellen zu verwendende Präfix, wenn trackingStoreConnectionStringName angegeben ist. Wenn diese Eigenschaft nicht festgelegt ist, wird DurableTask als Standardwert für das Präfix verwendet. Wenn trackingStoreConnectionStringName nicht angegeben, verwenden die Tabellen "Verlauf" und "Instanzen" den hubName Wert als Präfix, und alle Einstellungen für trackingStoreNamePrefix werden ignoriert. |
|
traceInputsAndOutputs | Falsch | Ein Wert, der angibt, ob die Eingaben und Ausgaben von Funktionsaufrufen nachverfolgt werden. Das Standardverhalten beim Nachverfolgen von Ereignissen zur Funktionsausführung besteht darin, die Anzahl der Bytes in die serialisierten Eingaben und Ausgaben für Funktionsaufrufe einzuschließen. Dieses Verhalten ermöglicht minimale Informationen zu den Eingaben und Ausgaben, ohne die Protokolle zu überfrachten oder irrtümlich vertrauliche Informationen verfügbar zu machen. Wenn diese Eigenschaft auf TRUE festgelegt wird, werden bei der standardmäßigen Funktionsprotokollierung die gesamten Inhalte der Eingaben und Ausgaben der Funktionen protokolliert. |
traceReplayEvents | Falsch | Ein Wert, der angibt, ob Orchestrationswiedergabeereignisse in Application Insights geschrieben werden. |
eventGridTopicEndpoint | Die URL eines benutzerdefinierten Azure Event Grid-Themenendpunkts. Wenn diese Eigenschaft festgelegt ist, werden Benachrichtigungsereignisse zum Orchestrierungslebenszyklus an diesem Endpunkt veröffentlicht. Diese Eigenschaft unterstützt die Auflösung von App-Einstellungen. | |
eventGridKeySettingName | Der Name der App-Einstellung, die den Schlüssel für die Authentifizierung mit dem benutzerdefinierten Azure Event Grid-Thema unter EventGridTopicEndpoint enthält. |
|
eventGridPublishRetryCount | 0 | Die Anzahl der Wiederholungsversuche, wenn bei der Veröffentlichung im Event Grid-Thema Fehler auftreten. |
eventGridPublishRetryInterval | 5 Minuten | Event Grid veröffentlicht das Wiederholungsintervall im Format hh:mm:ss. |
eventGridPublishEventTypes | Eine Liste von Ereignistypen, die in Event Grid veröffentlicht werden sollen. Wenn diese Eigenschaft nicht angegeben ist, werden alle Ereignistypen veröffentlicht. Zulässige Werte sind Started , Completed , Failed und Terminated . |
|
useAppLease | Wahr | Wird diese Einstellung auf true festgelegt, müssen Apps vor der Verarbeitung von Aufgabenhubnachrichten eine Bloblease auf App-Ebene abrufen. Weitere Informationen finden Sie in der Dokumentation zur Notfallwiederherstellung und geografischen Verteilung. Verfügbar ab v2.3.0 |
VerwendenSieLegacyPartitionManagement | Falsch | Wenn diese Einstellung auf false festgelegt wird, wird ein Partitionsverwaltungsalgorithmus verwendet, der bei der horizontalen Skalierung die Wahrscheinlichkeit einer doppelten Funktionsausführung reduziert. Diese Funktion ist ab Version 2.3.0 verfügbar.
Das Festlegen dieses Werts auf true wird nicht empfohlen. |
useTablePartitionManagement |
true in v3.x-Erweiterungsversionenfalse in v2.x-Erweiterungsversionen |
Verwendet bei Festlegung auf true einen Partitionsverwaltungsalgorithmus, der zum Senken von Kosten für Azure Storage V2-Konten entwickelt wurde. Verfügbar ab WebJobs.Extensions.DurableTask v2.10.0. Die Verwendung dieser Einstellung mit verwalteter Identität erfordert WebJobs.Extensions.DurableTask v3.x oder höher oder Worker.Extensions.DurableTask-Versionen vor v1.2.x oder höher. |
useGracefulShutdown | Falsch | (Preview) Ordnungsgemäßes Herunterfahren aktivieren, um die Wahrscheinlichkeit zu verringern, dass beim Herunterfahren von Hosts Funktionsausführungen in Prozessen fehlschlagen. |
maxEntityOperationBatchSize(2.6.1) |
Verbrauchsplan: 50 Dedicated- oder Premium-Plan: 5000 |
Die maximale Anzahl von Entitätsvorgängen, die als Batch verarbeitet werden. Wird der Wert auf „1“ festgelegt, ist die Batchverarbeitung deaktiviert, und jede Vorgangsmeldung wird von einem separaten Funktionsaufruf verarbeitet. |
Eingaben in der Orchestrierungshistorie speichern | Falsch | Wenn dieser Wert auf true festgelegt ist, wird das Durable Task Framework aufgefordert, Aktivitätseingaben in der Verlaufstabelle zu speichern. Dies ermöglicht die Anzeige von Aktivitätsfunktionseingaben beim Abfragen des Orchestrierungsverlaufs. |
maxGrpcMessageSizeInBytes | 4194304 | Ein ganzzahliger Wert, der die maximale Größe in Bytes von Nachrichten festlegt, die der gRPC-Client für DurableTaskClient empfangen kann. Dies gilt für dauerhafte Funktionen .NET Isolated und Java. |
grpcHttpClientTimeout | 100 Sekunden | Legt das Timeout für den HTTP-Client fest, der vom gRPC-Client in durable Functions verwendet wird, der derzeit für .NET isolierte Apps (.NET 6 und höhere Versionen) und für Java unterstützt wird. |
Viele dieser Einstellungen werden zur Optimierung der Leistung verwendet. Weitere Informationen finden Sie unter Leistung und Skalierung.