メインコンテンツまでスキップ

Handle Multiple Events

Last updated on July 14, 2026

注釈:本資料はAI技術を用いて翻訳されています。

Overview

Extend Event Handler アプリは gRPC サーバーです。AccelByte Gaming Services (AGS) は Kafka にイベントを送信し、Extend プラットフォームは gRPC メソッドを呼び出すことで各イベントをアプリに配信します。

1 つの Extend Event Handler アプリで、必要な数だけイベントを処理できます。関心のあるイベントごとに、以下を行います。

  1. その Protocol Buffers (Protobuf) 定義を追加する。
  2. proto が生成する gRPC サービスを実装する。
  3. そのサービスを gRPC サーバーに登録する。

設定が必要な特別なルーターはありません。すべての AGS イベントは単一の OnMessage RPC を持つ独自の gRPC サービスにマッピングされるため、サービスを追加で実装することは、単純に 1 つのアプリがより多くのイベントに応答することを意味します。このパターンは Go、Java、Python、C# のすべてで同一に機能します。異なるのは言語の仕組みだけです。

背景については、Extend Event Handler アプリテンプレートを使い始めるおよび独自の Extend Event Handler アプリを作成するを参照してください。

イベント配信の仕組み

各 AGS イベントは、1 つの RPC を持つサービスとして .proto ファイルに記述されています。メッセージ(例: UserLoggedIn)にはイベントのペイロードが含まれます。

// One service per event. The message (for example, UserLoggedIn) carries the payload.
service UserAuthenticationUserLoggedInService {
rpc OnMessage(UserLoggedIn) returns (google.protobuf.Empty);
}

service UserAuthenticationUserLoggedOutService {
rpc OnMessage(UserLoggedOut) returns (google.protobuf.Empty);
}

AccelByte のイベント仕様の proto ファイル(アカウント、認証、ユーザーイベントをはじめ多数のドメインを対象とします)は、accelbyte-api-proto リポジトリで公開されています。AGS が userLoggedIn イベントを発生させると、Extend プラットフォームはアプリの UserAuthenticationUserLoggedInService/OnMessage を呼び出します。そのサービスを実装し登録していれば、コードが実行されます。実装していない場合、そのイベントは単に処理されません。

複数のイベントを処理するための手順は、常に同じ 3 つのステップです。

  1. 必要なイベントごとに proto を追加し、コードを再生成する。
  2. OnMessage ハンドラーを記述して、生成されたサービスを実装する。
  3. サービスを gRPC サーバーに登録する。

リファレンスアプリには、UserLoggedIn(および UserThirdPartyLoggedIn)が例としてすでに実装されています。追加するすべてのイベントに対して同じパターンを拡張していきます。

サービスの追加、実装、登録

以下の手順では、各言語で 3 ステップのパターンをどのように適用するかを示します。例として、既存のログインハンドラーと並んで userLoggedOut イベント用のハンドラーを追加します。

参照: extend-event-handler-csharp

  1. proto を追加して参照する。 proto を Protos/iam/account/v1/(または適切なパス)に配置し、ビルド時に生成されるように .csproj ファイルで参照します。

    <ItemGroup>
    <Protobuf Include="Protos\iam\account\v1\account.proto" GrpcServices="Server" />
    </ItemGroup>
  2. サービスを実装する。 Services/ の中で行います。生成された ...ServiceBase を拡張し、OnMessage をオーバーライドします。

    // Services/UserLoggedOutService.cs
    public class UserLoggedOutService
    : UserAuthenticationUserLoggedOutService.UserAuthenticationUserLoggedOutServiceBase
    {
    private readonly ILogger<UserLoggedOutService> _Logger;

    public UserLoggedOutService(ILogger<UserLoggedOutService> logger,
    IAccelByteServiceProvider abProvider)
    {
    _Logger = logger;
    }

    public override Task<Empty> OnMessage(UserLoggedOut request, ServerCallContext context)
    {
    _Logger.LogInformation("Received UserLoggedOut event: {@Request}", request);
    // ... your custom logic ...
    return Task.FromResult(new Empty());
    }
    }
  3. サービスを登録する。 Program.cs にもう 1 つ MapGrpcService<T>() 呼び出しを追加します。

    app.MapGrpcService<UserLoggedInService>();
    app.MapGrpcService<UserThirdPartyLoggedInService>();
    app.MapGrpcService<UserLoggedOutService>(); // <-- your new handler

イベントを追加するたびに、新しいサービスクラス 1 つと MapGrpcService<T>() 呼び出し 1 つが必要になります。

複数のイベントをローカルでテストする

すべてのリファレンスアプリは gRPC リフレクションを公開し、デフォルトでポート 6565 で動作するため、Postman のような gRPC クライアントで各ハンドラーをテストできます。

  1. プレーンテキストとリフレクションを有効にして localhost:6565 に接続します。
  2. メソッドのドロップダウンから、テストしたいサービス(例: UserAuthenticationUserLoggedInService/OnMessageUserAuthenticationUserLoggedOutService/OnMessage)を選択します。
  3. namespaceuserId などのフィールドを含むサンプルのイベントペイロードを JSON として送信します。
  4. 呼び出しが成功すると空のレスポンス(google.protobuf.Empty)が返ることを確認します。

登録済みのすべてのハンドラーが応答することを確認するために、各イベントについて繰り返します。デプロイ後は、AGS が実際のイベントを対応するサービスへ自動的にルーティングします。