About encore-go-pubsub
A Pub/Sub skill for Encore Go developers, covering topic and subscription declarations, event publishing, and delivery semantics. It also explains typed topic references for passing publish access into library code.
Key features
- 01Declare topics and subscriptions
- 02Publish asynchronous events
- 03Configure delivery guarantees
- 04Use typed topic references
Use cases
- 01Send asynchronous events between services
- 02Build event subscription handlers
- 03Pass scoped publish access to libraries
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ encoredev/ skills --skill encore-go-pubsubAfter installing, type/encore-go-pubsubin Claude Code to confirm it loaded.
Details
From the project READMEEncore Go Pub/Sub
Instructions
Pub/Sub is for asynchronous messaging between services. Producers publish events to a Topic; consumers attach Subscriptions to react. Resources must be declared as package-level variables — never inside functions.
Topics
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,
})
Publishing
msgID, err := events.OrderCreated.Publish(ctx, &events.OrderCreatedEvent{
OrderID: "123",
UserID: "user-456",
Total: 9999,
})
Subscriptions
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
}
Topic References
Pass topic access to library code while maintaining static analysis:
// 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
}
Delivery Guarantees
pubsub.AtLeastOnce(default): may deliver duplicates → handlers must be idempotent.pubsub.ExactlyOnce: stricter, capped throughput (AWS 300 msg/s/topic, GCP 3000+ msg/s/region). Does not deduplicate on the publish side.
Guidelines
- Topics and subscriptions must be declared as package-level variables.
- Subscription handlers must be idempotent (at-least-once delivery is the default).
- Subscription handlers receive a
context.Contextand the event pointer; return anerrorto retry per the topic's retry policy. - Don't do heavy synchronous work in
Publishcallers —Publishreturns once the message is queued.
Comments
Markdown supported