0Pricing
C# Academy · Lekcja

Sagi i przepływy pracy

Koordynuj długotrwałe procesy.

Sagi i przepływy pracy to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Koordynowanie długotrwałych procesów

Niektóre procesy biznesowe obejmują wiele wiadomości i kroków wykonywanych w czasie: złożenie zamówienia, pobranie płatności, zarezerwowanie zapasów i wysyłka. Saga koordynuje taki długotrwały proces i śledzi jego stan na podstawie kolejnych wiadomości.

Czym jest saga?

Saga to konsument przechowujący stan. Koreluje powiązane wiadomości, przechowuje bieżący stan procesu i reaguje na zdarzenia, przechodząc między stanami aż do zakończenia procesu.

Sagi jako maszyny stanów

MassTransit modeluje sagi jako maszyny stanów za pomocą MassTransitStateMachine. Stany, zdarzenia i przejścia definiuje się deklaratywnie.

dotnet add package MassTransit
// state machine sagas are built in

Stan sagi

Stan jest klasą implementującą SagaStateMachineInstance. Zawiera właściwość CorrelationId oraz wszelkie dane, które trzeba zachować między kolejnymi krokami.

public class OrderState : SagaStateMachineInstance
{
    public Guid CorrelationId { get; set; }
    public string CurrentState { get; set; }
    public decimal Amount { get; set; }
}

Deklarowanie stanów i zdarzeń

W maszynie stanów deklaruje się właściwości State oraz właściwości Event, które odwzorowują typy wiadomości.

public class OrderSaga : MassTransitStateMachine<OrderState>
{
    public State AwaitingPayment { get; private set; }
    public State Completed { get; private set; }
    public Event<OrderPlaced> OrderPlaced { get; private set; }
    public Event<PaymentReceived> PaymentReceived { get; private set; }
}

Korelacja

Każde zdarzenie musi zostać skorelowane z właściwą instancją sagi, zwykle za pomocą wspólnego identyfikatora, takiego jak OrderId. Dzięki temu przychodzące wiadomości trafiają do właściwego procesu będącego w toku.

Event(() => PaymentReceived, e =>
    e.CorrelateById(m => m.Message.OrderId));

Definiowanie przejść

Konstruktor definiuje zachowanie: zdarzenie początkowe tworzy instancję, zapisuje dane i przełącza ją do kolejnego stanu.

Initially(
    When(OrderPlaced)
        .Then(ctx => ctx.Saga.Amount = ctx.Message.Amount)
        .TransitionTo(AwaitingPayment));

Reagowanie w stanie

Należy użyć During, aby obsługiwać zdarzenia prawidłowe tylko w określonym stanie, a następnie publikować kolejne wiadomości i przechodzić dalej.

During(AwaitingPayment,
    When(PaymentReceived)
        .Publish(ctx => new OrderConfirmed(ctx.Saga.CorrelationId))
        .TransitionTo(Completed)
        .Finalize());

Trwałe zapisywanie stanu sagi

Stan sagi musi przetrwać ponowne uruchomienia, dlatego jest przechowywany w repozytorium, takim jak Entity Framework, MongoDB, Redis lub inne rozwiązanie. MassTransit ładuje i zapisuje instancję przy obsłudze każdej wiadomości.

x.AddSagaStateMachine<OrderSaga, OrderState>()
    .EntityFrameworkRepository(r =>
    {
        r.ExistingDbContext<OrderDbContext>();
    });

Limity czasu z użyciem harmonogramów

Sagi mogą zaplanować limit czasu, na przykład anulowanie procesu, jeśli płatność nie zostanie otrzymana w ciągu 30 minut, za pomocą obiektu Schedule, a następnie obsłużyć zdarzenie limitu czasu w celu wykonania działań kompensujących.

Kompensacja

Jeśli późniejszy krok zakończy się niepowodzeniem, saga może wykonać działania kompensujące, aby cofnąć wcześniejsze działania, na przykład zwrócić pobraną kwotę lub zwolnić zapasy. Pozwala to zachować spójność całego procesu bez transakcji rozproszonych.

Szybkie sprawdzenie

Przetestowanie sag i procesów.

Podsumowanie

Saga koordynuje długotrwałe procesy jako stanowy konsument powiązanych wiadomości. MassTransit używa MassTransitStateMachine ze stanem SagaStateMachineInstance, zadeklarowanymi elementami State/Event, korelacją za pomocą identyfikatora oraz przejściami realizowanymi przez Initially/During. Stan jest utrwalany w repozytorium, limity czasu korzystają z harmonogramów, a kompensacja cofa wcześniejsze kroki w przypadku niepowodzenia.

Często zadawane pytania

Czy lekcja „Sagi i przepływy pracy” jest bezpłatna?

Tak — pełny tekst „Sagi i przepływy pracy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Sagi i przepływy pracy”?

Koordynuj długotrwałe procesy. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Sagi i przepływy pracy”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Koncepcje komunikacji
  2. Produkcja i konsumpcja komunikatów
  3. Sagi i przepływy pracy
  4. Obsługa błędów i ponawianie prób
← Powrót do C# Academy