Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het betrouwbare uitvoeringsmodel van Durable Functions vereist dat orkestraties deterministisch zijn, waardoor een uitdaging ontstaat bij het implementeren van updates. Wanneer een implementatie ingrijpende wijzigingen bevat — zoals gewijzigde handtekeningen van activiteitsfuncties of aangepaste orchestratorlogica — mislukken lopende orkestratie-instanties. Deze situatie is vooral een probleem voor langlopende orkestraties, die uren of dagen werk kunnen vertegenwoordigen.
Opmerking
Bij de strategieën in dit artikel wordt ervan uitgegaan dat u de standaardprovider Azure Storage gebruikt voor Durable Functions. Als u een andere opslagprovider gebruikt, zijn de richtlijnen mogelijk niet van toepassing. De strategie voor orkestratieversiebeheer is de uitzondering — het werkt met elke opslag-backend. Zie Durable Functions-opslagproviders voor meer informatie over opslagprovideropties.
In de volgende tabel worden vier strategieën vergeleken voor het bereiken van implementatie zonder downtime. Kies de strategie die het beste overeenkomt met uw workload:
| Strategie | Wanneer gebruiken | Pros | Cons |
|---|---|---|---|
| Orkestratieversiebeheer (aanbevolen) | Toepassingen met belangrijke wijzigingen waarvoor meerdere indelingsversies gelijktijdig moeten worden uitgevoerd. | Maakt implementaties zonder downtime mogelijk met ingrijpende wijzigingen. De ingebouwde functie vereist minimale configuratie. Werkt met elke opslagbackend. |
Vereist zorgvuldige orchestratorcodewijzigingen voor versiecompatibiliteit. |
| Versiebeheer op basis van naam | Toepassingen met sporadische brekende veranderingen waarbij eenvoud de voorkeur heeft. | Eenvoudig te implementeren. | Grotere grootte van functie-apps in het geheugen en het aantal functies. Codeduplicatie. |
| Statuscontrole met slot | Systemen met korte orkestraties (minder dan 24 uur) en voorspelbare pauzes tussen uitvoeringen. | Eenvoudige codebasis. Hiervoor is geen extra beheer van functie-apps vereist. |
Hiervoor is extra opslagaccount- of taakhubbeheer vereist. Vereist perioden waarin geen orkestraties worden uitgevoerd. |
| Toepassingsroutering | Systemen met continu actieve orchestraties (langer dan 24 uur) of vaak overlappende uitvoeringen zonder niet-actieve vensters. | Verwerkt nieuwe versies van systemen met voortdurend actieve orkestraties die brekende wijzigingen hebben. | Vereist een intelligente toepassingsrouter. Het aantal functietoepassingen dat uw abonnement mogelijk toestaat, kan worden gemaximeerd (standaard is 100). |
Orchestratieversiebeheer
De orchestratie-versiebeheerfunctie is de aanbevolen strategie voor implementaties zonder downtime met cruciale wijzigingen. Hiermee kunnen verschillende versies van orchestraties naast elkaar bestaan en zonder conflicten gelijktijdig worden uitgevoerd.
Met orchestratie-versiebeheer:
- Elke orchestratie-instantie krijgt bij de aanmaak een versie die er permanent aan is gekoppeld.
- Workers met nieuwere orchestrator-versies kunnen oudere versie-exemplaren blijven uitvoeren.
- Medewerkers die oudere orkestratieversies gebruiken, kunnen geen nieuwere versie-instanties uitvoeren.
- Orchestrator-functies kunnen de uitvoering van hun versie en vertakking dienovereenkomstig onderzoeken.
Deze aanpak vereenvoudigt rolling upgrades waarbij workers met verschillende versies van uw toepassing veilig kunnen samenwerken. In tegenstelling tot de andere strategieën in dit artikel is orchestratie versiebeheer agnostisch ten opzichte van de back-end en werkt het met elke opslagprovider.
Zie Orchestration-versiebeheer voor volledige implementatiestappen, waaronder het configureren van versiebeheer, het verwerken van versievertakkingen in orchestratorcode en het beheren van rolling upgrades.
De resterende strategieën zijn alternatieven voor scenario's waarbij orchestratieversiebeheer niet geschikt is.
Versiebeheer op basis van naam
Met deze strategie maakt u nieuwe versies van uw functies naast de oude versies in dezelfde functie-app. De versie van elke functie wordt onderdeel van de naam (bijvoorbeeld MyOrchestrator_v1, MyOrchestrator_v2). Omdat eerdere versies behouden blijven, kunnen lopende orchestratie-instanties ernaar blijven verwijzen. Aanvragen voor nieuwe orchestratie-instanties roepen de laatste versie aan, waarnaar uw orchestratieklantfunctie kan verwijzen vanuit een app-instelling. In het volgende diagram ziet u deze benadering.
In deze strategie moet elke functie worden gekopieerd en moeten de verwijzingen naar andere functies worden bijgewerkt. U kunt het eenvoudiger maken door een script te schrijven. Hier volgt een voorbeeldproject met een migratiescript.
Opmerking
Deze strategie maakt gebruik van implementatieslots om uitvaltijd tijdens de implementatie te voorkomen. Voor meer uitgebreide informatie over het maken en gebruiken van nieuwe implementatieslots, zie Azure Functions implementatieslots.
Statuscontrole met slot
Terwijl de huidige versie van uw functie-app wordt uitgevoerd in uw productiesite, implementeert u de nieuwe versie van uw functie-app in uw staging-site. Voordat u uw productie- en staging-slots verwisselt, controleert u of er actieve orchestratie-instanties zijn. Nadat alle orkestratie-instanties zijn voltooid, kunt u de overschakeling uitvoeren. Deze strategie werkt wanneer u voorspelbare periodes hebt waarin er geen orkestratie-instanties worden uitgevoerd. Dit is de beste aanpak wanneer uw orkestraties niet lange tijd duren en wanneer uw orkestratie-uitvoeringen niet vaak overlappen.
Configuratie van functie-app
Gebruik de volgende procedure om dit scenario in te stellen.
Voeg implementatieslots toe aan uw functie-app voor staging en productie.
Stel voor elke slot de toepassinginstelling AzureWebJobsStorage in op de verbinding met een gedeeld opslagaccount. Deze opslagaccountverbinding wordt gebruikt door de Azure Functions runtime om de toegangssleutels van de functies veilig op te slaan. Voor het hoogste beveiligingsniveau moet u een beheerde identiteitverbinding met uw opslagaccount gebruiken.
Maak voor elke slot een nieuwe app-instelling, bijvoorbeeld
DurableManagementStorage. Stel de waarde ervan in op het verbindingsreeks van verschillende opslagaccounts. Deze opslagaccounts worden gebruikt door de Durable Functions-extensie voor betrouwbare uitvoering. Gebruik een afzonderlijk opslagaccount voor elke slot. Stel deze instelling niet in als een implementatie-slot-instelling. Ook hier zijn verbindingen op basis van beheerde identiteiten het veiligst.Geef in de durableTask-sectie van het host.json-bestand (Durable 2.x) of
connectionStringName(Durable 1.x) op als de naam van de app-instelling die u in stap 3 hebt gemaakt.
In het volgende diagram wordt de beschreven configuratie van implementatieslots en opslagaccounts weergegeven. In dit potentiële predeploymentscenario wordt versie 2 van een functie-app uitgevoerd in de productiesite, terwijl versie 1 in de staging-site blijft.
host.json voorbeeld
In het volgende JSON-fragment ziet u de verbindingsreeks-instelling in het bestand host.json.
{
"version": 2.0,
"extensions": {
"durableTask": {
"hubName": "MyTaskHub",
"storageProvider": {
"connectionStringName": "DurableManagementStorage"
}
}
}
}
Opmerking
Voor verouderde Functions 1.x-apps gebruikt u de azureStorageConnectionStringName eigenschap rechtstreeks in de durableTask sectie in plaats van storageProvider.connectionStringName.
CONFIGURATIE van CI/CD-pijplijn
Configureer uw CI/CD-pijplijn zodanig dat deze alleen wordt uitgevoerd wanneer uw functie-app geen lopende of actieve orkestratie-instanties heeft. Wanneer u Azure-pipelines gebruikt, kunt u een functie maken die op deze voorwaarden controleert, zoals in het volgende C#-voorbeeld. Hetzelfde patroon is van toepassing op andere talen: opvragen van orkestratie-exemplaren met Pending of Running status en retourneren of er bestaan.
[FunctionName("StatusCheck")]
public static async Task<IActionResult> StatusCheck(
[HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
var runtimeStatus = new List<OrchestrationRuntimeStatus>();
runtimeStatus.Add(OrchestrationRuntimeStatus.Pending);
runtimeStatus.Add(OrchestrationRuntimeStatus.Running);
var result = await client.ListInstancesAsync(new OrchestrationStatusQueryCondition() { RuntimeStatus = runtimeStatus }, CancellationToken.None);
return (ActionResult)new OkObjectResult(new { HasRunning = result.DurableOrchestrationState.Any() });
}
Configureer vervolgens de faseringspoort om te wachten totdat er geen orkestraties worden uitgevoerd. Zie Release-implementatiebeheer met behulp van poorten voor meer informatie
Azure-pipelines controleert uw functie-app op het uitvoeren van orchestration-exemplaren voordat de implementatie wordt gestart.
Nu moet de nieuwe versie van uw functietoepassing worden geïmplementeerd in de staging-slot.
Wissel ten slotte van plaatsen.
Toepassingsinstellingen die niet zijn gemarkeerd als implementatieslot-instellingen, worden ook gewisseld, zodat de versie 2-app de verwijzing naar opslagaccount A behoudt. Omdat de orkestratiestatus wordt bijgehouden in het opslagaccount, blijven alle orkestraties die worden uitgevoerd op de versie 2-app zonder onderbreking in de nieuwe slot doorgaan.
Als u hetzelfde opslagaccount voor beide sites wilt gebruiken, kunt u de namen van uw taakhubs wijzigen. In dit geval moet u de status van uw slots en de HubName-instellingen van uw app beheren. Zie Task-hubs in Durable Functions voor meer informatie.
Toepassingsroutering
Deze strategie is de meest complexe, maar het is de enige optie voor systemen met continu actieve orkestraties die nooit een inactief venster hebben voor slot swaps.
Voor deze strategie maakt u een toepassingsrouter vóór uw Durable Functions, bijvoorbeeld een Azure-functie met HTTP-triggers of een API Management-exemplaar dat wordt gerouteerd op basis van versieheaders. De router is verantwoordelijk voor:
- De functie-app implementeren.
- Beheren welke versie van de app actief is.
- Routering van orchestratieverzoeken naar de juiste functie-applicatie op basis van versie.
De eerste keer dat een orchestratieverzoek wordt ontvangen, voert de router de volgende taken uit:
- Hiermee maakt u een nieuwe functie-app in Azure.
- Implementeert de code van uw functie-app in de nieuwe functie-app in Azure.
- Stuurt het orchestratieverzoek naar de nieuwe app.
De router beheert de status van welke versie van de code van uw app wordt geïmplementeerd in welke functie-app in Azure.
De router stuurt implementatie- en indelingsaanvragen naar de juiste functie-app op basis van de versie die met de aanvraag is verzonden. De patchversie wordt genegeerd.
Wanneer u een nieuwe versie van uw app implementeert zonder een belangrijke wijziging, kunt u de patchversie verhogen. De router wordt geïmplementeerd in uw bestaande functie-app en verzendt aanvragen voor de oude en nieuwe versies van de code, die worden gerouteerd naar dezelfde functie-app.
Wanneer u een nieuwe versie van uw app implementeert met een belangrijke wijziging, kunt u de primaire of secundaire versie verhogen. Vervolgens maakt de toepassingsrouter een nieuwe functie-app in Azure, implementeert deze en stuurt aanvragen voor de nieuwe versie van uw app naar de app. In het volgende diagram blijven orkestraties draaien op de versie 1.0.1 van de app, maar aanvragen voor de versie 1.1.0 worden doorgestuurd naar de nieuwe functie toepassing.
De router monitort de status van orkestraties op versie 1.0.1 en verwijdert apps nadat alle orkestraties zijn voltooid.
Store-instellingen bijhouden
Elke functie-app moet afzonderlijke planningswachtrijen gebruiken, mogelijk in afzonderlijke opslagaccounts. Als u query's wilt uitvoeren op alle orchestratie-instanties in alle versies van uw toepassing, kunt u exemplaar- en geschiedenistabellen delen tussen uw functie-apps. U kunt tabellen delen door de trackingStoreConnectionStringName instellingen en trackingStoreNamePrefix instellingen in het host.json-instellingenbestand te configureren, zodat ze allemaal dezelfde waarden gebruiken.
Voor meer informatie, zie Beheer installaties in Durable Functions in Azure.