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 IDurableOrchestrationClient
helyett. 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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: