# gotick 文档：重放模型、核心 API 与运维

> gotick 完整文档：重放模型、六个核心 API、在业务代码里驱动流程、常见场景示例、运维排查和已知局限。

文档

- [01快速上手](/docs.md)
- [02重放模型](/docs/model.md)
- [03底层实现](/docs/internals.md)
- [04核心 API](/docs/primitives.md)
- [05外部控制](/docs/control.md)
- [06示例](/docs/examples.md)
- [07运维与排查](/docs/operations.md)
- [08已知局限](/docs/limits.md)

# 从安装到跑起来第一个流程

先照这一篇装上，把第一个流程跑起来。然后读「重放模型」，那是唯一一件必须先弄明白的事。后面几篇是手册，用到再查。

本页目录

- [安装](#install)
- [注册流程，启动调度器](#write)
- [只负责触发的进程](#client)
- [写测试不用 Redis](#test)

gotick 是一个库，不是一个服务。没有东西要部署，没有表要迁移，也没有常驻进程要看着。它需要一个 Redis，你已经有的那个就行。

## 安装

需要 Go 1.25 以上。多个项目可以共用一个 Redis：给每个项目配一个自己的队列命名空间，它们就互不干扰。

复制

```
go get github.com/zbysir/gotick
```

## 注册流程，启动调度器

NewServerFromConfig 建一个 server，Flow 把流程定义登记到一个 id 上，StartServer 阻塞着跑调度。StartServer 一般放在 main 的最后一行，或者你 HTTP 服务旁边起一个 goroutine。注意注册不等于执行，真正让流程跑起来的是 Trigger。

复制

```
tick, err := gotick.NewServerFromConfig(gotick.Config{    RedisURL: "redis://localhost:6379/0",})if err != nil {    log.Fatal(err)} tick.Flow("order/close", func(ctx *gotick.Context) {    gotick.Task(ctx, "create-order", createOrder)    gotick.Sleep(ctx, "wait-payment", 30*time.Minute)    gotick.Task(ctx, "close-order", closeOrder)}) callId, err := tick.Trigger(ctx, "order/close", gotick.MetaData{    "order_id": "ORD-1",}) log.Fatal(tick.StartServer(ctx))
```

## 只负责触发的进程

HTTP handler 只需要启动流程，不需要自己执行流程。NewClient 只提供 Trigger。它通过 Redis 找到 worker，两个进程之间没有直连，可以各自独立发版。

复制

```
client, err := gotick.NewClient(gotick.NewClientConfig{    RedisURL: "redis://localhost:6379/0",})if err != nil {    log.Fatal(err)} // 0 = start nowcallId, err := client.Trigger(ctx, "order/close", meta, 0)
```

## 写测试不用 Redis

队列和存储都有内存实现，单元测试里跑的就是真流程：真调度、真重放、真重试，全在测试进程内完成。仓库里所有测试都这么写。

复制

```
tick := gotick.NewServer(gotick.NewServerParams{    DelayedQueue: store.NewMockRedisDelayedQueue(),    KVStore:      store.NewMockKvStore(),})
```

[下一篇 →\
\
重放模型](/docs/model.md)

本页目录

- [安装](#install)
- [注册流程，启动调度器](#write)
- [只负责触发的进程](#client)
- [写测试不用 Redis](#test)

> 全站页面清单：[/llms.txt](/llms.txt)
