Sagaとワークフロー
長時間実行されるプロセスを調整します。
「Sagaとワークフロー」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
長時間のワークフローを調整する
注文の作成、支払い、在庫の確保、発送など、ビジネスプロセスによっては複数のメッセージや手順にまたがり、時間もかかります。このような長時間実行されるワークフローを調整し、メッセージ間で状態を追跡するのが サガです。
サガとは
サガは状態を持つコンシューマーです。関連するメッセージを相関付け、ワークフローの現在の状態を保持し、プロセスが完了するまでイベントに応じて状態を遷移させます。
ステートマシン型のサガ
MassTransit では、MassTransitStateMachine を使ったステートマシンとしてサガをモデル化します。状態、イベント、遷移を宣言的に定義します。
dotnet add package MassTransit
// state machine sagas are built inサガの状態
状態は SagaStateMachineInstance を実装するクラスです。CorrelationId と、手順の間で保持する必要があるデータを格納します。
public class OrderState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string CurrentState { get; set; }
public decimal Amount { get; set; }
}状態とイベントを宣言する
ステートマシン内で、State プロパティと、メッセージ型に対応する Event プロパティを宣言します。
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; }
}相関付け
すべてのイベントは、通常は OrderId のような共有 ID を使って、正しいサガインスタンスと相関付ける必要があります。これにより、受信したメッセージが正しい実行中のワークフローに振り分けられます。
Event(() => PaymentReceived, e =>
e.CorrelateById(m => m.Message.OrderId));遷移を定義する
コンストラクターで動作を組み立てます。初期イベントによってインスタンスを作成し、データを保存して、次の状態へ遷移させます。
Initially(
When(OrderPlaced)
.Then(ctx => ctx.Saga.Amount = ctx.Message.Amount)
.TransitionTo(AwaitingPayment));状態に応じて反応する
During を使って特定の状態でのみ有効なイベントを処理し、その後続メッセージをパブリッシュして次の状態へ遷移させます。
During(AwaitingPayment,
When(PaymentReceived)
.Publish(ctx => new OrderConfirmed(ctx.Saga.CorrelationId))
.TransitionTo(Completed)
.Finalize());サガの状態を永続化する
サガの状態は再起動後も保持する必要があるため、リポジトリに保存します。Entity Framework、MongoDB、Redis などを利用できます。MassTransit は各メッセージの処理前後にインスタンスを読み込み、保存します。
x.AddSagaStateMachine<OrderSaga, OrderState>()
.EntityFrameworkRepository(r =>
{
r.ExistingDbContext<OrderDbContext>();
});スケジュールによるタイムアウト
サガでは Schedule を使ってタイムアウトをスケジュールできます(たとえば、30 分以内に支払いを受け取れなければキャンセルするなど)。その後、タイムアウトイベントを処理して補償処理を行います。
補償処理
後続の手順が失敗した場合、サガは補償アクションを実行して以前の処理を取り消せます(請求を返金する、在庫を解放するなど)。これにより、分散トランザクションを使わずにプロセス全体の整合性を保てます。
クイックチェック
サガとワークフローをテストします。
まとめ
サガは、状態を持ち相関付けされたコンシューマーとして、長時間実行されるワークフローを調整します。MassTransit では、MassTransitStateMachine と SagaStateMachineInstance の状態、宣言した State/Event メンバー、ID による相関付け、Initially/During による遷移を使用します。状態はリポジトリに永続化し、タイムアウトにはスケジュールを使用します。失敗時には補償処理によって以前の手順を取り消します。
よくある質問
「Sagaとワークフロー」レッスンは無料ですか?
はい。「Sagaとワークフロー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「Sagaとワークフロー」で何を学びますか?
長時間実行されるプロセスを調整します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Sagaとワークフロー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- メッセージングの概念
- メッセージの生成と消費
- Sagaとワークフロー
- エラー処理と再試行