Wdrażanie bez przestojów dla Durable Functions
Niezawodny model wykonywania Durable Functions wymaga, aby aranżacje były deterministyczne, co stwarza dodatkowe wyzwanie, które należy wziąć pod uwagę podczas wdrażania aktualizacji. Jeśli wdrożenie zawiera zmiany w sygnaturach funkcji działania lub logice orkiestratora, wystąpienia orkiestracji w locie kończą się niepowodzeniem. Ta sytuacja jest szczególnie problemem w przypadku wystąpień długotrwałych aranżacji, które mogą reprezentować godziny pracy lub dni pracy.
Aby zapobiec wystąpieniu tych błędów, dostępne są dwie opcje:
- Opóźnij wdrożenie do momentu ukończenia wszystkich uruchomionych wystąpień aranżacji.
- Upewnij się, że wszystkie uruchomione wystąpienia orkiestracji korzystają z istniejących wersji funkcji.
Poniższy wykres porównuje trzy główne strategie, aby osiągnąć wdrożenie bez przestojów dla Durable Functions:
Strategia | Kiedy stosować | Zalety | Wady |
---|---|---|---|
Przechowywanie wersji | Aplikacje, które nie doświadczają częstych zmian powodujących niezgodność. | Proste do zaimplementowania. | Zwiększony rozmiar aplikacji funkcji w pamięci i liczbie funkcji. Duplikowanie kodu. |
Sprawdzanie stanu z miejscem | System, który nie ma długotrwałych aranżacji trwających dłużej niż 24 godziny lub często nakładających się aranżacji. | Prosta baza kodu. Nie wymaga dodatkowego zarządzania aplikacjami funkcji. |
Wymaga dodatkowego zarządzania kontem magazynu lub centrum zadań. Wymaga okresów czasu, gdy nie są uruchomione żadne aranżacje. |
Routing aplikacji | System, który nie ma okresów czasu, gdy orkiestracje nie są uruchomione, takie jak te okresy z orkiestracjami, które trwają ponad 24 godziny lub często nakładające się aranżacje. | Obsługuje nowe wersje systemów z ciągłym uruchamianiem aranżacji, które mają zmiany powodujące niezgodność. | Wymaga inteligentnego routera aplikacji. Może maksymalnie uzyskać maksymalną liczbę aplikacji funkcji dozwolonych przez subskrypcję. Wartość domyślna to 100. |
W pozostałej części tego dokumentu opisano te strategie bardziej szczegółowo.
Uwaga
Opisy tych strategii wdrażania bez przestojów zakładają, że używasz domyślnego dostawcy usługi Azure Storage dla Durable Functions. Wskazówki mogą nie być odpowiednie, jeśli używasz dostawcy magazynu innego niż domyślny dostawca usługi Azure Storage. Aby uzyskać więcej informacji na temat różnych opcji dostawcy magazynu i sposobu ich porównywania, zobacz dokumentację dostawców magazynu Durable Functions.
Przechowywanie wersji
Zdefiniuj nowe wersje funkcji i pozostaw stare wersje w aplikacji funkcji. Jak widać na diagramie, wersja funkcji staje się częścią jego nazwy. Ponieważ poprzednie wersje funkcji są zachowywane, wystąpienia orkiestracji w locie mogą nadal się do nich odwoływać. W międzyczasie żądania dotyczące nowych wystąpień aranżacji wywołają najnowszą wersję, do której może odwoływać się funkcja klienta aranżacji z ustawienia aplikacji.
W tej strategii należy skopiować każdą funkcję, a jej odwołania do innych funkcji muszą zostać zaktualizowane. Możesz ułatwić pisanie skryptu. Oto przykładowy projekt ze skryptem migracji.
Uwaga
Ta strategia używa miejsc wdrożenia, aby uniknąć przestojów podczas wdrażania. Aby uzyskać bardziej szczegółowe informacje na temat tworzenia i używania nowych miejsc wdrożenia, zobacz Azure Functions miejsca wdrożenia.
Sprawdzanie stanu z miejscem
Podczas gdy bieżąca wersja aplikacji funkcji jest uruchomiona w miejscu produkcyjnym, wdróż nową wersję aplikacji funkcji w miejscu przejściowym. Przed zamianą miejsc produkcyjnych i przejściowych sprawdź, czy istnieją jakieś uruchomione wystąpienia orkiestracji. Po zakończeniu wszystkich wystąpień aranżacji można dokonać zamiany. Ta strategia działa w przypadku przewidywalnych okresów, gdy nie są w locie żadne wystąpienia orkiestracji. Jest to najlepsze podejście, gdy aranżacje nie są długotrwałe, a wykonywanie aranżacji nie nakłada się często.
Konfiguracja aplikacji funkcji
Aby skonfigurować ten scenariusz, wykonaj poniższą procedurę.
Dodaj miejsca wdrożenia do aplikacji funkcji na potrzeby przemieszczania i produkcji.
Dla każdego miejsca ustaw ustawienie aplikacji AzureWebJobsStorage na parametry połączenia udostępnionego konta magazynu. Te parametry połączenia konta magazynu są używane przez środowisko uruchomieniowe Azure Functions do bezpiecznego przechowywania kluczy dostępu funkcji.
Dla każdego miejsca utwórz nowe ustawienie aplikacji, na przykład
DurableManagementStorage
. Ustaw jej wartość na parametry połączenia różnych kont magazynu. Te konta magazynu są używane przez rozszerzenie Durable Functions do niezawodnego wykonywania. Użyj oddzielnego konta magazynu dla każdego miejsca. Nie oznaczaj tego ustawienia jako ustawienia miejsca wdrożenia.W sekcji durableTask pliku host.json aplikacji funkcji określ
connectionStringName
(Durable 2.x) lubazureStorageConnectionStringName
(Durable 1.x) jako nazwę ustawienia aplikacji utworzonego w kroku 3.
Na poniższym diagramie przedstawiono opisaną konfigurację miejsc wdrożenia i kont magazynu. W tym potencjalnym scenariuszu wdrażania wstępnego wersja 2 aplikacji funkcji jest uruchomiona w miejscu produkcyjnym, podczas gdy wersja 1 pozostaje w miejscu przejściowym.
Przykłady pliku host.json
Poniższe fragmenty kodu JSON to przykłady ustawienia parametrów połączenia w pliku host.json .
Funkcje 2.0
{
"version": 2.0,
"extensions": {
"durableTask": {
"hubName": "MyTaskHub",
"storageProvider": {
"connectionStringName": "DurableManagementStorage"
}
}
}
}
Functions w wersji 1.x
{
"durableTask": {
"azureStorageConnectionStringName": "DurableManagementStorage"
}
}
Konfiguracja potoku ciągłej integracji/ciągłego wdrażania
Skonfiguruj potok ciągłej integracji/ciągłego wdrażania tylko wtedy, gdy aplikacja funkcji nie ma oczekujących ani uruchomionych wystąpień orkiestracji. W przypadku korzystania z usługi Azure Pipelines możesz utworzyć funkcję sprawdzającą te warunki, jak w poniższym przykładzie:
[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() });
}
Następnie skonfiguruj bramę przemieszczania tak, aby czekała, aż nie zostaną uruchomione żadne aranżacje. Aby uzyskać więcej informacji, zobacz Release deployment control using gates (Kontrola wdrażania wydania przy użyciu bram)
Usługa Azure Pipelines sprawdza aplikację funkcji pod kątem uruchamiania wystąpień orkiestracji przed rozpoczęciem wdrażania.
Teraz nowa wersja aplikacji funkcji powinna zostać wdrożona w miejscu przejściowym.
Na koniec zamień miejsca.
Ustawienia aplikacji, które nie są oznaczone jako ustawienia miejsca wdrożenia, są również zamieniane, więc aplikacja w wersji 2 zachowuje odwołanie do konta magazynu A. Ponieważ stan orkiestracji jest śledzony na koncie magazynu, wszelkie aranżacje uruchomione w aplikacji w wersji 2 będą nadal działać w nowym miejscu bez przerwy.
Aby użyć tego samego konta magazynu dla obu miejsc, możesz zmienić nazwy centrów zadań. W takim przypadku należy zarządzać stanem miejsc i ustawieniami HubName aplikacji. Aby dowiedzieć się więcej, zobacz Centra zadań w Durable Functions.
Routing aplikacji
Ta strategia jest najbardziej złożona. Można go jednak używać w przypadku aplikacji funkcji, które nie mają czasu między uruchamianiem aranżacji.
W przypadku tej strategii należy utworzyć router aplikacji przed Durable Functions. Ten router można zaimplementować za pomocą Durable Functions. Router ponosi odpowiedzialność za:
- Wdróż aplikację funkcji.
- Zarządzanie wersją Durable Functions.
- Kierowanie żądań orkiestracji do aplikacji funkcji.
Po pierwszym odebraniu żądania orkiestracji router wykonuje następujące zadania:
- Tworzy nową aplikację funkcji na platformie Azure.
- Wdraża kod aplikacji funkcji w nowej aplikacji funkcji na platformie Azure.
- Przekazuje żądanie orkiestracji do nowej aplikacji.
Router zarządza stanem, w którym wersja kodu aplikacji jest wdrażana na platformie Azure.
Router kieruje żądania wdrożenia i aranżacji do odpowiedniej aplikacji funkcji na podstawie wersji wysłanej z żądaniem. Ignoruje wersję poprawki.
Podczas wdrażania nowej wersji aplikacji bez zmiany powodującej niezgodność można zwiększać wersję poprawki. Router jest wdrażany w istniejącej aplikacji funkcji i wysyła żądania dotyczące starych i nowych wersji kodu, które są kierowane do tej samej aplikacji funkcji.
Podczas wdrażania nowej wersji aplikacji z powodu zmiany powodującej niezgodność można zwiększać wersję główną lub pomocniczą. Następnie router aplikacji tworzy nową aplikację funkcji na platformie Azure, wdraża ją i kieruje do niej żądania nowej wersji aplikacji. Na poniższym diagramie uruchamianie aranżacji w wersji 1.0.1 aplikacji jest nadal uruchomione, ale żądania dotyczące wersji 1.1.0 są kierowane do nowej aplikacji funkcji.
Router monitoruje stan aranżacji w wersji 1.0.1 i usuwa aplikacje po zakończeniu wszystkich aranżacji.
Ustawienia magazynu śledzenia
Każda aplikacja funkcji powinna używać oddzielnych kolejek planowania, na przykład na oddzielnych kontach magazynu. Jeśli chcesz wykonywać zapytania dotyczące wszystkich wystąpień aranżacji we wszystkich wersjach aplikacji, możesz udostępniać tabele wystąpień i historii w aplikacjach funkcji. Tabele można udostępniać, konfigurując trackingStoreConnectionStringName
ustawienia i trackingStoreNamePrefix
w pliku ustawień host.json , aby wszystkie używały tych samych wartości.
Aby uzyskać więcej informacji, zobacz Zarządzanie wystąpieniami w Durable Functions na platformie Azure.