Go
Go 是 AI infra 推荐语言之一,重点用于服务端、调度、队列、节点控制面、网关和高并发工具服务。
Go 适合放在 AI infra 层,而不是第一期所有 Agent 业务逻辑的默认语言。它的优势在于部署简单、并发模型稳定、标准库扎实、服务端工程成熟,适合承载调度、网关、节点控制面和高并发工具服务。
如果 TypeScript 负责产品体验,Python 负责模型与数据,Go 更像是 Agent 系统里的“控制面语言”:它负责把任务可靠分发出去,把状态收回来,把节点和队列管住。
学习目标
| 阶段 | 要能做到什么 |
|---|---|
| 入门 | 能写 package、struct、interface、error、HTTP handler 和测试。 |
| 工程 | 能使用 module、context、goroutine、channel、SQL、middleware 和 pprof。 |
| Agent infra | 能实现任务调度器、worker、工具网关、节点注册、健康检查和状态回传。 |
| 运维 | 能把服务打成单二进制或容器,观察日志、metrics、trace、pprof 和 race 问题。 |
基础特性
| 特性 | Agent infra 中的用途 |
|---|---|
| module | 管理服务依赖和内部 package。 |
| package | 拆分 API、调度、worker、存储、节点控制和配置。 |
| struct | 表达任务、节点、账号、工具调用、调度记录。 |
| interface | 定义 storage、queue、node client、tool gateway 等边界。 |
| error 返回 | 显式处理失败,不把失败隐藏在异常链里。 |
defer | 释放连接、关闭文件、记录 span、清理锁。 |
context.Context | 传递超时、取消、请求 ID、trace 和权限边界。 |
| goroutine | 并发执行 worker、心跳、回调、调度扫描。 |
| channel / select | 做任务分发、信号处理、并发协调和优雅退出。 |
| testing | 写单元测试、集成测试和 benchmark。 |
Go 的接口通常应该小而清楚:
package scheduler
import "context"
type Task struct {
ID string
Tool string
Payload []byte
}
type Queue interface {
Enqueue(ctx context.Context, task Task) error
Dequeue(ctx context.Context) (Task, error)
}这样的接口适合替换内存队列、Redis、Postgres、云队列或测试 fake。
高级特性
| 特性 | 什么时候需要 |
|---|---|
| context cancel/timeout | 控制长任务、节点请求、外部工具调用、数据库查询和服务退出。 |
| worker pool | 控制任务并发,避免爬虫、模型 API 或数据库被打爆。 |
| HTTP middleware | 注入日志、鉴权、trace、rate limit、panic recovery。 |
| gRPC / OpenAPI | 和其他服务建立稳定接口契约。 |
| SQL 事务 | 处理任务领取、状态更新、幂等和并发一致性。 |
| pprof | 排查 CPU、内存、goroutine 泄漏和阻塞。 |
| race detector | 查并发读写问题。 |
| 单二进制部署 | 降低部署复杂度,适合 infra 服务和内部工具。 |
一个长任务服务应优先把取消信号传到每一层:
package scheduler
import (
"context"
"time"
)
func RunTask(ctx context.Context, task Task) error {
ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
defer cancel()
return callTool(ctx, task)
}如果 callTool 继续把 ctx 传给 HTTP client、数据库和下游服务,用户取消、超时和服务退出就能被及时感知。
Agent Infra 重点
| 主题 | Go 要解决的问题 |
|---|---|
| 任务调度器 | 扫描任务、抢占任务、处理重试、超时、失败和幂等。 |
| 队列 worker | 控制并发、消费任务、更新状态、处理 dead letter。 |
| 工具网关 | 统一 HTTP/gRPC 工具服务,做鉴权、限流、审计和 trace。 |
| 节点控制面 | 节点注册、心跳、健康检查、能力上报和任务下发。 |
| 爬虫调度 | 账号池、节点池、平台限流、封控状态、VNC 接管和任务隔离。 |
| 可观测性 | 日志、metrics、trace、pprof、状态接口和运维诊断。 |
Go 特别适合那些“看起来不智能,但系统不稳就全盘失败”的部分。例如:任务是否只被领取一次、节点失联后任务如何恢复、同一账号是否被并发使用、工具调用是否有超时和审计。
不建议的用法
- 不要为了“性能”把产品层 Chat UI 和所有 Agent 编排都改成 Go。
- 不要在 Go 服务里硬写复杂 prompt 和 UI 状态,除非它本来就是工具服务边界。
- 不要绕过
context.Context写长任务,否则取消、超时和优雅退出会很难补。 - 不要把调度状态只放内存里,生产任务至少要考虑持久化和幂等。
与其他语言协作
| 边界 | 推荐做法 |
|---|---|
| TypeScript 调用 Go | 用 HTTP/gRPC/OpenAPI 暴露任务提交、状态查询和工具调用接口。 |
| Python 调用 Go | 用 Go 承担调度和高并发服务,Python 承担数据处理和模型逻辑。 |
| Go 调用 Rust | 对安全执行、解析器、CLI 或高性能组件,可通过子进程、FFI 或服务接口协作。 |
学习路径
- 先读 Go Documentation 和 Effective Go,理解 Go 的代码风格。
- 读 Go Modules,掌握依赖管理和模块边界。
- 查 Go Spec,补齐语言语义。
- 写一个小任务调度器:HTTP 提交任务、worker 消费、Postgres/SQLite 保存状态、context 控制超时。