参考
Migrations 与 CLI
go-sequent 的 schema 迁移与运维 CLI:store.Migrate、migrate / replay / outbox 命令与参数,以及必须由应用二进制完成的阶段。
Migrations 与 CLI
go-sequent 有两类「迁移」:事件库 schema,以及读模型表(Projector 写出的查询表,例如余额表)。前者是一组带版本的 SQL 步骤;后者靠重建流水线从事件重放。
事件库 schema
Postgres store 的 Store.Migrate 按顺序应用 schema 步骤:
| 步骤 | 文件 |
|---|---|
| 1 | 001_phase1.sql |
| 2 | 002_phase2.sql |
| 3 | 003_store_events.sql |
| 4 | 004_phase3.sql |
| 5 | 005_hash_chain.sql |
| 6 | 006_event_json_bytea.sql |
store, err := postgres.Open(ctx, dsn, app.Events)
if err != nil { /* ... */ }
if err := store.Migrate(ctx); err != nil { /* ... */ }
Migrate 可以重复跑,也可以多进程同时跑。它用 Postgres advisory lock 串行化并发调用,并在 go_sequent_schema_migrations 里记下已应用步骤;之后再跑就是空操作。
请在发布流程的部署步骤或 init job 里执行迁移,不要让每个应用副本启动时都跑一遍——这样 schema 变更在发布流水线里是可见的。
核心表包括 commands、aggregates、events、各 *_types 注册表、aggregate_unique_keys、snapshot_records、aggregates_that_need_snapshots、idempotency_keys、outbox、event_tombstones 与 projector_replay_states。
docs/ops/sql/ 下的分区 SQL 只是示例,Migrate 永远不会应用它。见 分区。
CLI
CLI 位于 cmd/go-sequent。所有命令都接受 -dsn,默认取环境变量 GO_SEQUENT_PG_DSN。
go run ./cmd/go-sequent migrate -dsn "$GO_SEQUENT_PG_DSN"
go run ./cmd/go-sequent outbox -dsn "$DSN" [-once]
go run ./cmd/go-sequent replay -dsn "$DSN" -projector name -stage prepare -tables t1
打 tag 的发布版本会提供 Linux、macOS、Windows(amd64 与 arm64)的预编译 go-sequent 二进制。
migrate
打开 store 并执行 Migrate,完成后输出 migrate: ok。
replay
执行读模型重建流水线中的 schema 阶段。
| 参数 | 默认值 | 含义 |
|---|---|---|
-dsn |
$GO_SEQUENT_PG_DSN |
Postgres DSN(必填) |
-projector |
default |
Projector 名称,用作 replay 状态键 |
-stage |
all |
prepare、optimize、golive、abort(另有 replay、catchup、all,见下) |
-tables |
空 | 逗号分隔的托管表 |
-replay-schema |
replay_<name> |
replay schema 名称 |
-view-schema |
public |
表最终切换进入的线上 schema |
go run ./cmd/go-sequent replay -dsn "$DSN" -projector balances \
-stage prepare -tables account_balances
CLI 支持 prepare、optimize、golive 和 abort。需要流式读事件的阶段——replay、catchup 以及 all——会直接报错:它们需要你的 Projector 和事件源,而这只有应用二进制知道。这些阶段请在自己的程序里通过 replay.Pipeline API 运行。见 读模型重建。
outbox
通过轮询消费 Postgres Outbox(事务内记待发消息,事后轮询投递)。
| 参数 | 默认值 | 含义 |
|---|---|---|
-dsn |
$GO_SEQUENT_PG_DSN |
Postgres DSN(必填) |
-once |
false | 处理一批后退出 |
-interval |
1s |
轮询间隔 |
-batch |
10 |
每次领取的批大小 |
go run ./cmd/go-sequent outbox -dsn "$DSN" -once
自带 CLI 的投递处理器只会打印每条消息。要真正投递,请在自己的二进制里替换它。见 Publisher。
读模型迁移
读模型表不由 Migrate 管理。它们属于你的应用;形状变了,就用 replay 流水线从事件重建。以示例为例,bankpg.MigrateProjection(ctx, store.Pool) 在 store.Migrate 之后创建余额表。
Ruby Sequent 的数据
go-sequent 永不导入 Ruby Sequent 的数据库或 dump;schema 是 Go 原生设计。见 相对 Sequent Ruby。
相关
文档随 go-sequent 源码更新;若与 API 不一致,以源码为准。