refactor: consolidate backend into modular monolith
This commit is contained in:
@@ -5,34 +5,30 @@
|
||||
## 分层与依赖
|
||||
|
||||
```text
|
||||
+------------------+
|
||||
| Tiku.Contracts |
|
||||
+--------^---------+
|
||||
|
|
||||
+-----------+ +---------------+---------------+
|
||||
| Tiku.Api | | Tiku.Worker / Tiku.DbMigrator |
|
||||
+-----+-----+ +---------------+---------------+
|
||||
| |
|
||||
+-------------+-------------+
|
||||
v
|
||||
+---------------------+
|
||||
| Tiku.Infrastructure |
|
||||
+----------+----------+
|
||||
v
|
||||
+---------------------+
|
||||
| Tiku.Application |
|
||||
+----------+----------+
|
||||
v
|
||||
+---------------------+
|
||||
| Tiku.Domain |
|
||||
+---------------------+
|
||||
+-------------------------+ +-----------------+
|
||||
| Tiku.Api | | Tiku.DbMigrator |
|
||||
| HTTP + Hosted Services | | Migrate + Seed |
|
||||
+------------+------------+ +--------+--------+
|
||||
| |
|
||||
+--------------+--------------+
|
||||
v
|
||||
+---------------------+
|
||||
| Tiku.Infrastructure |
|
||||
+----------+----------+
|
||||
v
|
||||
+---------------------+
|
||||
| Tiku.Application |
|
||||
+----------+----------+
|
||||
v
|
||||
+---------------------+
|
||||
| Tiku.Domain |
|
||||
+---------------------+
|
||||
```
|
||||
|
||||
- `Tiku.Domain` 保存领域实体、枚举和基础类型。除 Identity stores 抽象外,不依赖持久化或 Provider SDK。
|
||||
- `Tiku.Application` 定义用例契约、Provider 接口、安全上下文和业务目录,依赖 Domain。
|
||||
- `Tiku.Infrastructure` 实现 EF Core、PostgreSQL、Identity、外部 Provider、消息和后台任务,依赖 Application、Domain 与 Contracts。
|
||||
- `Tiku.Contracts` 保存 API 与 Worker 使用的版本化消息 DTO,不引用 HTTP、EF Core 或 Provider SDK。
|
||||
- `Tiku.Api`、`Tiku.Worker` 和 `Tiku.DbMigrator` 是独立运行入口。
|
||||
- `Tiku.Infrastructure` 实现 EF Core、PostgreSQL、Identity、外部 Provider 和后台任务,依赖 Application 与 Domain。
|
||||
- `Tiku.Api` 是唯一运行时入口,`Tiku.DbMigrator` 是部署时迁移和 seed 入口。
|
||||
|
||||
## 运行时组件
|
||||
|
||||
@@ -65,29 +61,29 @@ OpenAPI 和 Scalar 只在 Development 映射。平台管理端位于独立的 `T
|
||||
4. seed 内置 SaaS Feature、PermissionModule、BackendPermission 和 BackendMenu 目录。
|
||||
5. Development 全新数据库自动 seed 平台管理员;非 Development 仅在显式传入 `--bootstrap-platform-admin` 时创建管理员。
|
||||
|
||||
API 和 Worker 都不自动迁移数据库。
|
||||
API 不自动迁移数据库。
|
||||
|
||||
### Worker
|
||||
### API 后台处理
|
||||
|
||||
`Tiku.Worker` 当前注册四个独立 Hosted Service:
|
||||
`Tiku.Api` 在 `BackgroundProcessing:Enabled=true` 时注册四个 Hosted Service:
|
||||
|
||||
| Worker | 周期 | 当前职责 |
|
||||
| Hosted Service | 周期 | 当前职责 |
|
||||
| --- | --- | --- |
|
||||
| `TenantDomainWorker` | `TenantDomains:PollSeconds`,限制为 10~3600 秒 | 校验自定义域名 CNAME/TXT,调用网关 TLS 接口并失效租户缓存 |
|
||||
| `SaasSubscriptionWorker` | 60 秒 | 处理到期、宽限期等 SaaS 订阅生命周期 |
|
||||
| `FeatureUsageWorker` | `FeatureUsageReconciliation:IntervalMinutes`,限制为 1~1440 分钟 | 按真实业务数据校准租户 Feature 用量 |
|
||||
| `BackgroundJobsWorker` | 2 秒,4 个分区 | 租约处理 PostgreSQL 中的延时/待执行后台任务;未配置 RabbitMQ 时也处理即时任务 |
|
||||
| `TenantDomainBackgroundService` | `TenantDomains:PollSeconds`,限制为 10~3600 秒 | 校验自定义域名 CNAME/TXT,调用网关 TLS 接口并失效租户缓存 |
|
||||
| `SaasSubscriptionBackgroundService` | 60 秒 | 处理到期、宽限期等 SaaS 订阅生命周期 |
|
||||
| `FeatureUsageBackgroundService` | `FeatureUsageReconciliation:IntervalMinutes`,限制为 1~1440 分钟 | 按真实业务数据校准租户 Feature 用量 |
|
||||
| `BackgroundJobsBackgroundService` | 默认 2 秒、4 个分区 | 使用租约处理 PostgreSQL 中的即时、延时和待重试任务 |
|
||||
|
||||
后台任务当前支持 `content_import`、`content_export`、`statistics_aggregation`、`commerce_reconciliation` 和 `tenant_domain_recheck`。`asset_security_scan` 会明确失败,直到配置实际扫描 Provider;不能把它描述为已接通扫描服务。
|
||||
|
||||
配置 RabbitMQ 后,即时安全事件和后台任务请求使用 MassTransit;API 使用 EF Bus Outbox,Worker Consumer 使用 EF inbox/outbox。延时任务仍由 PostgreSQL `RunAfter` 和租约 Worker 处理。
|
||||
即时任务与 `RunAfter` 延时任务统一写入 `background_jobs`。Hosted Service 使用 `FOR UPDATE SKIP LOCKED` 认领任务,五分钟租约支持 API 重启后的恢复;当前生产部署按单 API 实例设计。
|
||||
|
||||
## 数据与持久化
|
||||
|
||||
- 数据库使用标准 PostgreSQL,普通 schema 由 EF Core entity、Fluent Configuration 和 Migration 管理。
|
||||
- 当前模型启用 `citext`、`ltree` 和 `pg_trgm` 扩展,并统一映射为 `snake_case`。
|
||||
- Data Protection key ring 由 API 持久化到 PostgreSQL;非 Development 必须使用 X509 证书保护。
|
||||
- MassTransit inbox/outbox 表与业务表处于同一 `TikuDbContext`。
|
||||
- 后台任务状态、执行时间、重试和结果由 `background_jobs` 持久化。
|
||||
- PostgreSQL 不启用 RLS;租户隔离由应用和数据库多层共同保证,详见[认证、授权与租户隔离](security-and-tenancy.md)。
|
||||
|
||||
## 当前业务模块
|
||||
|
||||
@@ -108,17 +108,14 @@ Development 默认平台 Host 是 `localhost` 和 `127.0.0.1`。Production 启
|
||||
|
||||
这些 guard 由 Migration helper 统一安装和移除,不允许在多份 Migration 中复制 SQL。
|
||||
|
||||
## System Scope 与可靠事件
|
||||
## System Scope 与后台处理
|
||||
|
||||
跨租户 Worker、迁移、seed 和平台级后台操作必须通过 `ITenantContextInitializer.InitializeSystem` 或受审计的 `ITenantExecutionScope` 进入 System Scope,并提供明确原因。业务代码不得直接关闭 Query Filter。
|
||||
跨租户 Hosted Service、迁移、seed 和平台级后台操作必须通过 `ITenantContextInitializer.InitializeSystem` 或受审计的 `ITenantExecutionScope` 进入 System Scope,并提供明确原因。业务代码不得直接关闭 Query Filter。
|
||||
|
||||
配置 RabbitMQ 时:
|
||||
|
||||
- API 使用 EF Bus Outbox,把业务写入、审计和消息放在同一数据库事务边界。
|
||||
- Worker Consumer 使用 EF inbox/outbox 和有限即时重试。
|
||||
- Session、成员、租户和套餐状态始终从 PostgreSQL 重新校验,不等待消息消费后才失效。
|
||||
- 延时/定时重试使用 PostgreSQL `RunAfter`,不依赖 RabbitMQ delayed-message 插件。
|
||||
- Session、成员、租户和套餐状态始终从 PostgreSQL 重新校验。
|
||||
- 租户、套餐和 Feature 变更在数据库提交后直接失效当前 API 进程与 Redis 中的相关缓存。
|
||||
- 后台任务在业务事务提交后持久化到 PostgreSQL,Hosted Service 使用租约执行;延时和重试由 `RunAfter` 控制。
|
||||
|
||||
## 安全配置门禁
|
||||
|
||||
Production 还会在启动时验证 Redis、RabbitMQ、Data Protection 证书、租户 Secret master key、短信 pepper、CORS 和外部服务配置。完整配置入口见[配置与后台任务](../operations.md)。
|
||||
Production 还会在启动时验证 Redis、Data Protection 证书、租户 Secret master key、短信 pepper、CORS 和外部服务配置。完整配置入口见[配置与后台任务](../operations.md)。
|
||||
|
||||
Reference in New Issue
Block a user