观察到 check_results 产生的写入行数为 3,让 Copilot 分析了下也没看出来是为什么(
按照这个统计来看,每个监控每天约产生 5.6k 行写入,而 D1 每天写入上限是 100k,也就是说 17 个监控就干到上限了,而用户如果部署了其他会产生较多写入的应用可能影响会更大
不知道是否有办法解决 check_results 产生的写入行数过高的问题
除此之外可能的改进方向
1. 下调写入频率
如果某监控一直正常,则可以每 3 / 5 分钟才写入一次延迟记录信息
若状态变化,则立即写入
影响:
- 状态页中近 60 次探测结果在有状态变化的情况下可能不再等间隔(受 up -> down 这类状态变化影响会立即写入)
- 24h范围延迟图表在上述情况下的数据处理逻辑
2. check_results 以时间为维度聚合储存
该想法较为激进
以时间为维度写入检查结果,将当前时间所有监控项的数据聚合到一行,储存 JSON TEXT Record<string, CheckResult>,这样写入行数只跟写入频率相关
影响:
- 数据读取
- D1 内置 JSON 查询方法,在读取方面或许可以派上用场,并避免使用
JSON.parse
- 若需要所有监控项的数据,实际上应该可以减少读取查询行数
- 只需要单个监控线的数据时充分利用 D1 内置 JSON 方法
- 获取所有数据后在客户端解析也是一种方案,但可能获取冗余数据并增加请求大小
- 数据储存
JSON.stringify 可能会增大 CPU 开销,或尝试使用 fast-json-stringify
- 储存方式改变,这意味着旧数据需要迁移
- 改造成本
- 可能有其他坑
观察到
check_results产生的写入行数为3,让 Copilot 分析了下也没看出来是为什么(按照这个统计来看,每个监控每天约产生 5.6k 行写入,而 D1 每天写入上限是 100k,也就是说 17 个监控就干到上限了,而用户如果部署了其他会产生较多写入的应用可能影响会更大
不知道是否有办法解决
check_results产生的写入行数过高的问题除此之外可能的改进方向
1. 下调写入频率
如果某监控一直正常,则可以每 3 / 5 分钟才写入一次延迟记录信息
若状态变化,则立即写入
影响:
2. check_results 以时间为维度聚合储存
该想法较为激进
以时间为维度写入检查结果,将当前时间所有监控项的数据聚合到一行,储存 JSON TEXT
Record<string, CheckResult>,这样写入行数只跟写入频率相关影响:
JSON.parseJSON.stringify可能会增大 CPU 开销,或尝试使用 fast-json-stringify