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.

Strategia przechowywania wersji

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ę.

  1. Dodaj miejsca wdrożenia do aplikacji funkcji na potrzeby przemieszczania i produkcji.

  2. 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.

  3. 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.

  4. W sekcji durableTask pliku host.json aplikacji funkcji określ connectionStringName (Durable 2.x) lub azureStorageConnectionStringName (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.

Miejsca wdrożenia i konta magazynu

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)

Brama wdrożenia

Usługa Azure Pipelines sprawdza aplikację funkcji pod kątem uruchamiania wystąpień orkiestracji przed rozpoczęciem wdrażania.

Brama wdrożenia (uruchomiona)

Teraz nowa wersja aplikacji funkcji powinna zostać wdrożona w miejscu przejściowym.

Miejsce przejściowe

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.

Miejsce wdrożenia

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:

  1. Tworzy nową aplikację funkcji na platformie Azure.
  2. Wdraża kod aplikacji funkcji w nowej aplikacji funkcji na platformie Azure.
  3. Przekazuje żądanie orkiestracji do nowej aplikacji.

Router zarządza stanem, w którym wersja kodu aplikacji jest wdrażana na platformie Azure.

Routing aplikacji (po raz pierwszy)

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.

Routing aplikacji (brak zmian powodujących niezgodność)

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.

Routing aplikacji (zmiana powodująca niezgodność)

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.

Ustawienia magazynu śledzenia

Następne kroki