mcpField
E
encore-go-pubsub

encore-go-pubsub

github.com/encoredev开发30319 次安装2 天前更新
代码仓库

关于 encore-go-pubsub

面向 Encore Go 服务开发者的 Pub/Sub 技能,说明如何声明主题和订阅、发布事件及处理投递语义。还涵盖类型化主题引用,便于在库代码中传递发布权限。

主要功能

  1. 01声明主题与订阅
  2. 02发布异步事件
  3. 03配置投递保证
  4. 04使用类型化主题引用

适用场景

  1. 01在服务间传递异步事件
  2. 02构建事件订阅处理器
  3. 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