encore-go-pubsub について
Encore Go の開発者向け Pub/Sub スキルです。トピックとサブスクリプションの宣言、イベント配信、配信保証を説明します。ライブラリコードへ公開権限を渡す型付き参照も扱います。
主な機能
- 01トピックとサブスクリプションの宣言
- 02非同期イベントの公開
- 03配信保証の設定
- 04型付きトピック参照の利用
活用シーン
- 01サービス間の非同期イベント送信
- 02イベント購読ハンドラーの作成
- 03ライブラリへの公開権限の限定的な受け渡し
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ encoredev/ skills --skill encore-go-pubsubインストール後、Claude Code で/encore-go-pubsubを入力して読み込まれたか確認します。
詳細
Encore Go Pub/Sub
手順
Pub/Sub はサービス間の非同期メッセージングに使用します。プロデューサーは Topic にイベントを発行し、コンシューマーは Subscription をアタッチして反応します。リソースはパッケージレベルの変数として宣言する必要があります — 決して関数の内部で宣言しないでください。
トピック
package events
import "encore.dev/pubsub"
type OrderCreatedEvent struct {
OrderID string `json:"order_id"`
UserID string `json:"user_id"`
Total int `json:"total"`
}
// Package level declaration
var OrderCreated = pubsub.NewTopic[*OrderCreatedEvent]("order-created", pubsub.TopicConfig{
DeliveryGuarantee: pubsub.AtLeastOnce,
})
発行
msgID, err := events.OrderCreated.Publish(ctx, &events.OrderCreatedEvent{
OrderID: "123",
UserID: "user-456",
Total: 9999,
})
サブスクリプション
package notifications
import (
"context"
"myapp/events"
"encore.dev/pubsub"
)
var _ = pubsub.NewSubscription(events.OrderCreated, "send-confirmation-email",
pubsub.SubscriptionConfig[*events.OrderCreatedEvent]{
Handler: sendConfirmationEmail,
},
)
func sendConfirmationEmail(ctx context.Context, event *events.OrderCreatedEvent) error {
// Send email...
return nil
}
トピック参照
静的解析を維持したまま、ライブラリコードにトピックへのアクセスを渡します:
// Create a reference with publish permission
ref := pubsub.TopicRef[pubsub.Publisher[*OrderCreatedEvent]](OrderCreated)
// Use the reference in library code
func publishEvent(ref pubsub.Publisher[*OrderCreatedEvent], event *OrderCreatedEvent) error {
_, err := ref.Publish(ctx, event)
return err
}
配信保証
pubsub.AtLeastOnce(デフォルト): 重複して配信される可能性があります → ハンドラーは冪等でなければなりません。pubsub.ExactlyOnce: より厳密ですが、スループットに上限があります (AWS 300 msg/s/topic、GCP 3000+ msg/s/region)。発行側では重複排除を行いません。
ガイドライン
- トピックとサブスクリプションはパッケージレベルの変数として宣言する必要があります。
- サブスクリプションハンドラーは冪等でなければなりません (デフォルトでは at-least-once 配信です)。
- サブスクリプションハンドラーは
context.Contextとイベントポインターを受け取ります。トピックのリトライポリシーに従ってリトライするにはerrorを返します。 Publishの呼び出し元で重い同期処理を行わないでください —Publishはメッセージがキューに入った時点で戻ります。
コメント
Markdown 対応