关于 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,GCP 每个区域 3000+ msg/s)。发布端不会进行去重。
指南
- 主题和订阅必须声明为包级变量。
- 订阅处理程序必须具备幂等性(默认采用至少一次投递)。
- 订阅处理程序会接收
context.Context和事件指针;返回error时,会根据主题的重试策略进行重试。 - 不要在
Publish调用方中执行耗时的同步工作——Publish会在消息入队后立即返回。
评论
支持 Markdown