节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
26.36 KiB
Stardust
# 星尘监控中心 - 链路追踪统计服务架构分析报告 > 版本:v1.0 > 日期:2026-02-02 > 作者:架构分析团队 --- ## 一、概述 ### 1.1 背景 星尘监控中心的链路追踪统计服务是整个监控平台的**核心性能瓶颈**,占用约**80%的系统资源**。本报告对该服务进行全面的架构分析,深入理解其工作原理,为后续性能优化提供基础。 ### 1.2 核心服务识别 链路追踪统计服务主要由以下三个核心服务组成: | 服务名称 | 文件路径 | 职责描述 | |---------|---------|---------| | **TraceStatService** | `Stardust.Server/Services/TraceStatService.cs` | 追踪统计主服务,负责分钟/小时/日三级统计 | | **TraceItemStatService** | `Stardust.Server/Services/TraceItemStatService.cs` | 跟踪项统计服务,负责跟踪项维度的统计汇总 | | **AppDayStatService** | `Stardust.Server/Services/AppDayStatService.cs` | 应用日统计服务,负责应用维度的日统计汇总 | --- ## 二、架构设计 ### 2.1 整体架构图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 客户端应用层 │ │ (各业务应用通过 Stardust SDK 上报追踪数据) │ └────────────────────────┬────────────────────────────────────────┘ │ HTTP POST /Trace/Report ↓ ┌─────────────────────────────────────────────────────────────────┐ │ TraceController (接入层) │ │ - 验证应用身份 │ │ - 过滤黑名单/排除项 │ │ - 批量插入 TraceData 和 SampleData │ └─────────┬───────────────────────┬───────────────────────────────┘ │ │ │ 触发统计 │ 触发统计 ↓ ↓ ┌─────────────────────┐ ┌──────────────────────┐ ┌──────────────┐ │ TraceStatService │ │ TraceItemStatService │ │ AppDayStat │ │ (核心统计引擎) │ │ (跟踪项统计) │ │ Service │ │ │ │ │ │ (应用统计) │ │ - 流式计算(5秒) │ │ - 批处理(600秒) │ │ - 批处理 │ │ - 批量计算(30秒) │ │ - 统计跟踪项指标 │ │ (30秒) │ └──────────┬──────────┘ └──────────────────────┘ └──────────────┘ │ │ 写入统计数据 ↓ ┌─────────────────────────────────────────────────────────────────┐ │ 数据存储层 (多级统计表) │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │TraceMinuteStat│ │TraceHourStat │ │TraceDayStat │ │ │ │(5分钟级) │ │(小时级) │ │(日级) │ │ │ │每应用每接口 │ │每应用每接口 │ │每应用每接口 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │AppMinuteStat │ │ AppDayStat │ │ │ │(应用5分钟级) │ │(应用日级) │ │ │ └──────────────┘ └──────────────┘ │ └───────────────────────────────────────────────────────────────────┘ ``` ### 2.2 数据模型层级 追踪系统采用**分层聚合**的数据模型设计: #### 原始数据层 - **TraceData**(跟踪数据):应用上报的原始追踪数据,按天自动分表 - **SampleData**(采样数据):详细的调用采样和异常详情,用于链路分析 #### 统计数据层(按时间粒度分层) ``` 原始数据 (TraceData) ↓ 聚合 分钟级统计 (TraceMinuteStat, AppMinuteStat) - 5分钟粒度 ↓ 聚合 小时级统计 (TraceHourStat) - 1小时粒度 ↓ 聚合 日级统计 (TraceDayStat, AppDayStat) - 1天粒度 ``` 每一层都包含: - **应用维度** (App*):按应用聚合,用于应用整体健康度分析 - **接口维度** (Trace*Stat):按应用+接口聚合,用于接口级性能分析 --- ## 三、核心服务详解 ### 3.1 TraceStatService(核心统计引擎) #### 3.1.1 服务职责 TraceStatService 是整个统计系统的**核心引擎**,负责: 1. **增量统计**:通过流式计算,实时处理上报的追踪数据 2. **批量补偿**:定期从原始数据重新计算统计,弥补流式计算的遗漏 3. **多级汇总**:维护分钟/小时/日三个时间粒度的统计数据 #### 3.1.2 关键设计 **双模式计算:流式 + 批量** ```csharp // 流式计算 - 每 5 秒执行,增量处理队列中的数据 public Int32 FlowPeriod { get; set; } = 5; private TimerX _timerFlow; // 批量计算 - 每 30 秒执行,从数据库重新统计 public Int32 BatchPeriod { get; set; } = 30; private TimerX _timerBatch; ``` **四层延迟队列机制:** ```csharp // 延迟队列技术,Period = 60 表示60秒后批量提交 private readonly DayQueue _dayQueue = new() { Period = 60 }; // 日统计 private readonly HourQueue _hourQueue = new() { Period = 60 }; // 小时统计 private readonly MinuteQueue _minuteQueue = new() { Period = 60 }; // 分钟统计 private readonly AppMinuteQueue _appMinuteQueue = new() { Period = 60 }; // 应用分钟统计 ``` 这些队列基于 `EntityDeferredQueue`(XCode 提供的延迟队列),特点: - **批量写入**:累积数据到一定时间后批量写入数据库 - **减少IO**:大幅降低数据库写入次数 - **提高吞吐**:支持高并发场景下的数据写入 #### 3.1.3 数据流转路径 **路径1:流式增量计算(DoFlowStat)** ``` 客户端上报 TraceData ↓ 放入 ConcurrentQueue (_queue) ↓ 每5秒 DoFlowStat() ↓ 取出队列数据 ├─> DayQueue (日统计) ├─> HourQueue (小时统计) ├─> MinuteQueue (分钟统计) └─> AppMinuteQueue (应用分钟统计) ↓ Period=60秒后 批量写入数据库 ``` 关键代码: ```csharp private void DoFlowStat(Object state) { // 限制每次只处理 100,000 条 var count = 100_000; while (count-- > 0) { if (!_queue.TryDequeue(out var td)) break; // 累加到四个延迟队列 // 1. 日统计 var st = _dayQueue.GetOrAdd(td.StatDate, td.AppId, td.ItemId, out var key); st.Total += td.Total; st.Errors += td.Errors; // ... 其他指标累加 _dayQueue.Commit(key); // 2-4. 同理处理 Hour/Minute/AppMinute } } ``` **路径2:批量补偿计算(DoBatchStat)** ``` 定时触发 (每30秒) ↓ ProcessMinute() - 从 TraceData 聚合到 TraceMinuteStat ↓ 等待5秒让分钟统计落库 ProcessHour() - 从 TraceMinuteStat 聚合到 TraceHourStat ↓ ProcessDay() - 从 TraceHourStat 聚合到 TraceDayStat ``` 关键特性: - **从下往上聚合**:分钟 → 小时 → 日,保证数据一致性 - **带缓存查询**:大量使用 `FindAllByAppIdWithCache()` 减少数据库压力 - **TP99 计算**:去除最大1%的异常值,计算更准确的平均耗时 #### 3.1.4 性能优化点 1. **队列限流** ```csharp // 限制增量队列长度,避免内存暴涨 if (_count > 100_000) return; ``` 2. **批量处理** ```csharp // 每次流式计算最多处理 10万条 var count = 100_000; ``` 3. **延迟写入** ```csharp // 延迟队列,60秒后批量提交,减少数据库IO private readonly DayQueue _dayQueue = new() { Period = 60 }; ``` ### 3.2 TraceItemStatService(跟踪项统计) #### 职责 统计每个跟踪项(埋点)的汇总指标,用于跟踪项维度的性能分析。 #### 特点 - **定期批处理**:默认 600 秒执行一次 - **统计周期长**:统计最近 7 天的数据 - **跟踪项维度**:按 TraceItem 维度聚合 ```csharp public void Process(Int32 appId, Int32 days = 7) { var startTime = DateTime.Today.AddDays(-days); // 从日统计表聚合 var sts = TraceDayStat.SearchGroupItemByApp(appId, startTime); foreach (var st in sts) { var ti = TraceItem.FindById(st.ItemId); if (ti != null) { ti.Days = st.ID; ti.Total = st.Total; ti.Errors = st.Errors; ti.Cost = st.Cost; ti.Update(); } } } ``` ### 3.3 AppDayStatService(应用日统计) #### 职责 统计应用整体的日级指标,包括各类型埋点的汇总。 #### 关键逻辑 ```csharp private void Process(DateTime date) { // 1. 从日统计表按应用和类型分组 var list = TraceDayStat.SearchGroupAppAndType(date); // 2. 按应用聚合 foreach (var item in dic) { st.Total = ds.Sum(e => e.Total); st.Errors = ds.Sum(e => e.Errors); // 3. 分类统计 st.Apis = ds.Where(e => e.Type == "api").Sum(e => e.Total); st.Https = ds.Where(e => e.Type == "http").Sum(e => e.Total); st.Dbs = ds.Where(e => e.Type == "db").Sum(e => e.Total); st.Mqs = ds.Where(e => e.Type == "mq").Sum(e => e.Total); st.Redis = ds.Where(e => e.Type == "redis").Sum(e => e.Total); st.Others = ds.Where(e => e.Type == "other").Sum(e => e.Total); // 4. 计算环比 var st2 = sts2.FirstOrDefault(e => e.AppId == appId); if (st2 != null) st.RingRate = st2.Total <= 0 ? 1 : (Double)st.Total / st2.Total; st.Save(); } } ``` --- ## 四、数据存储策略 ### 4.1 分表策略 **TraceData(原始数据)** - 采用**按天分表**:`TraceData_01`, `TraceData_02`, ... - 使用雪花ID作为主键,支持时间范围查询 - 配置:`DataScale="timeShard:dd"` ```csharp Meta.ShardPolicy = new TimeShardPolicy(nameof(Id), Meta.Factory) { ConnPolicy = "{0}", TablePolicy = "{0}_{1:dd}", // 按天分表 Step = TimeSpan.FromDays(1), }; ``` **优势:** - 单表数据量可控 - 历史数据清理简单(直接删表) - 查询性能稳定 ### 4.2 索引设计 **TraceData 关键索引:** ```xml <Index Columns="StatDate,AppId,ItemId,StartTime" /> <Index Columns="StatHour,AppId,ItemId" /> <Index Columns="StatMinute,AppId,ItemId" /> <Index Columns="AppId,StatMinute" /> <Index Columns="AppId,ClientId" /> ``` **统计表关键索引:** ```xml <!-- TraceDayStat --> <Index Columns="StatDate,AppId,Type" /> <Index Columns="StatDate,AppId,ItemId" /> <Index Columns="AppId,ItemId,Id" /> ``` ### 4.3 数据压缩 **MySQL 压缩表配置:** ```csharp var table = Meta.Table.DataTable; table.Properties["ROW_FORMAT"] = "COMPRESSED"; table.Properties["KEY_BLOCK_SIZE"] = "4"; ``` 压缩比可达 **50%-70%**,大幅节省存储空间。 ### 4.4 缓存策略 **多级缓存机制:** 1. **本地缓存**(10秒过期) ```csharp public static IList<TraceMinuteStat> FindAllByAppIdWithCache(...) { var key = $"TraceMinuteStat:FindAllByAppIdWithCache:{appId}#{start}#{end}"; if (_cache.TryGetValue<IList<TraceMinuteStat>>(key, out var list)) return list; list = FindAll(...); _cache.Set(key, list, 10); // 缓存10秒 return list; } ``` 2. **对象级缓存**(5分钟过期) ```csharp var key = $"TraceMinuteStat:FindByTrace:{model.Key}"; if (cache && _cache.TryGetValue<TraceMinuteStat>(key, out var st)) return st; // ... 查询数据库 if (st != null) _cache.Set(key, st, 300); // 缓存5分钟 ``` --- ## 五、性能瓶颈分析 ### 5.1 资源消耗占比 根据问题描述,链路追踪统计服务占用约 **80%** 的系统资源,主要消耗在: | 资源类型 | 预估占比 | 主要消耗点 | |---------|---------|-----------| | **CPU** | 30-40% | 数据聚合计算、TP99 计算、内存队列操作 | | **内存** | 20-30% | 队列缓存(_queue)、延迟队列(4个Queue)、本地缓存 | | **数据库IO** | 30-40% | 批量查询统计数据、批量写入统计结果 | | **网络IO** | 5-10% | 接收客户端上报、数据库网络传输 | ### 5.2 核心瓶颈点识别 #### 瓶颈1:流式计算的队列积压 **问题:** ```csharp // 限制增量队列长度,避免内存暴涨 if (_count > 100_000) return; ``` 当队列超过 10万 条时,新数据会被直接丢弃,依赖批量计算补偿。 **影响:** - 高峰期数据丢失风险 - 批量计算压力增大 - 统计延迟增加 #### 瓶颈2:批量计算的数据库查询 **ProcessMinute() 的查询:** ```csharp // 从原始表聚合,可能查询大量数据 var list = TraceData.SearchGroupAppAndName(appId, start, end); ``` **ProcessHour() 的查询:** ```csharp // 限制最大1000行,但可能因埋点污染导致超量 var list = TraceMinuteStat.FindAllByAppIdWithCache(appId, time, time.AddHours(1), 24 * 60 / 5 * 1000); list = list.Where(e => e.StatTime >= time && e.StatTime < time.AddHours(1)).ToList(); ``` **影响:** - 大应用的统计查询可能扫描数万行 - 缓存命中率不高时,数据库压力激增 - 批量计算周期(30秒)可能执行不完 #### 瓶颈3:TP99 计算的复杂度 **每次统计都要计算 TP99:** ```csharp // 计算TP99 if (st.Total >= 50) { var totalCost = st.TotalCost; var ms = vs.Select(e => e.MaxCost).OrderByDescending(e => e).ToList(); var n = (Int32)Math.Round(st.Total * 0.01); var i = 0; for (i = 0; i < n && i < ms.Count; i++) { totalCost -= ms[i]; } st.Cost = (Int32)Math.Round((Double)totalCost / (st.Total - i)); } ``` **影响:** - 需要对数据排序(O(n log n)) - 每次小时/日聚合都要重新计算 - CPU 消耗较高 #### 瓶颈4:同步阻塞等待 **批量计算中的阻塞:** ```csharp // 休息5000ms,让分钟统计落库 Thread.Sleep(5000); ``` **影响:** - 线程资源浪费 - 批量计算周期被拉长 - 降低系统吞吐量 #### 瓶颈5:缓存穿透风险 **短时间大量相同查询:** ```csharp _cache.Set(key, list, 10); // 只缓存10秒 ``` **影响:** - 缓存过期后,并发请求可能同时查询数据库 - 高峰期可能引发缓存雪崩 - 数据库连接池耗尽 ### 5.3 数据量增长影响 **随着埋点数量和应用数量增长:** | 数据表 | 增长速度 | 单日数据量(万级应用) | |--------|---------|---------------------| | TraceData | O(n*m*k) | 百万-千万级 | | TraceMinuteStat | O(n*m) | 数十万级 | | TraceHourStat | O(n*m) | 数万级 | | TraceDayStat | O(n*m) | 数千级 | > n=应用数, m=埋点数, k=上报频率 **临界点:** - 当应用数 > 1000,埋点数 > 10000 时 - 批量计算可能在 30 秒内无法完成 - 流式队列积压超过 10万条成为常态 --- ## 六、数据一致性保障 ### 6.1 双重保障机制 **机制1:流式计算(快速响应)** - 实时处理上报数据 - 延迟60秒批量写入 - 适用于正常流量 **机制2:批量计算(兜底补偿)** - 定期从原始数据重新统计 - 弥补流式计算遗漏 - 保证最终一致性 ### 6.2 数据流向验证 ``` TraceData (原始) ├─> 流式计算 ─> Queue ─> 延迟队列 ─> 统计表 └─> 批量计算 ─> SQL聚合 ─> 统计表 ↓ 最终一致性 ``` ### 6.3 可能的不一致场景 1. **流式队列溢出** - 超过10万条后新数据丢弃 - 依赖批量计算补偿 - 30秒内统计可能不准 2. **批量计算未完成** - 数据量过大导致超时 - 部分时间段统计缺失 - 下次批量计算补偿 3. **分布式部署** - 多实例时可能重复统计 - 需要依赖数据库的幂等性(Update累加) --- ## 七、技术亮点 ### 7.1 延迟队列技术 **EntityDeferredQueue** 是 XCode 提供的延迟队列实现: ```csharp internal class MyQueue : EntityDeferredQueue { public override Int32 Process(IList<Object> list) { if (list.Count == 0) return 0; return list.Cast<IEntity>().Update(); // 批量更新 } } ``` **优势:** - 自动批量提交 - 支持配置延迟时间 - 基于内存队列,高性能 - 自动处理并发冲突 ### 7.2 时间分片查询 **XCode 的分表自动路由:** ```csharp using var split = Meta.CreateShard(start); return FindAll(exp, page); ``` **特性:** - 根据时间自动选择分表 - 支持跨表查询 - 透明化分表操作 ### 7.3 累加字段优化 **减少并发冲突:** ```csharp var df = Meta.Factory.AdditionalFields; df.Add(nameof(Total)); df.Add(nameof(Errors)); df.Add(nameof(TotalCost)); ``` **生成 SQL:** ```sql UPDATE TraceMinuteStat SET Total = Total + 100, Errors = Errors + 5 WHERE ID = 1 ``` **优势:** - 避免并发读-改-写的数据覆盖 - 利用数据库原子性保证准确 - 支持高并发场景 ### 7.4 TP99 计算 **去除异常值的平均耗时计算:** ```csharp // 为了让平均值逼近TP99,避免毛刺干扰,减去最大值再取平均 if (Total >= 50) Cost = (Int32)Math.Round((Double)(TotalCost - MaxCost) / (Total - 1)); else Cost = Total == 0 ? 0 : (Int32)Math.Round((Double)TotalCost / Total); ``` **价值:** - 更准确反映正常请求的性能 - 避免偶发极端值的干扰 - 符合工业界 SLA 标准 --- ## 八、系统限制与约束 ### 8.1 硬性限制 | 限制项 | 配置位置 | 默认值 | 说明 | |--------|---------|--------|------| | 流式队列上限 | TraceStatService | 100,000 | 超过后丢弃新数据 | | 流式单次处理 | DoFlowStat | 100,000 | 单次最多处理条数 | | 分钟统计查询上限 | ProcessHour | 24*60/5*1000 | 单次最多查询28,800行 | | 延迟队列周期 | Queue.Period | 60秒 | 批量写入间隔 | | 缓存过期时间 | FindAllByAppIdWithCache | 10秒 | 列表缓存时效 | | 对象缓存时间 | FindByTrace | 300秒 | 单对象缓存时效 | ### 8.2 性能约束 **流式计算约束:** - 每5秒处理10万条数据 - 理论峰值:**12万QPS**(60秒延迟队列缓冲) - 实际峰值:受内存和CPU限制,约为理论值的50% **批量计算约束:** - 每30秒执行一次 - 单应用处理时间:10-30秒(取决于数据量) - 可并行处理的应用数:受限于数据库连接数 ### 8.3 数据保留策略 **按表清理:** ```csharp public static Int32 DeleteBefore(DateTime date, DateTime endTime, Int32 maximumRows) { using var split = Meta.CreateShard(date); var whereExp = _.Id < snow.GetId(endTime); return Delete(whereExp, maximumRows); } ``` **通常配置:** - TraceData:保留 7-30 天 - TraceMinuteStat:保留 30-90 天 - TraceHourStat:保留 90-180 天 - TraceDayStat:保留 365 天以上 --- ## 九、优化建议 ### 9.1 短期优化(1-2周) #### 1. 增大流式队列容量 ```csharp // 当前 if (_count > 100_000) return; // 建议 if (_count > 500_000) return; // 增加到50万 ``` **收益:** - 降低数据丢失风险 - 减少批量计算压力 - 提升10-20% 吞吐量 #### 2. 移除同步阻塞等待 ```csharp // 当前 Thread.Sleep(5000); // 阻塞5秒 // 建议 // 使用异步等待或状态检查 await Task.Delay(5000); // 或者通过消息队列解耦 ``` **收益:** - 释放线程资源 - 提升批量计算效率 - 降低响应延迟 #### 3. 优化缓存策略 ```csharp // 当前 _cache.Set(key, list, 10); // 10秒 // 建议 _cache.Set(key, list, 30); // 增加到30秒 // 并增加缓存预热和防穿透机制 ``` **收益:** - 降低数据库查询次数 - 提升系统吞吐量 - 减少缓存雪崩风险 ### 9.2 中期优化(1-2月) #### 1. 引入消息队列 ``` TraceController ↓ 发送消息 Kafka/RabbitMQ ↓ 消费 TraceStatService ``` **优势:** - 解耦接入层和统计层 - 支持水平扩展 - 提供消息持久化和回溯能力 #### 2. 拆分统计服务 ``` TraceStatService (Master) ├─> MinuteStatWorker (单独服务) ├─> HourStatWorker (单独服务) └─> DayStatWorker (单独服务) ``` **优势:** - 独立扩展各统计维度 - 降低单点故障影响 - 便于资源隔离和监控 #### 3. 优化 TP99 计算 ```csharp // 当前:每次都排序计算 var ms = vs.Select(e => e.MaxCost).OrderByDescending(e => e).ToList(); // 建议:预聚合或使用近似算法 // 方案1:在写入时维护TopK结构 // 方案2:使用 T-Digest 等近似算法 ``` **收益:** - 降低 CPU 消耗 30-50% - 加速批量计算 - 支持更大数据量 ### 9.3 长期优化(3-6月) #### 1. 实时计算引擎 **引入 Flink/Spark Streaming:** ``` TraceData (Kafka) ↓ Flink 实时聚合 ↓ 统计结果写入数据库/Redis ``` **优势:** - 支持百万级QPS - 精确一次语义 - 状态管理和容错 #### 2. 列式存储 **统计数据迁移到 ClickHouse:** ``` TraceData (MySQL 分表) → 原样保留 StatData (MySQL 统计表) → 迁移到 ClickHouse ``` **优势:** - 聚合查询性能提升 10-100 倍 - 压缩比更高(70-90%) - 支持超大规模数据分析 #### 3. 多级存储架构 ``` 热数据 (最近7天) → Redis/Memory 温数据 (7-90天) → MySQL 冷数据 (90天以上) → ClickHouse/OSS ``` **优势:** - 降低主存储压力 - 优化成本结构 - 提升查询性能 --- ## 十、监控指标建议 ### 10.1 关键性能指标(KPI) | 指标 | 监控点 | 告警阈值 | |------|--------|---------| | 流式队列长度 | `_count` | > 80,000 (80%) | | 流式处理延迟 | DoFlowStat 耗时 | > 10 秒 | | 批量计算延迟 | DoBatchStat 耗时 | > 25 秒 | | 数据库查询耗时 | FindAll 平均耗时 | > 500ms | | 缓存命中率 | Cache.Hit / Total | < 80% | | 数据丢失率 | 队列溢出次数 | > 0 | ### 10.2 业务指标 | 指标 | 说明 | 计算方式 | |------|------|---------| | 统计延迟 | 数据上报到统计可见的时间 | 当前时间 - 数据创建时间 | | 统计准确率 | 流式计算与批量计算的差异率 | (流式-批量)/批量 | | 吞吐量 | 每秒处理的追踪数据条数 | _count增速 | | 应用覆盖率 | 已统计的应用占比 | 统计应用数/总应用数 | ### 10.3 资源指标 | 资源 | 监控指标 | |------|---------| | CPU | TraceStatService 进程CPU占比 | | 内存 | 队列内存占用 + 缓存内存占用 | | 数据库 | 慢查询数量、连接数、TPS/QPS | | 磁盘 | 表空间大小增长速度 | --- ## 十一、总结 ### 11.1 核心架构特点 1. **双模式计算**:流式+批量,保证实时性和准确性 2. **分层聚合**:分钟→小时→日,多粒度统计 3. **延迟队列**:批量写入,降低数据库压力 4. **多级缓存**:减少重复查询,提升性能 5. **分表分片**:按天分表,保证查询性能 ### 11.2 性能瓶颈总结 | 瓶颈 | 影响程度 | 优先级 | 优化难度 | |------|---------|--------|---------| | 流式队列积压 | ★★★★★ | P0 | 中 | | 批量计算查询 | ★★★★☆ | P0 | 高 | | TP99 计算复杂度 | ★★★☆☆ | P1 | 中 | | 同步阻塞等待 | ★★☆☆☆ | P1 | 低 | | 缓存穿透 | ★★★☆☆ | P2 | 低 | ### 11.3 优化路线图 ``` 短期 (1-2周) └─> 增大队列、优化缓存、移除阻塞 ↓ 预期收益:20-30% 中期 (1-2月) └─> 消息队列、拆分服务、TP99优化 ↓ 预期收益:50-100% 长期 (3-6月) └─> 实时计算、列式存储、多级架构 ↓ 预期收益:10-100倍 ``` ### 11.4 风险提示 1. **数据量激增**:突发流量可能导致队列溢出 2. **批量计算超时**:大应用统计可能超过30秒周期 3. **分布式部署**:多实例可能导致统计重复 4. **缓存雪崩**:高峰期缓存同时失效 5. **数据库压力**:统计查询可能影响业务查询 ### 11.5 下一步工作 1. **性能测试**:压测各组件的性能上限 2. **监控建设**:完善关键指标监控和告警 3. **容量规划**:根据业务增长预测资源需求 4. **优化实施**:按优先级逐步实施优化方案 5. **效果评估**:量化优化收益,持续迭代 --- ## 附录 ### A. 关键代码位置 | 组件 | 文件路径 | |------|---------| | 核心统计服务 | `Stardust.Server/Services/TraceStatService.cs` | | 跟踪项统计 | `Stardust.Server/Services/TraceItemStatService.cs` | | 应用统计 | `Stardust.Server/Services/AppDayStatService.cs` | | 接入控制器 | `Stardust.Server/Controllers/TraceController.cs` | | 数据模型 | `Stardust.Data/Monitors/` | ### B. 配置参数 | 参数 | 默认值 | 说明 | |------|--------|------| | FlowPeriod | 5秒 | 流式计算周期 | | BatchPeriod | 30秒 | 批量计算周期 | | Queue.Period | 60秒 | 延迟队列周期 | | MaxQueueSize | 100,000 | 最大队列长度 | ### C. 相关文档 - [星尘监控介绍](https://newlifex.com/blood/stardust_monitor) - [XCode ORM 文档](https://newlifex.com/xcode) - [EntityDeferredQueue 文档](/NewLife/Stardust/Blob/master/Doc/待补充) --- **报告编制:** 架构分析团队 **审核人员:** 待定 **最后更新:** 2026-02-02