Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Durable Functions számos olyan funkcióval rendelkezik, amelyek megkönnyítik a tartós vezénylések és entitások HTTP-munkafolyamatokba való beépítését. Ez a cikk részletesen ismerteti ezen funkciók némelyikét.
HTTP API-k elérhetővé tétele
A vezénylések és entitások HTTP-kérésekkel hívhatók meg és kezelhetők. A Durable Functions bővítmény beépített HTTP API-kat tesz elérhetővé. Emellett API-kat biztosít a vezénylések és entitások HTTP-triggerelt függvényeken keresztül történő kezeléséhez.
Beépített HTTP API-k
A Durable Functions bővítmény automatikusan hozzáad egy készlet HTTP API-t az Azure Functions gazdagéphez. Ezekkel az API-kkal kódírás nélkül léphet kapcsolatba az orchestrationökkel és kezelheti az entitásokat.
A következő beépített HTTP API-k támogatottak.
- Új orchestráció indítása
- Lekérdezés-vezénylési példány
- Vezénylési példány leállítása
- Külső esemény küldése orchestrationre
- Orchesztációs előzmények törlése
- Műveletesemény küldése egy entitásnak
- Entitás állapotának lekérése
- Entitások listájának lekérdezése
A Durable Functions bővítmény által közzétett beépített HTTP API-k teljes leírását a HTTP API-król szóló cikkben találja.
HTTP API URL-felderítés
A orchestration klienskötés olyan API-kat tesz elérhetővé, amelyek képesek kényelmes HTTP-válasz terheléseket létrehozni. Például létrehozhat egy választ, amely egy adott orchestrációs példány menedzsment API-ira mutató hivatkozásokat tartalmaz. Az alábbi példák egy HTTP-trigger függvényt mutatnak be, amely bemutatja, hogyan használhatja ezt az API-t egy új vezénylési példányhoz:
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
namespace VSSample
{
public static class HttpStart
{
[FunctionName("HttpStart")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
[DurableClient] IDurableClient starter,
string functionName,
ILogger log)
{
// Function input comes from the request content.
object eventData = await req.Content.ReadAsAsync<object>();
string instanceId = await starter.StartNewAsync(functionName, eventData);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
return starter.CreateCheckStatusResponse(req, instanceId);
}
}
}
Tip
Ha ugyanabban a függvényalkalmazásban több HTTP-aktivált kezdőfüggvény is van, konfiguráljon egyedit route minden függvényhez az útvonalütközések elkerülése érdekében. Egy olyan paraméteres útvonal használata, mint ( orchestrators/{functionName} ahogy az az előző példákban is látható) lehetővé teszi, hogy egyetlen HTTP starter függvény név alapján indítsa el a vezénylőt, ami gyakran a legegyszerűbb módszer.
A vezénylőfüggvények indítása a korábban bemutatott HTTP-trigger függvények használatával bármely HTTP-ügyfél használatával elvégezhető. A következő cURL-parancs elindít egy vezénylő függvényt DoWork:
curl -X POST https://localhost:7071/orchestrators/DoWork -H "Content-Length: 0" -i
A következő példa egy olyan orchestrációra adott válasz, amelynek azonosítója abc123. Néhány részlet el lett távolítva az egyértelműség kedvéért.
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/abc123?code=XXX
Retry-After: 10
{
"id": "abc123",
"purgeHistoryDeleteUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123?code=XXX",
"sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123/raiseEvent/{eventName}?code=XXX",
"statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123?code=XXX",
"terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/abc123/terminate?reason={text}&code=XXX"
}
Az előző példában Uri a végződő mezők mindegyike egy beépített HTTP API-nak felel meg. Ezekkel az API-kkal kezelheti a célba vett orchestration példányt.
Note
A webhook URL-címeinek formátuma attól függ, hogy a Azure Functions-gazdagép melyik verzióját futtatja. Az előző példa az Azure Functions 2.0-s gazdagéphez.
Az összes beépített HTTP API leírását a HTTP API-referencia ismerteti.
Aszinkron műveletek nyomon követése
A korábban említett HTTP-válasz célja, hogy segítse a hosszú ideig futó HTTP aszinkron API-k implementálását a Durable Functions segítségével. Ezt a mintát néha lekérdezési fogyasztói mintának is nevezik. Az ügyfél-kiszolgáló folyamat a következőképpen működik:
- Az ügyfél HTTP-kérést ad ki egy hosszú ideig futó folyamat, például egy vezénylőfüggvény elindításához.
- A cél HTTP-eseményindító egy HTTP 202 választ ad vissza egy Location fejléccel, amelynek az értéke "statusQueryGetUri".
- Az ügyfél lekérdezi az URL-címet a Hely fejlécben. Az ügyfél továbbra is a HTTP 202-válaszokat látja egy Hely fejléccel.
- Ha a példány befejeződik vagy meghiúsul, a Location fejléc végpontja HTTP 200 státuszkódot küld vissza.
Ez a protokoll lehetővé teszi a hosszú ideig futó folyamatok összehangolását olyan külső ügyfelekkel vagy szolgáltatásokkal, amelyek LEkérdezhetnek egy HTTP-végpontot, és követhetik a Hely fejlécet. A minta ügyfél- és kiszolgálói implementációi is a Durable Functions HTTP API-kba vannak beépítve.
Note
Alapértelmezés szerint az
Note
Az orchestrationokkal való interakciók bármilyen függvénytípusból elvégezhetők, nem csak a HTTP-triggerelt függvényekből.
A vezénylések és entitások ügyfél API-k használatával történő kezelésével kapcsolatos további információkért tekintse meg a Példánykezelési cikket.
HTTP API-k használata
A vezénylési kód korlátaiban leírtak szerint a vezénylő függvények nem végezhetnek közvetlen I/O-műveleteket. Ehelyett általában I/O-műveleteket végző tevékenységeket neveznek.
A Durable Functions 2.0-tól kezdve a vezénylések natívan használhatják az HTTP API-kat az orchestration trigger kötés használatával.
Az alábbi példakód egy kimenő HTTP-kérést készítő vezénylő függvényt mutat be:
[FunctionName(nameof(CheckSiteAvailable))]
public static async Task CheckSiteAvailable(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
Uri url = context.GetInput<Uri>();
// Makes an HTTP GET request to the specified endpoint
DurableHttpResponse response =
await context.CallHttpAsync(HttpMethod.Get, url);
if (response.StatusCode >= 400)
{
// handling of error codes goes here
}
}
Note
Felmerülhet a kérdés, hogy ez a funkció miért használja a DurableHttpRequest és DurableHttpResponse típusokat a beépített .NET HttpRequestMessage és HttpResponseMessage típusok helyett.
Ez a kialakítási döntés szándékos. Az elsődleges ok az, hogy az egyéni típusok segítenek biztosítani, hogy a felhasználók ne tegyenek helytelen feltételezéseket a belső HTTP-ügyfél támogatott viselkedésével kapcsolatban. A Durable Functions jellemző típusok lehetővé teszik az API-tervezés egyszerűsítését is. Emellett egyszerűbben elérhetővé tehetnek olyan speciális funkciókat, mint a felügyelt identitásintegráció és a lekérdezési fogyasztói minta.
A "http meghívása" művelet használatával a következő műveleteket hajthatja végre a vezénylő függvényekben:
- A HTTP API-kat közvetlenül a vezénylési függvényekből hívhatja meg, néhány, később említett korlátozással.
- Automatikusan támogatja az ügyféloldali HTTP 202 állapot-lekérdezési mintákat.
- A Azure felügyelt identitások használatával engedélyezett HTTP-hívásokat kezdeményezhet más Azure végpontokra.
A HTTP API-k közvetlenül a vezénylő függvényekből való felhasználásának lehetősége bizonyos gyakori forgatókönyvek kényelmét szolgálja. Ezeket a funkciókat saját maga is megvalósíthatja aktivitási függvények használatával. A tevékenységfüggvények sok esetben nagyobb rugalmasságot biztosíthatnak.
HTTP 202 kezelés (csak .NET)
A "call HTTP" API automatikusan implementálhatja a lekérdezési fogyasztói minta ügyféloldalát. Ha egy úgynevezett API egy HTTP 202-választ ad vissza egy Hely fejléccel, a vezénylő függvény automatikusan lekérdezi a Hely erőforrást, amíg nem kap 202-től eltérő választ. Ez a válasz lesz a vezénylő függvény kódjának visszaadott válasza.
[FunctionName(nameof(CheckSiteAvailabilityWithPolling))]
public static async Task CheckSiteAvailabilityWithPolling(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
Uri url = context.GetInput<Uri>();
// HTTP automatic polling on 202 response is enabled by default in .NET in-process.
DurableHttpResponse response =
await context.CallHttpAsync(HttpMethod.Get, url);
}
Note
- Az Orchestrator-függvények natív módon támogatják a kiszolgálóoldali lekérdezési fogyasztói mintát is, az Async-műveletkövetésben leírtak szerint. Ez a támogatás azt jelenti, hogy az egyik függvényalkalmazás vezénylései egyszerűen összehangolhatják a vezénylő függvényeket más függvényalkalmazásokban. Ez hasonló az alvezénylési koncepcióhoz, de támogatja az alkalmazásközi kommunikációt. Ez a támogatás különösen hasznos mikroszolgáltatás-stílusú alkalmazások fejlesztéséhez.
- A beépített HTTP-lekérdezési minta jelenleg csak a .NET gazdagépen érhető el.
- A lekérdezési minta alapértelmezés szerint engedélyezve van .NET in-process-ben, de alapértelmezés szerint le van tiltva .NET Isolated-ben. Ha engedélyezni szeretné a .NET Isolated környezetben, tekintse meg a mintakódot, és állítsa az asynchronousPatternEnabled argumentumot igazra.
- Az automatikus HTTP lekérdezési minta a Durable Functions .NET-ben v1.5.0 vagy újabb verziótól elérhető és támogatott.
Felügyelt identitások
Durable Functions natív módon támogatja azokat az API-kat, amelyek Microsoft Entra jogkivonatokat fogadnak az engedélyezéshez. Ez a támogatás Azure felügyelt identitásokat használ, hogy megszerezze ezeket a tokeneket.
Az alábbi kód egy vezénylő függvény példája. A függvény hitelesített hívásokat indít egy virtuális gép újraindításához a AZURE RESOURCE MANAGER virtual gépek REST API használatával.
[FunctionName("RestartVm")]
public static async Task RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
string subscriptionId = "mySubId";
string resourceGroup = "myRG";
string vmName = "myVM";
string apiVersion = "2019-03-01";
// Automatically fetches an Azure AD token for resource = https://management.core.windows.net/.default
// and attaches it to the outgoing Azure Resource Manager API call.
var restartRequest = new DurableHttpRequest(
HttpMethod.Post,
new Uri($"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Compute/virtualMachines/{vmName}/restart?api-version={apiVersion}"),
tokenSource: new ManagedIdentityTokenSource("https://management.core.windows.net/.default"));
DurableHttpResponse restartResponse = await context.CallHttpAsync(restartRequest);
if (restartResponse.StatusCode != HttpStatusCode.OK)
{
throw new ArgumentException($"Failed to restart VM: {restartResponse.StatusCode}: {restartResponse.Content}");
}
}
Az előző példában a tokenSource paraméter úgy van beállítva, hogy Microsoft Entra tokeneket szerezzen be az Azure Resource Manager számára. Az tokeneket az erőforrás URI-ja https://management.core.windows.net/.default azonosítja. A példa feltételezi, hogy az aktuális függvényalkalmazás helyileg fut, vagy felügyelt identitással rendelkező függvényalkalmazásként lett üzembe helyezve. A rendszer feltételezi, hogy a helyi identitás vagy a felügyelt identitás rendelkezik engedéllyel a megadott erőforráscsoportban myRGlévő virtuális gépek kezeléséhez.
Futásidőben a konfigurált jogkivonat-forrás automatikusan egy OAuth 2.0 hozzáférési jogkivonatot ad vissza. A forrás ezután tulajdonosi jogkivonatként hozzáadja a jogkivonatot a kimenő kérés engedélyezési fejlécéhez. Ez a modell az engedélyezési fejlécek HTTP-kérelmekhez való manuális hozzáadásának továbbfejlesztése az alábbi okokból:
- A tokenek frissítése automatikusan történik. Nem kell aggódnia a lejárt jogkivonatok miatt.
- A tokenek soha nincsenek tartósan tárolva a vezénylési állapotban.
- A tokenek beszerzésének kezeléséhez nem kell kódot írnia.
A precompiled C# RestartVMs mintában talál egy teljesebb példát.
A felügyelt identitások nem korlátozódnak Azure erőforrás-kezelésre. Felügyelt identitások használatával bármely olyan API-t elérhet, amely elfogad Microsoft Entra tulajdonosi jogkivonatokat, beleértve a Microsofttól származó Azure szolgáltatásokat és a partnerek webalkalmazásait. A partner webalkalmazása akár egy másik függvényalkalmazás is lehet. A Microsoft Microsoft Entra ID hitelesítést támogató Azure szolgáltatásainak listáját a Microsoft Entra hitelesítést támogató Azure szolgáltatásokról talál.
Limitations
A HTTP API-k meghívásának beépített támogatása kényelmi funkció. Ez nem minden esetben megfelelő.
A vezénylő függvények által küldött HTTP-kérések és válaszaik szerializáltak és megmaradnak üzenetekként a Durable Functions társzolgáltatóban. Ez az állandó üzenetsor-kezelés biztosítja, hogy a HTTP-hívások megbízhatóak és biztonságosak legyenek a vezénylési visszajátszáshoz. A folyamatos üzenetsor-kezelési viselkedés azonban korlátozásokkal is rendelkezik:
- Minden HTTP-kérés további késést jelent a natív HTTP-ügyfélhez képest.
- A konfigurált tárolószolgáltatótól függően a nagy kérés- vagy válaszüzenetek jelentősen csökkenthetik a vezénylés teljesítményét. Amikor például az Azure Storage-ot használja, a túl nagy HTTP-hasznos terhek, amelyek nem férnek el az Azure Queue üzeneteiben, tömörítve és az Azure Blob Storage-ban tárolva lesznek.
- A streamelés, a darabolt adatcsomagok és a bináris hasznos adatok nem támogatottak.
- A HTTP-ügyfél viselkedésének testreszabása korlátozott.
Ha ezek közül a korlátozások közül bármelyik hatással lehet a használati esetre, érdemes inkább tevékenységfüggvényeket és nyelvspecifikus HTTP-ügyfélkódtárakat használni kimenő HTTP-hívások indításához.
Bővíthetőség (csak .NET folyamaton belüli)
A orchestration belső HTTP-ügyfél viselkedésének testreszabása Azure Functions .NET függőséginjektálás használatával lehetséges a folyamaton belüli munkavégző számára. Ez a képesség hasznos lehet kis viselkedési módosítások elvégzéséhez. A HTTP-ügyfél egységteszteléséhez is hasznos lehet a modellobjektumok injektálásával.
Az alábbi példa a külső HTTP-végpontokat meghívó vezénylő függvények TLS/SSL-tanúsítványérvényesítésének letiltására szolgáló függőséginjektálás használatát mutatja be.
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
// Register own factory
builder.Services.AddSingleton<
IDurableHttpMessageHandlerFactory,
MyDurableHttpMessageHandlerFactory>();
}
}
public class MyDurableHttpMessageHandlerFactory : IDurableHttpMessageHandlerFactory
{
public HttpMessageHandler CreateHttpMessageHandler()
{
// Disable TLS/SSL certificate validation (not recommended in production!)
return new HttpClientHandler
{
ServerCertificateCustomValidationCallback =
HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
};
}
}