Skip to content
AI 文档索引 ↗

Go 上报方式 ​

先在服务端 SDK 概览按事件风险选定路径,再使用本页的构造。安装、首条事件和 Gin 备注在Go 集成;Track 与画像签名在Go 基础 API。

路径构造本页
默认批量server.NewClient批量
日志交接consumer.NewLoggingConsumer日志
同步直发consumer.NewDirectConsumer直发
宿主事务 Outbox宿主数据库与 Relay,不由 SDK 再构造一种 ClientOutbox

日志与直发示例展示低层 Consumer;普通业务埋点使用快速接入页的 Client.Track()。

默认批量 ​

server.NewClient 使用有界内存队列和后台冲刷。初始化示例在集成页。

默认队列的进程退出风险见服务端 SDK 概览。需要与业务事务一起提交的事实使用宿主事务 Outbox。

日志交接 ​

LoggingConsumer 将事件写入本地文件;文件格式、交接、磁盘预算和恢复规则见日志交接边界。

go
import (
	"github.com/track-business/track-business-sdk-go/consumer"
)

logger, err := consumer.NewLoggingConsumer(consumer.LoggingOptions{
	Directory:     "/var/log/track-business",
	FilePrefix:    "events",
	MaxFileBytes:  64 << 20,
	MaxTotalBytes: 1 << 30,
	SyncPolicy:    consumer.SyncOnFlush,
})
if err != nil {
	panic(err)
}
defer logger.Close()

if err := logger.Accept(event); err != nil {
    // 由宿主处理写入失败,并记录不含事件正文的诊断。
}

同步直发 ​

DirectConsumer 使用宿主提供的 Transport 发送事件。确认与重试语义见服务端 SDK 概览。

go
direct, err := consumer.NewDirectConsumer(consumer.DirectOptions{Transport: transport})
if err != nil {
	panic(err)
}
result, err := direct.Accept(ctx, event)
if err != nil {
    // 由宿主处理未完成或未知结果;不要标记为成功。
} else {
    _ = result.Outcome // 按结果决定后续处理。
}

result.Outcome 只描述这一次响应:accepted、rejected 或 unresolved。超时和未完成是未知,不是成功。

宿主事务 Outbox ​

宿主事务 Outbox 由业务数据库事务和 Relay 实现;不要把同一事件同时送入默认队列。实现边界见服务端 SDK 概览。

业务写入与不可变事件记录必须使用同一个数据库事务;回滚时两者一起回滚。不要先提交订单,再调用 track(),并把这称为事务 Outbox。数据库迁移、事件完整序列化、租约、重试/死信与终态行保留均由宿主管理,SDK 不会自动安装数据库表或驱动。

接收端整批 ACK 与宿主终态提交是两个步骤。若接收端已接受但数据库提交报错或更新零行,Relay 报告提交未知并停止本次 drain。此时不能标记成功,也不能生成新的 eventId 作为补偿;按原记录、原 eventId 及稳定批次身份重试,并由 Collector 幂等处理。跨步骤不承诺 Exactly Once。

领取、续约、accepted/rejected 与 release 必须按记录 ID 和租约 token 限制,且终态/续约还须检查租约未过期;旧 owner 不能改变新 owner 的记录。租约使用数据库统一时间。慢发送需要续约时,宿主 Store 实现续约接口并显式配置间隔;间隔必须小于租约,留出数据库和网络抖动余量。续约失败时即使 HTTP 返回成功,也不能据此提交 accepted,已发出的请求不能靠本地取消撤回。

Go Store 可实现 relay.RenewableStore,构造时通过 relay.Options{LeaseRenewalInterval: interval} 显式启用。未配置时不自动续约。用 errors.As(err, &unknown) 识别 *relay.CommitUnknownError 后暂停本 Relay 后续调度,交由宿主恢复策略处理;不要把错误字符串或事件值直接写入日志。Core 仍不依赖数据库驱动或 Gin。

自定义 Store 触发 panic,或续约在发送结束后仍未退出时,当前 Relay 会停用该 Store。核对数据库记录与租约,并确认旧调用已退出,再创建新 Relay。普通 Client 的自定义 EventStore 触发 panic 后,准入返回 storage_unavailable,flush 返回 ErrCommitUnknown。恢复前须先核对 Store,避免覆盖可能已提交的数据。