Singleton orchestrators in Durable Functions (Azure Functions)

Háttérfeladatok esetén gyakran meg kell győződnie arról, hogy egy adott vezénylőnek egyszerre csak egy példánya fut. Ezt a fajta egyszeri viselkedést Durable Functions úgy biztosíthatja, hogy egy adott példányazonosítót rendel hozzá egy vezénylőhöz a létrehozáskor.

Példa egyszemélyesre

Az alábbi példa egy HTTP-trigger függvényt mutat be, amely egyszeri háttérfeladat-vezénylést hoz létre. A kód biztosítja, hogy csak egy példány létezik egy adott példányazonosítóhoz.

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

Megjegyzés

Az előző C#-kód Durable Functions 2.x-hez készült. Az 1.x Durable Functions esetében attribútumot kell használnia OrchestrationClient az DurableClient attribútum helyett, és a DurableOrchestrationClient paramétertípust kell használnia a IDurableOrchestrationClienthelyett. A verziók közötti különbségekről a verziók Durable Functions című cikkben talál további információt.

Alapértelmezés szerint a példányazonosítók véletlenszerűen generált GUID azonosítók. Az előző példában azonban a példányazonosító az URL-címből származó útvonaladatokban lesz átadva. A kód ezután lekéri a vezénylési példány metaadatait annak ellenőrzéséhez, hogy a megadott azonosítóval rendelkező példány már fut-e. Ha nem fut ilyen példány, a rendszer létrehoz egy új példányt ezzel az azonosítóval.

Megjegyzés

Ebben a mintában lehetséges versenyhelyzet áll fenn. Ha a HttpStartSingle két példánya egyidejűleg fut, mindkét függvényhívás sikeres lesz, de valójában csak egy vezénylési példány indul el. A követelményektől függően ez nemkívánatos mellékhatásokat okozhat.

A vezénylőfüggvény implementációjának részletei valójában nem számítanak. Lehet egy reguláris vezénylési funkció, amely elindul és befejeződik, vagy egy örökké futó (azaz örökkévaló vezénylés). A lényeg az, hogy egyszerre csak egy példány fut.

Következő lépések