mixi2 Developer Platform
開発ガイド

gRPC ストリームでイベントを受信する

gRPC ストリーミング方式によるイベント受信の仕組み、SDK を使った実装方法、再接続の仕様を解説します。

gRPC ストリーム方式では、mixi2 のサーバーに常時接続し、リアルタイムでイベントを受信します。外部公開 URL が不要なため、ローカル開発やプロトタイピングに適した受信方式です。

前提条件

  • SDK ガイド で SDK のインストールと認証の実装が完了していること

gRPC ストリーム方式の特徴

メリット:

  • 外部公開 URL が不要
  • ローカル開発で即座にテスト可能
  • リアルタイム性が高い

デメリット:

  • 常時接続が必要
  • 接続が切れた場合、その間のイベントは失われる
  • スケールアウトが難しい

推奨シーン: ローカル開発、プロトタイピング、単一インスタンスで十分な小規模アプリケーション

SDK による実装

package main

import (
    "context"
    "crypto/tls"
    "log"
    "os"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"

    "github.com/mixigroup/mixi2-application-sdk-go/auth"
    "github.com/mixigroup/mixi2-application-sdk-go/event/stream"
    application_streamv1 "github.com/mixigroup/mixi2-application-sdk-go/gen/go/social/mixi/application/service/application_stream/v1"
    modelv1 "github.com/mixigroup/mixi2-application-sdk-go/gen/go/social/mixi/application/model/v1"
)

type MyHandler struct{}

func (h *MyHandler) Handle(ctx context.Context, ev *modelv1.Event) error {
    log.Printf("Received event: %v", ev)
    return nil
}

func main() {
    authenticator, err := auth.NewAuthenticator(
        os.Getenv("CLIENT_ID"),
        os.Getenv("CLIENT_SECRET"),
        os.Getenv("TOKEN_URL"),
    )
    if err != nil {
        log.Fatal(err)
    }

    conn, err := grpc.NewClient(
        os.Getenv("STREAM_ADDRESS"),
        grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})),
    )
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    client := application_streamv1.NewApplicationServiceClient(conn)
    watcher := stream.NewStreamWatcher(client, authenticator)

    if err := watcher.Watch(context.Background(), &MyHandler{}); err != nil {
        log.Fatal(err)
    }
}

イベントハンドラ(EventHandler インターフェース)の詳細は SDK ガイド - イベントハンドラの実装 を参照してください。

再接続の仕様

ストリーミング接続が切断された場合、SDK は自動的に再接続を試みます。

項目
再接続方式指数バックオフ(1秒, 2秒, 4秒)
最大リトライ回数3 回

再接続中に発生したイベントは失われます。イベントの厳密な到達保証が必要な場合は、Webhook 方式の使用を検討してください。

Ping イベント

gRPC ストリーム方式では、イベントがない状態が 20 秒続くと Ping イベントが送信されます。Ping イベントは SDK 内部で処理されるため、Handle メソッドには渡されません。開発者が特別な対応をする必要はありません。

次のステップ

On this page