0Pricing
C# Academy · レッスン

メッセージの生成と消費

MassTransitでメッセージを送受信し、処理します。

「メッセージの生成と消費」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

MassTransit の登録

DI で MassTransit を構成します。MassTransit を登録し、トランスポート(ここでは RabbitMQ)を指定して、コンシューマーを自動検出させます。

builder.Services.AddMassTransit(x =>
{
    x.AddConsumers(typeof(Program).Assembly);
    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("localhost");
        cfg.ConfigureEndpoints(context);
    });
});

コンシューマーを定義する

コンシューマーは、処理するメッセージ型に対して IConsumer<T> を実装します。ロジックは Consume に記述し、ConsumeContext<T> を受け取ります。

public class OrderPlacedConsumer : IConsumer<OrderPlaced>
{
    public async Task Consume(ConsumeContext<OrderPlaced> context)
    {
        OrderPlaced message = context.Message;
        // handle the event
    }
}

イベントをパブリッシュする

IPublishEndpoint を注入し、Publish を呼び出してすべてのサブスクライバーにイベントをブロードキャストします。

public class OrderService
{
    private readonly IPublishEndpoint _publish;
    public OrderService(IPublishEndpoint publish) => _publish = publish;

    public Task PlaceOrderAsync(Guid id, string email) =>
        _publish.Publish(new OrderPlaced(id, email));
}

コマンドを送信する

コマンドは特定のエンドポイントに送信します。送信先の ISendEndpoint を解決し、Send を呼び出します。

var endpoint = await _sendProvider
    .GetSendEndpoint(new Uri("queue:charge-payment"));
await endpoint.Send(new ChargePayment(orderId, amount));

Publish と Send のまとめ

Publish はイベントに使用し、購読しているすべてのコンシューマーに届きます。一方、Send はコマンドに使用し、1 つのキューを対象にします。適切に選択することで、ルーティングの動作が決まります。

ConsumeContext の力

ConsumeContext では、メッセージだけでなく、相関 ID やヘッダーも利用できます。また、コンシューマー内からパブリッシュや応答を行えるため、メッセージを連鎖させられます。

public async Task Consume(ConsumeContext<OrderPlaced> context)
{
    await context.Publish(new InvoiceRequested(context.Message.OrderId));
}

リクエストとレスポンス

MassTransit はメッセージングによるリクエストとレスポンスにも対応しています。リクエストクライアントはリクエストを送信して型付きの返信を待機します。これは回答が必要でありながら、ブローカー間の疎結合性も保ちたい場合に役立ちます。

var response = await _client
    .GetResponse<OrderStatus>(new GetOrder(orderId));
OrderStatus status = response.Message;

エンドポイントの命名

ConfigureEndpoints は規約に従い、コンシューマーごとに受信エンドポイント(キュー)へ自動的に名前を付けます。必要に応じて、フォーマッターや明示的な設定で名前をカスタマイズできます。

メッセージのシリアル化

MassTransit はデフォルトでメッセージを JSON としてシリアル化し、メタデータ(メッセージ型、ID など)も含めます。プロデューサーとコンシューマーはメッセージ契約の型を共有し、多くの場合は共有パッケージに配置します。

同時実行性

コンシューマーは多数のメッセージを並列に処理できます。PrefetchCount と同時実行数の制限を調整し、スループットと下流サービスの処理能力のバランスを取ります。

cfg.ReceiveEndpoint("orders", e =>
{
    e.PrefetchCount = 16;
    e.ConcurrentMessageLimit = 8;
    e.ConfigureConsumer<OrderPlacedConsumer>(context);
});

コンシューマーのテスト

MassTransit にはインメモリのテストハーネスが用意されています。実際のブローカーを使わずにメッセージをパブリッシュし、コンシューマーが処理したことをアサートできます。

クイックチェック

メッセージの生成と消費をテストします。

まとめ

AddMassTransit、トランスポート、ConfigureEndpoints を使って MassTransit を登録します。コンシューマーは IConsumer<T> を実装し、Consume メソッドを定義します。イベントには IPublishEndpoint.Publish(すべてのサブスクライバー)を、コマンドには ISendEndpoint.Send(1 つのキュー)を使用します。ConsumeContext ではメッセージの連鎖やリクエストとレスポンスを実現でき、テストハーネスを使ってコンシューマーをインメモリで検証できます。

よくある質問

「メッセージの生成と消費」レッスンは無料ですか?

はい。「メッセージの生成と消費」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「メッセージの生成と消費」で何を学びますか?

MassTransitでメッセージを送受信し、処理します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「メッセージの生成と消費」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. メッセージングの概念
  2. メッセージの生成と消費
  3. Sagaとワークフロー
  4. エラー処理と再試行
← C# Academyに戻る