Orkiestratory jednotonowe w Durable Functions (Azure Functions)
W przypadku zadań w tle często trzeba upewnić się, że tylko jedno wystąpienie określonego orkiestratora jest uruchamiane jednocześnie. Tego rodzaju jednotonowe zachowanie w Durable Functions można zapewnić, przypisując określony identyfikator wystąpienia do orkiestratora podczas jego tworzenia.
Przykład pojedynczego elementu
W poniższym przykładzie pokazano funkcję wyzwalacza HTTP, która tworzy pojedynczą aranżację zadań w tle. Kod zapewnia, że istnieje tylko jedno wystąpienie dla określonego identyfikatora wystąpienia.
[FunctionName("HttpStartSingle")]
public static async Task<HttpResponseMessage> RunSingle(
[HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/{instanceId}")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter,
string functionName,
string instanceId,
ILogger log)
{
// Check if an instance with the specified ID already exists or an existing one stopped running(completed/failed/terminated).
var existingInstance = await starter.GetStatusAsync(instanceId);
if (existingInstance == null
|| existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Completed
|| existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Failed
|| existingInstance.RuntimeStatus == OrchestrationRuntimeStatus.Terminated)
{
// An instance with the specified ID doesn't exist or an existing one stopped running, create one.
dynamic eventData = await req.Content.ReadAsAsync<object>();
await starter.StartNewAsync(functionName, instanceId, eventData);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
else
{
// An instance with the specified ID exists or an existing one still running, don't create one.
return new HttpResponseMessage(HttpStatusCode.Conflict)
{
Content = new StringContent($"An instance with ID '{instanceId}' already exists."),
};
}
}
Uwaga
Poprzedni kod języka C# jest przeznaczony dla Durable Functions 2.x. W przypadku Durable Functions 1.x należy użyć OrchestrationClient
atrybutu zamiast atrybutu DurableClient
i należy użyć typu parametru DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Durable Functions versions (Wersje Durable Functions).
Domyślnie identyfikatory wystąpień są losowo generowane identyfikatory GUID. W poprzednim przykładzie identyfikator wystąpienia jest jednak przekazywany w danych trasy z adresu URL. Następnie kod pobiera metadane wystąpienia orkiestracji, aby sprawdzić, czy wystąpienie o określonym identyfikatorze jest już uruchomione. Jeśli takie wystąpienie nie jest uruchomione, zostanie utworzone nowe wystąpienie z tym identyfikatorem.
Uwaga
W tym przykładzie istnieje potencjalny stan wyścigu. Jeśli dwa wystąpienia metody HttpStartSingle są wykonywane współbieżnie, oba wywołania funkcji będą zgłaszać powodzenie, ale tylko jedno wystąpienie orkiestracji rzeczywiście zostanie uruchomione. W zależności od wymagań może to mieć niepożądane skutki uboczne.
Szczegóły implementacji funkcji orkiestratora nie mają znaczenia. Może to być zwykła funkcja orkiestratora, która uruchamia się i kończy, lub może to być taka, która działa na zawsze (czyli wieczna orkiestracja). Ważnym punktem jest to, że w danym momencie jest uruchomione tylko jedno wystąpienie.