refactor: consolidate backend into modular monolith
This commit is contained in:
@@ -1,16 +1,15 @@
|
||||
# 配置与后台任务
|
||||
|
||||
本文列出 API、DbMigrator 和 Worker 当前实际读取的配置。敏感值应通过环境变量、Secret Manager 或部署平台密钥注入,不能提交到仓库。
|
||||
本文列出 API 和 DbMigrator 当前实际读取的配置。敏感值应通过环境变量、Secret Manager 或部署平台密钥注入,不能提交到仓库。
|
||||
|
||||
## 进程与依赖
|
||||
|
||||
| 进程 | PostgreSQL | Redis | RabbitMQ | 说明 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `Tiku.Api` | 必需 | Development 可选;Production 必需 | Development 可选;Production 必需 | 提供 HTTP API、静态管理端、认证和 Outbox 发布 |
|
||||
| `Tiku.Worker` | 必需 | Development 可选;Production 必需 | Development 可选;Production 必需 | 消费消息并轮询后台任务 |
|
||||
| `Tiku.DbMigrator` | 必需 | 不需要 | 不需要 | 执行 Migration、内置目录 seed 和管理员引导 |
|
||||
| 进程 | PostgreSQL | Redis | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `Tiku.Api` | 必需 | Development 可选;Production 必需 | 提供 HTTP API、认证、缓存和 Hosted Service 后台处理 |
|
||||
| `Tiku.DbMigrator` | 必需 | 不需要 | 执行 Migration、内置目录 seed 和管理员引导 |
|
||||
|
||||
Development 未配置 Redis 时,安全服务使用进程内/数据库防线;未配置 RabbitMQ 时,Worker 从 PostgreSQL 处理即时和延时任务。Production 不允许这两个降级模式。
|
||||
Development 未配置 Redis 时,安全服务使用进程内/数据库防线。Production 不允许 Redis 降级;后台任务在所有环境统一使用 PostgreSQL。
|
||||
|
||||
## 数据库
|
||||
|
||||
@@ -49,46 +48,22 @@ dotnet run --project Tiku.DbMigrator -- --bootstrap-platform-admin
|
||||
|
||||
连接串读取 `ConnectionStrings:Redis` 或 `REDIS_URL`。当前用途:
|
||||
|
||||
- 密码、短信发送和短信校验的跨实例安全窗口计数;
|
||||
- 安全状态和租户 Feature 缓存失效;
|
||||
- 密码、短信发送和短信校验的安全窗口计数;
|
||||
- 租户 Feature 分布式缓存;
|
||||
- Production 的 ASP.NET Core Output Cache。
|
||||
|
||||
Redis key 使用环境前缀;配置解析会强制 `AbortOnConnectFail=false`。Redis 不是用户、Session、权限、套餐或用量的权威数据源。
|
||||
|
||||
## RabbitMQ 与 Outbox
|
||||
|
||||
配置节:
|
||||
|
||||
```json
|
||||
{
|
||||
"RabbitMq": {
|
||||
"Host": "rabbitmq://localhost",
|
||||
"VirtualHost": "/",
|
||||
"Username": "guest",
|
||||
"Password": "guest",
|
||||
"OutboxBacklogAlertCount": 1000,
|
||||
"OutboxOldestMessageAlertSeconds": 300
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
本地可用环境变量形式覆盖,例如 `RabbitMq__Host`。Production 必须同时提供有效 Host、Username 和 Password。
|
||||
|
||||
当前消息配置:
|
||||
|
||||
- kebab-case endpoint 名称;
|
||||
- PostgreSQL EF Bus Outbox,1 秒查询间隔;
|
||||
- Consumer 端 EF inbox/outbox;
|
||||
- Consumer 单并发、prefetch 1;
|
||||
- 1、5、15 秒有限即时重试;
|
||||
- 不使用 RabbitMQ delayed-message 插件,延时任务保留在 PostgreSQL。
|
||||
|
||||
API 只发布消息,不注册 Consumer;Worker 注册 `SecurityStateChangedConsumer` 和 `BackgroundJobRequestedConsumer`。
|
||||
|
||||
## Worker 配置
|
||||
## 后台处理配置
|
||||
|
||||
```json
|
||||
{
|
||||
"BackgroundProcessing": {
|
||||
"Enabled": true,
|
||||
"JobPollSeconds": 2,
|
||||
"JobParallelism": 4,
|
||||
"JobBatchSize": 5
|
||||
},
|
||||
"TenantDomains": {
|
||||
"Enabled": true,
|
||||
"PollSeconds": 60,
|
||||
@@ -114,7 +89,7 @@ API 只发布消息,不注册 Consumer;Worker 注册 `SecurityStateChangedCo
|
||||
|
||||
域名只有在 `AllowedCnameTargets`、DNS JSON endpoint、Gateway URL 和 API key 配置完成后,才可能从 Pending/Failed 进入 Active。仅 DNS 验证成功不代表 TLS 已就绪。
|
||||
|
||||
后台任务状态和 `RunAfter` 存在 PostgreSQL。Worker 使用租约并发处理;同一即时任务在启用 RabbitMQ 后不会同时进入消息 Consumer 和数据库即时轮询路径。
|
||||
后台任务状态和 `RunAfter` 存在 PostgreSQL。API Hosted Service 使用 `FOR UPDATE SKIP LOCKED`、五分钟租约和有限重试处理即时、延时及失败待重试任务。`BackgroundProcessing:Enabled=false` 会关闭全部四个后台循环,通常只用于测试或维护。
|
||||
|
||||
## 安全与网络配置
|
||||
|
||||
@@ -152,9 +127,14 @@ Production 启动至少需要核对:
|
||||
## 健康检查与观测
|
||||
|
||||
- `GET /api/health`:轻量 liveness,只说明 API 进程可响应。
|
||||
- `GET /api/health/ready`:检查 PostgreSQL、已配置 Redis、已配置 RabbitMQ,并报告 Outbox pending、最老消息年龄和告警阈值;依赖未就绪时返回 503。
|
||||
- API 每 30 秒采样一次 Outbox backlog,并暴露 `tiku.outbox.pending` 与 `tiku.outbox.oldest_age` meter。
|
||||
- `GET /api/health/ready`:检查 PostgreSQL 和已配置 Redis;依赖未就绪时返回 503。
|
||||
- 设置 `OpenTelemetry:OtlpEndpoint` 后导出 ASP.NET Core、HTTP client 和数据库观测数据。
|
||||
- Serilog 输出结构化请求日志;数据库性能拦截器记录慢查询指标。
|
||||
|
||||
Readiness 为绿色不等于认证授权、跨租户隔离或 Broker 恢复演练已通过,发布仍需执行对应集成测试。
|
||||
Readiness 为绿色不等于认证授权、跨租户隔离或后台任务恢复演练已通过,发布仍需执行对应集成测试。
|
||||
|
||||
## 从 RabbitMQ 版本切换
|
||||
|
||||
移除消息表的 Migration 与旧 API/Worker 不兼容。发布时使用维护窗口:停止旧 API 和 Worker,确认 RabbitMQ Consumer 已退出并备份 PostgreSQL,运行 `Tiku.DbMigrator`,再部署新 API。未消费的后台任务消息可丢弃,因为对应任务记录已经写入 `background_jobs`;安全消息不保存授权真相。
|
||||
|
||||
切换时不强制重置 `processing` 任务。旧租约最多五分钟后由新 API 接管。回滚需要先停止新 API,执行 Migration Down 重建空 inbox/outbox 表,再恢复 RabbitMQ 配置和旧 API/Worker;历史消息不会恢复。
|
||||
|
||||
Reference in New Issue
Block a user