1. 课程导论:可观测性(Metrics/Traces/Logs)与租户隔离的核心挑战,以及领域驱动设计(DDD)在其中的作用

1.1 可观测性的三大支柱与多租户场景

现代云原生架构中,可观测性由 Metrics(指标)、Traces(链路) 和 Logs(日志) 三大支柱构成。当系统服务于多个租户时,每一类数据都必须携带明确的租户身份标识,并能够在存储、查询、告警和展示层面实现严格隔离。

支柱 核心数据单元 租户隔离关键字段 典型存储方案
Metrics 时间序列数据点(指标名 + 标签 + 时间戳 + 值) tenant_id 标签 Prometheus / VictoriaMetrics
Traces Span(TraceID + SpanID + 父SpanID + 属性 + 时间) tenant.id Span 属性 Jaeger / Tempo / OpenTelemetry Collector
Logs 结构化日志行(时间戳 + 级别 + 消息 + 结构化字段) tenant_id 字段 Loki / Elasticsearch / ClickHouse
核心挑战: 三大支柱的数据模型、写入路径和查询接口各不相同,但都需要在写入时注入租户上下文,在查询时按租户过滤,在存储层实现物理或逻辑隔离。缺乏统一建模会导致隔离策略碎片化、维护成本激增。

1.2 租户隔离的核心挑战

多租户可观测性面临四个维度的挑战,每个维度都直接影响架构决策和运维成本:

  1. 数据写入隔离 —— 如何确保租户 A 的指标不会污染租户 B 的时序数据库?如何防止一个租户的突发流量挤占其他租户的写入吞吐?
  2. 数据存储隔离 —— 选择物理隔离(独立实例/数据库)还是逻辑隔离(共享实例 + 租户标签过滤)?物理隔离成本高但安全边界清晰,逻辑隔离资源利用率高但需要更精细的权限控制。
  3. 查询与可视化隔离 —— 租户只能看到自己的指标、链路和日志。Grafana 等工具需要支持多数据源路由或基于租户标签的过滤表达式。
  4. 成本与配额隔离 —— 每个租户的存储用量、查询次数、告警规则数量需要独立核算和限制,避免“吵闹邻居”效应。
经验法则: 在 SaaS 场景下,逻辑隔离 + 租户标签路由 是性价比最高的起点;当租户对合规性(如金融、医疗)有硬性要求时,才考虑物理隔离方案。领域驱动设计可以帮助你在两种模式之间建立清晰的转换边界。

1.3 领域驱动设计(DDD)在可观测性隔离中的角色

DDD 提供了一套从业务需求到技术实现的映射方法,能够将“租户隔离”这一非功能性需求转化为可维护的领域模型和架构约束。其核心作用体现在以下三个层面:

DDD 概念 在可观测性隔离中的应用 带来的价值
限界上下文(Bounded Context) 将“指标采集”、“链路追踪”、“日志聚合”定义为独立的限界上下文,每个上下文拥有自己的租户隔离策略 避免三大支柱的隔离逻辑互相耦合,允许各自独立演进
聚合(Aggregate) 将“租户可观测性配置”建模为一个聚合根,包含租户的采样率、存储策略、告警规则等 保证租户配置的一致性,简化跨支柱的配置同步
领域事件(Domain Event) 租户创建/删除/升级时发布 TenantProvisioned、TenantDeprovisioned 等事件,触发各上下文调整隔离策略 实现解耦的、事件驱动的隔离策略生命周期管理
仓储(Repository) 为每个限界上下文定义租户感知的仓储接口,在基础设施层实现物理或逻辑隔离 业务代码不感知底层存储细节,隔离策略可替换
常见误区: 很多团队直接在每个微服务中硬编码 WHERE tenant_id = ? 来实现隔离,这本质上是面向数据表编程,而非面向领域模型编程。DDD 要求你将“租户”作为领域概念显式建模,而不是仅仅作为一个数据库字段。

1.4 领域模型驱动的可观测性隔离架构总览

下图展示了 DDD 如何将三大可观测性支柱与租户隔离需求统一到一个架构视图中。每个限界上下文内部都包含一个“租户感知层”,该层由领域模型驱动,负责在数据入口处注入租户上下文,并在数据出口处执行隔离过滤。

DDD 驱动的可观测性租户隔离架构总览 租户领域上下文 Tenant Aggregate 租户配置 租户事件 租户仓储 指标上下文 Metric Repository 租户标签注入 采样策略 链路上下文 Trace Repository Span 属性注入 采样策略 日志上下文 Log Repository 结构化字段注入 日志级别策略 基础设施层(租户感知仓储实现) Prometheus / VictoriaMetrics Jaeger / Tempo Loki / Elasticsearch 租户配置数据库 关键设计原则 每个限界上下文通过领域事件订阅租户配置变更,在仓储层实现统一的租户过滤逻辑 业务代码只面向领域模型编程,不直接操作数据存储的租户字段

1.5 本课程的学习路径

本课程将按照以下递进结构展开,每个阶段都会结合 DDD 战术模式和可观测性基础设施的实操配置:

  • 阶段一(第 2-5 章): 深入三大支柱的数据模型与租户标签设计,建立领域语言(Ubiquitous Language)
  • 阶段二(第 6-10 章): 使用 DDD 战术建模(实体、值对象、聚合、领域事件)构建租户隔离领域模型
  • 阶段三(第 11-18 章): 架构实现 —— 在 OpenTelemetry Collector、Prometheus、Jaeger、Loki 中落地租户感知的仓储模式
  • 阶段四(第 19-25 章): 高级主题 —— 跨支柱的租户关联查询、成本核算、动态采样与配额管理
  • 阶段五(第 26-30 章): 实战案例 —— 从单体到多租户 SaaS 的可观测性架构演进,以及混沌工程验证
学习建议: 如果你对 DDD 的基础概念(限界上下文、聚合、领域事件)还不熟悉,建议先阅读第 2 章的预备知识速览。本课程假设你具备基本的微服务架构和 Prometheus/OpenTelemetry 使用经验。