Akcja wyjątku zablokowanego wystąpienia

Właściwość InstanceLockedExceptionAction magazynu wystąpień przepływu pracy SQL umożliwia określenie akcji, jaką powinien podjąć dostawca trwałości SQL po odebraniu elementu InstanceLockedException. Dostawca trwałości otrzymuje ten wyjątek, gdy próbuje zablokować wystąpienie usługi przepływu pracy, które jest obecnie zablokowane przez innego hosta usługi. Wartości tej właściwości to NoRetry, BasicRetryi AggressiveRetry. Domyślna wartość to NoRetry. Na poniższej liście opisano trzy opcje:

  • NoRetry. Host usługi nie próbuje zablokować wystąpienia usługi przepływu pracy i przekazuje InstanceLockedException element do obiektu wywołującego. Jeśli przepływ pracy pozostaje w pamięci przez okres przekraczający 60 sekund, użyj NoRetry go jako ponawiania próby. Domyślna wartość to NoRetry.

  • BasicRetry. Host usługi reattempts w celu zablokowania wystąpienia usługi przepływu pracy z liniowym interwałem między ponownymi próbami i przekazuje InstanceLockedException element do obiektu wywołującego na końcu sekwencji. Jeśli przepływ pracy pozostaje w pamięci około 5–60 sekund, a komunikaty docierają do partii, w których jest bardziej prawdopodobne, że komunikaty są wysyłane do tego samego wystąpienia na tym samym hoście, aby przetworzyć wszystkie komunikaty przed zwolnieniem przepływu pracy, użyj polecenia BasicRetry , aby osiągnąć najlepsze opóźnienie bez marnowania zasobów.

  • AggressiveRetry. Host usługi reattempts w celu zablokowania wystąpienia usługi przepływu pracy z interwałem wycofywania wykładniczego między ponownymi próbami i przekazuje wyjątek do obiektu wywołującego na końcu sekwencji. Jeśli przepływ pracy pozostaje w pamięci przez bardzo krótki czas (mniej niż 5 sekund) lub farma sieci Web jest duża, a prawdopodobieństwo dostarczenia innego komunikatu do tego samego hosta nie jest bardzo wysokie, użyj AggressiveRetry polecenia , aby osiągnąć najlepsze opóźnienie.

Funkcja akcji wyjątku zablokowanego wystąpienia obsługuje następujące scenariusze. We wszystkich scenariuszach, jeśli właściwość instanceLockedExceptionAction klasy SqlWorkflowInstanceStore jest ustawiona na BasicRetry wartość lub AggressiveRetry, host w sposób przezroczysty ponawia próbę, aby okresowo uzyskiwać blokadę wystąpień.

  1. Włączenie bezproblemowego zamknięcia i nakładającego się recyklingu domen aplikacji. Załóżmy, że element AppDomain z hostem usługi z uruchomionymi wystąpieniami usługi przepływu pracy jest odzyskiwany, a nowa domena aplikacji jest wprowadzana w celu równoległego obsługi nowych żądań, podczas gdy stary element AppDomain jest bezpiecznie wyłączany. Zamknięcie czeka na bezczynność wystąpień usługi przepływu pracy, a następnie utrwala i zwalnia wystąpienia. Wszelkie próby hostów w nowej domenie aplikacji w celu zablokowania wystąpienia spowodują wystąpienie .InstanceLockedException

  2. Skalowanie w poziomie trwałych przepływów pracy w homogenicznej farmie serwerów. Załóżmy, że węzeł farmy serwerów, na którym jest uruchomione wystąpienie przepływu pracy, ulega awarii, a host przepływu pracy nie może usunąć blokad na uruchomionym wystąpieniu. Gdy host usługi uruchomiony w innym węźle farmy odbiera komunikat dla tego wystąpienia przepływu pracy, próbuje uzyskać blokady na tych wystąpieniach, otrzyma InstanceLockedExceptionkomunikat . Blokady wygasną po pewnym czasie, ponieważ host, który miał odnowić blokadę, już nie istnieje.

    Skalowanie w poziomie trwałych przepływów pracy w homogenicznej farmie serwerów. Załóżmy, że chcesz skalować trwały przepływ pracy przy użyciu wielu hostów za modułem równoważenia obciążenia sieciowego (moduł równoważenia obciążenia sieciowego), host przepływu pracy uruchomiony w jednym węźle farmy ładuje wystąpienie przepływu pracy i przetwarza komunikat, a następny komunikat do wystąpienia jest kierowany do hosta uruchomionego w innym węźle, ponieważ równoważenie obciążenia sieciowego nie ma algorytmu routingu w celu dostarczania komunikatów do hosta, który już uruchamia wystąpienie. Po otrzymaniu komunikatu drugi host próbuje załadować wystąpienie przepływu pracy i odbiera InstanceLockedException go, ponieważ pierwszy host ma blokadę w wystąpieniu. Pierwszy host odblokuje wystąpienie po zakończeniu przetwarzania pierwszego komunikatu, a drugi host uzyskuje blokadę po następnym ponawia próbę, ładuje wystąpienie i przetwarza drugi komunikat.