edgecache 是 NexusMC 当前的 Go 旁车缓存服务,主要用于承接论坛、资源区、找服玩、视频区这类读多写少、可共享复用的数据面缓存。
它的目标不是替代 apps/server,而是作为一个独立的共享缓存层,逐步把高频公开读缓存从 Node.js 进程内迁到 Go sidecar,并为后续传输层和失效模型演进留出空间。
当前 edgecache 主要承担这几件事:
- 提供独立于
apps/server的共享缓存服务 - 组合
L1 内存缓存 + 可选 Redis L2 - 承接公开内容的高频读缓存
- 从通配清理逐步过渡到版本型失效
- 为
HTTP -> gRPC迁移提供可灰度的演进路径
一句话说,它是缓存旁车,不是业务后端。
- 纯 Go 内存缓存
- LRU 淘汰
- TTL 过期
- 统计信息
- 按模式清理
- 可选 Redis L2
- pub/sub 失效广播
- HTTP API
- 可选 gRPC API
- 健康检查
- 缓存统计
- forum 版本命名空间接口
apps/edgecache/packages/edgecache-client- 独立 TS/JS SDK
apps/server/packages/edgecache-client- 当前
apps/server实际使用的 workspace 包
- 当前
apps/server已接入这层 bridge- 支持
get / set / del / clear / mget / mset - 支持 forum 列表版本号读取与 bump
不是必须。
当前 apps/server 对 edgecache 的关系是“可选增强”:
- 如果设置了
EDGECACHE_ENABLED=true- 后端会尝试访问
edgecache - 命中时直接使用 sidecar 返回的数据
- 后端会尝试访问
- 如果
edgecache没启动、不可达或者未启用apps/server仍然可以正常启动- 读路径会自动回退到本地缓存或数据库逻辑
也就是说:
edgecache不是论坛后端的启动前置条件- 但如果要观察 sidecar 的实际收益,建议一起启动
推荐把 Redis 的用途拆成两类:
apps/edgecache- 使用
EDGECACHE_REDIS_* - 负责共享缓存层的 Redis L2
- 使用
apps/server- 使用
SOCKET_REDIS_URL - 只负责 Socket.IO 多实例广播等实时基础设施能力
- 使用
长期方向不是“后端完全不用 Redis”,而是:
- 后端不再直接把 Redis 当自己的缓存层
edgecache成为共享缓存 Redis 的主入口- 后端只保留基础设施导向的 Redis 用法
当前有两条访问路径:
这是现在的默认主路径,支持:
- TCP HTTP
- Unix Domain Socket HTTP
- Windows named pipe HTTP
这是现在的灰度路径。
当 apps/server 设置 EDGECACHE_TRANSPORT=grpc 时:
- 会优先走 gRPC
- 如果 gRPC 请求失败,会自动回退到 HTTP
这样可以先做灰度试跑,而不是一次性硬切。
先复制配置:
cp .env.example .env然后在 apps/edgecache 目录启动:
go run ./cmd/edgecache或者在仓库根目录启动:
npm run dev:edgecacheapps/edgecache/.env
EDGECACHE_LISTEN_NETWORK=tcp
EDGECACHE_LISTEN_ADDRESS=:4410apps/server/.env
EDGECACHE_ENABLED=true
EDGECACHE_TRANSPORT=http
EDGECACHE_URL=http://127.0.0.1:4410apps/edgecache/.env
EDGECACHE_LISTEN_NETWORK=unix
EDGECACHE_LISTEN_ADDRESS=./run/edgecache.sockapps/server/.env
EDGECACHE_ENABLED=true
EDGECACHE_TRANSPORT=http
EDGECACHE_SOCKET_PATH=./run/edgecache.sockapps/edgecache/.env
EDGECACHE_LISTEN_NETWORK=npipe
EDGECACHE_LISTEN_ADDRESS=edgecache-httpapps/server/.env
EDGECACHE_ENABLED=true
EDGECACHE_TRANSPORT=http
EDGECACHE_SOCKET_PATH=\\.\pipe\edgecache-httpapps/edgecache/.env
EDGECACHE_LISTEN_NETWORK=tcp
EDGECACHE_LISTEN_ADDRESS=:4410
EDGECACHE_GRPC_ENABLED=true
EDGECACHE_GRPC_LISTEN_NETWORK=tcp
EDGECACHE_GRPC_LISTEN_ADDRESS=127.0.0.1:4411apps/server/.env
EDGECACHE_ENABLED=true
EDGECACHE_TRANSPORT=grpc
EDGECACHE_GRPC_ENDPOINT=127.0.0.1:4411
# 灰度期间保留 HTTP fallback
EDGECACHE_URL=http://127.0.0.1:4410GET /healthzGET /v1/cache/getPOST /v1/cache/setPOST /v1/cache/mgetPOST /v1/cache/msetPOST /v1/cache/delPOST /v1/cache/clearGET /v1/cache/statsGET /v1/forum/version?namespace=...POST /v1/forum/version/bump
- 服务名:
edgecache.v1.EdgeCacheService
协议草案:
- proto/edgecache.proto
迁移说明:
- docs/grpc-migration-plan.md
像下面这些列表型 key,现在尽量使用带版本号的命名:
posts:list:{...}:v{n}boards:hot:list:{...}:v{n}resource:list:{...}:v{n}video:list:{...}:v{n}
这样做的好处:
- 避免长期依赖昂贵的通配清理
- 更适合多实例部署
- 更方便做 namespace 级失效
当前已经逐步接入 edgecache 的缓存域包括:
boards:hot:list:*posts:list:*post:{id}post:{id}:content
resource:list:*resource:{id}resource:summary:{id}resource:sidebar:{id}resource:content:{id}resource:platformsresource:collectionsresource:version-groupsresource:official-tag-groupsresource:game-versions:*resource:categories:*resource:categories-flat:*resource:game-versions-flat:*
player:list:*player:{id}player:{id}:ping-history:*player:help-configplayer:platformsplayer:categories:*player:versions:*
video:list:*video:categories:*video:{id}video:summary:{id}video:{id}:replies:*
inbox:{userId}:notifications:*inbox:{userId}:messages:*inbox:{userId}:rooms:*
EDGECACHE_LISTEN_NETWORKEDGECACHE_LISTEN_ADDRESSEDGECACHE_ADDR(兼容旧配置)
EDGECACHE_GRPC_ENABLEDEDGECACHE_GRPC_LISTEN_NETWORKEDGECACHE_GRPC_LISTEN_ADDRESS
EDGECACHE_L1_MAX_SIZEEDGECACHE_L1_CLEANUP_SECONDS
EDGECACHE_REDIS_ENABLEDEDGECACHE_REDIS_URLEDGECACHE_REDIS_PREFIXEDGECACHE_REDIS_CHANNELEDGECACHE_NODE_ID
edgecache/
├── core/ # L1 缓存核心
├── redis/ # Redis bridge / L2
├── server/ # HTTP + gRPC 服务层
├── proto/ # proto 草案 / 后续协议
├── packages/
│ └── edgecache-client/ # 独立 TS/JS 客户端
└── cmd/ # 可执行入口
apps/server/packages/
└── edgecache-client/ # apps/server 当前使用的 workspace SDK
现阶段最适合 edgecache 的场景:
- 公开内容缓存
- 共享读缓存
- 列表版本失效
- 命中率与热点观测
暂时不建议把它直接扩成:
- 消息队列
- 强一致业务中枢
- 事件总线替代品
更稳的路线还是这条:
- 先把主要公开读缓存域迁完
- 补齐观测与命中率可见性
- 稳定 gRPC 灰度路径
- 再逐步过渡到更强类型的 proto/codegen 传输层
- 最后再评估是否继续拆更多基础设施
如果你现在的问题是“这个服务是不是立刻必需”,那通常答案是:
- 对正确性来说:不是
- 对性能和后续架构演进来说:是,而且值得渐进式接入