跳到正文

参考

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 不一致,以源码为准。