跳转到内容

Go 扩展(P2)

本页对应 SEO 计划中的 P2:Extending with Go。它面向「要在生产里长期维护」的扩展方式。

优先考虑 Go 的典型信号:

  • 计算/聚合很重:排行榜、复杂统计、批处理
  • 要接入成熟基础设施:消息队列、可观测性、指标、链路追踪、灰度发布
  • 需要更强的可测试性:核心业务规则希望有稳定的单测/基准测试
  • 对性能与资源敏感:高 QPS、低延迟、内存可控

如果只是「轻量校验 + 少量业务胶水 + 自定义接口」,通常 JS hooks 更快更灵活(见下一页)。

  1. 直接修改/编译 PocketBase(Go)
  • 适合:深度定制、需要引入 Go 依赖、对生命周期/性能强控制
  • 成本:升级 PocketBase 时需要重新集成与回归测试
  1. 外挂服务(Go/其他语言)
  • 适合:团队已有服务体系、需要独立伸缩/部署
  • 模式:PocketBase 作为 Auth + CRUD,服务负责重逻辑
  1. PocketBase hooks(JS)
  • 适合:快速迭代、BFF/轻量 API、定时任务、自动化

推荐的工程组织(可长期演进)

Section titled “推荐的工程组织(可长期演进)”
  • internal/:业务核心(纯逻辑,易测)
  • pkg/:可复用包(必要时对外)
  • cmd/pocketbase/:入口(注册 routes/hooks/commands)
  • cmd/worker/:可选,异步任务/cron(若不想依赖 PB 的 cron)

关键原则:不要把业务写进 handler。handler 负责解析输入、调用 domain、返回响应。

  • 所有密钥来自环境变量或密钥系统(不要写死)
  • 外部调用统一超时与重试策略(并可配置)
  • 写入尽量用事务(PocketBase 的 runInTransaction / DB transaction)
  • 统计类写入尽量隔离到独立集合(本项目已将插件 stats 放在 plugin_stats 里)
  • 关键路径:请求耗时、错误率、队列堆积、外部依赖耗时
  • 将关键任务(例如 release sync)做成可追踪的「一次执行」记录(便于审计)

本仓库当前的生产实现以 PocketBase + JS hooks 为主:

  • apps/backend/pb_hooks/:自定义 Routes、限流、同步 GitHub releases、Newsletter 邮件
  • 需要 Go 时建议把 重计算/高并发 的部分迁到独立 Go 服务,再由 hooks 调用或写回 PB。

如果你希望我继续把某些模块(例如:更复杂的搜索/聚合、评论反垃圾、统计离线聚合)用 Go 服务落地,我可以按这个结构补齐并提供部署方式。