跳到主要内容

网站架构

把当前能力与演进目标,放在同一张清晰的图里

1ll.me 使用前后端分离的模块化单体:Nuxt 负责体验,Go 负责业务 API 与跳转,PostgreSQL 保存权威数据,Redis 和后台 Worker 承担可恢复的加速与异步任务。

当前已运行 · 本地开发环境

一次请求现在怎样完成

管理请求和短链跳转共享同一套安全策略与权威数据,但在 Go 内部走各自清晰的模块边界。

Nuxt 前端

保留现有页面体验,只通过 /api/v1 调用业务能力

短链访问

访问 1ll.me/{code},进入精简的跳转热路径

Go 模块化单体

API、身份、链接、跳转、统计与管理模块运行在一个可独立部署的系统中

PostgreSQL

账户、工作空间、链接、审计与同步意图的唯一权威来源

Redis 双角色

redis-cache 可丢弃;redis-control 承担限流、计数和统计 Stream

后台 Worker

批量聚合统计、处理通知与受限后台任务,不阻塞跳转

一致性边界

先确保数据正确,再让缓存和异步任务追上

链接修改不会依赖 Redis 成功。权威记录、审计与 outbox 意图在同一个 PostgreSQL 事务中提交,提交后才失效缓存。

  1. 1校验身份、工作空间与输入
  2. 2在一个事务中修改链接
  3. 3同时写入审计与 outbox
  4. 4提交后失效缓存并异步处理

运行原则

高效来自边界,而不是只因为使用 Go

跳转热路径足够短

缓存命中直接解析;未命中回到 PostgreSQL,并把统计发送到有界异步通道。

故障可以降级

Redis 缓存不可用时回到数据库;统计流不可用时使用有容量限制的本地 spool。

安全策略在服务端执行

工作空间授权、URL 策略、会话摘要、CSRF、Origin 与敏感日志处理不依赖前端。

资源全部有上限

请求体、连接池、队列、批任务和并发入口保持有界,并支持优雅关闭。

演进目标 · 尚未接入生产

Cloudflare Worker + D1 是故障兜底层,不是第二个主系统

目标是在 VPS 不可用时,让已经同步的短链继续跳转。PostgreSQL 仍是唯一权威数据源;D1 只保存跳转所需的最小投影,并可从 PostgreSQL 重建。

签名 outbox 投递

Worker 将租约、批量发送、重试、死信与对账补齐后,才能连接测试环境。

单调版本与删除墓碑

D1 只接受更新版本,删除事件不能被迟到的旧消息重新复活。

故障统计合并

边缘故障访问单独记录,VPS 恢复后再由后台任务幂等合并。

演练后再发布

完成安全检查、恢复演练与生产等价压测,并获得明确确认后才会变更线上链路。

现在可以如何理解这套系统

已经具备
Go API、PostgreSQL 权威数据、Redis 缓存/控制、后台 Worker、健康与指标端点
仍在完善
OpenAPI 对齐、完整业务能力、Cloudflare 投递与 D1 对账、灾难恢复自动化
尚未声称
生产就绪、容灾已上线,或达到设计目标中的吞吐量与延迟
查看实时 Go API 检查