feat(cache): adopt FusionCache for business caching
Some checks are pending
ci / release-gate (push) Waiting to run

This commit is contained in:
2026-08-05 09:30:48 +08:00
parent 1aa1ed4829
commit 603bc24c26
18 changed files with 354 additions and 194 deletions

View File

@@ -125,9 +125,22 @@ Production 默认激活链接为 `https://{primaryHost}/activate/{activationId}#
跨租户 Worker、迁移、seed 和平台级后台操作必须通过 `ITenantContextInitializer.InitializeSystem` 或受审计的 `ITenantExecutionScope` 进入 System Scope并提供明确原因。业务代码不得直接关闭 Query Filter。
- Session、成员、租户和套餐状态始终从 PostgreSQL 重新校验。
- 租户、套餐和 Feature 变更在数据库提交后直接失效当前 API 进程与 Redis 中的相关缓存
- 租户、套餐和 Feature 变更在数据库提交后通过 FusionCache 失效本节点、Redis L2 和其他节点的 L1
- 后台任务在业务事务提交后持久化到 PostgreSQL独立 Worker 使用租约执行;延时和重试由 `RunAfter` 控制。
## FusionCache 业务缓存
租户目录、租户 Feature 快照和租户运行时配置共用命名缓存 `TikuBusiness`。FusionCache 管理独立 L1不与鉴权使用的 `IMemoryCache` 共享;配置 Redis 时复用现有连接作为 L2并通过 StackExchange.Redis Backplane 传播 `Set``Remove` 和过期通知。缓存 key 与 Backplane channel 使用 `tiku:<environment>:business:v2` 前缀,防止环境间串用。
| 数据 | L1 | L2 | 失效方式 |
| --- | --- | --- | --- |
| 租户目录命中 | 30 秒 | 300 秒 | TTL域名状态只查询 Active 租户和域名 |
| 租户目录未命中 | 20 秒 | 20 秒 | 自适应负缓存 TTL |
| 租户 Feature 快照 | 30 秒 | 60 秒 | Feature、套餐或租户变化后按读写 key 主动失效 |
| 租户运行时配置 | 120 秒 | 120 秒 | 配置发布、Owner 激活、Feature 或域名生命周期变化后主动失效 |
这些缓存不启用 fail-safe、eager refresh、后台分布式写入或分布式锁。Redis 缺失或暂时不可用时,读取回到 PostgreSQL 工厂;正常 TTL 之外不能继续返回旧租户状态、订阅或 Feature 数据。DbMigrator 只注册本地 L1不依赖 Redis。FusionCache 不接管 ASP.NET Core Output Cache也不参与下面的安全状态和版本化权限快照。
## Redis 授权缓存模式
`Security:AuthorizationCache:Mode` 支持三种当前实现模式:

View File

@@ -6,11 +6,11 @@
| 进程 | PostgreSQL | Redis | 说明 |
| --- | --- | --- | --- |
| `Tiku.Api` | 必需 | Development 可选Production 必需 | 提供 HTTP API、认证、授权和缓存 |
| `Tiku.Worker` | 必需 | Development 可选Production 必需 | 承载周期任务、任务队列、商业账务和授权缓存失效重试 |
| `Tiku.DbMigrator` | 必需 | 不需要 | 执行 Migration、内置目录 seed 和管理员引导 |
| `Tiku.Api` | 必需 | Development 可选Production 必需 | 提供 HTTP API、认证、授权、FusionCache L1/L2 和 Output Cache |
| `Tiku.Worker` | 必需 | Development 可选Production 必需 | 承载周期任务、业务缓存 Backplane 和授权缓存失效重试 |
| `Tiku.DbMigrator` | 必需 | 不需要 | 执行 Migration、内置目录 seed 和管理员引导FusionCache 仅使用本地 L1 |
Development 未配置 Redis 时,安全服务使用进程内/数据库防线。Production 不允许 Redis 降级;后台任务在所有环境统一使用 PostgreSQL。
Development 未配置 Redis 时,业务 FusionCache 只使用进程内 L1安全服务使用进程内/数据库防线。Production 不允许 Redis 降级;后台任务在所有环境统一使用 PostgreSQL。
## 数据库
@@ -50,10 +50,14 @@ dotnet run --project Tiku.DbMigrator -- --bootstrap-platform-admin
连接串读取 `ConnectionStrings:Redis``REDIS_URL`。当前用途:
- 密码、短信发送和短信校验的安全窗口计数;
- 租户 Feature 分布式缓存
- `TikuBusiness` FusionCache 的租户目录、Feature 快照和运行时配置 L2
- FusionCache Backplane用于跨 API/Worker 节点驱逐业务 L1
- 可选的 Session、安全状态和版本化权限快照缓存
- Production 的 ASP.NET Core Output Cache。
Redis key 使用环境前缀;配置解析会强制 `AbortOnConnectFail=false`Redis 不是用户、Session、权限、套餐或用量的权威数据源。
业务缓存 key 和 Backplane channel 使用 `tiku:<environment>:business:v2` 前缀;配置解析会强制 `AbortOnConnectFail=false`。FusionCache 复用现有 `IConnectionMultiplexer`,不创建额外 Redis 连接。业务缓存禁用 fail-safe 与后台分布式写入Redis 异常时回退 PostgreSQLRedis 不是用户、Session、权限、套餐或用量的权威数据源。
`TikuBusiness` 的 TTL 和安全边界见[认证、授权与租户隔离](architecture/security-and-tenancy.md#fusioncache-业务缓存)。FusionCache、授权缓存与 Output Cache 是三套不同语义:业务读模型使用 FusionCache安全状态保留版本化专用实现HTTP 响应继续由 ASP.NET Core Output Cache 管理。
授权缓存由 `Security:AuthorizationCache` 配置,默认 `Mode``Disabled`。切换为 `Shadow``Active` 前,应先确认 API 与 Worker 使用同一 Redis 和 PostgreSQL并观察 `Tiku.Security.AuthorizationCache` 的 mismatch、fallback 与 Redis 延迟指标。回滚只需切回 `Disabled`,不应回退授权版本或失效事件相关数据库结构。详细故障语义见[认证、授权与租户隔离](architecture/security-and-tenancy.md#redis-授权缓存模式)。
@@ -191,7 +195,7 @@ Worker 使用 ClamAV `INSTREAM` 协议,不在本地落盘待扫描对象。启
- `GET /api/platform/operations/health`:需要 `platform:operations:view`,返回 PostgreSQL、Redis、Worker heartbeat、ClamAV 和对象存储配置状态。
- `GET /api/platform/operations/workers`:查询 Worker 心跳、周期循环和 stale 状态。
- `GET /api/platform/operations/job-metrics`:查询队列状态、最老 Pending 任务与过期租约。
- 设置 `OpenTelemetry:OtlpEndpoint` 后导出 ASP.NET Core、HTTP client数据库观测数据
- 设置 `OpenTelemetry:OtlpEndpoint` 后导出 ASP.NET Core、HTTP client数据库和 FusionCache 的 hit/miss、L1/L2、工厂、Backplane 指标与 trace
- Serilog 输出结构化请求日志;数据库性能拦截器记录慢查询指标。
Readiness 为绿色不等于认证授权、跨租户隔离或后台任务恢复演练已通过,发布仍需执行对应集成测试。