8月3日每日预警系统
每日预警系统总体设计从业务诉求到架构落地的手记我想分享一下我们最近完成的一个「每日预警系统」——如何把一个看似简单的运营诉求设计成一个可追溯、可演进、性能可靠的工程方案。一、问题定义到底要预警什么业务诉求原始表达记录每天查询到有哪些用户近3天没有交易用户是通过审核的新建表方便查询哪天有哪些不交易的用户。这段话翻译成架构语言实际是三个需求诉求 架构解读连续3天无交易 判定规则需要定义「无交易」的数据口径记录每天方便查询 快照存储按天留存历史可回溯任意一天通过审核的用户 目标人群排除未激活、未认证的噪音我的第一反应 这不能做成「实时查交易记录」而应该做成每日快照。原因有三性能交易表 90 万行每次实时扫描不可接受历史可追溯运营想知道「上周五有哪些人开始沉默」需要留存历史解耦预警计算与实时交易解耦凌晨集中算一次二、数据流设计┌─────────────┐ ┌─────────────────────┐ ┌──────────────┐│ 交易记录 │ │ cn_user_daily_ │ │ cn_user_ ││ buy_record │───▶ │ flow_summary │───▶ │ churn_ ││ 90万行 │ │ 按天聚合 23万行 │ │ warning_ │└─────────────┘ └─────────────────────┘ │ record ││ ▲ └──────┬───────┘│ │定时填充 ││ │(每4分钟凌晨0:02) │└─────────────────┘ ▼┌──────────────┐│ 管理后台页面 ││ 展示最新快照 │└──────────────┘核心决策引入中间聚合层 cn_user_daily_flow_summary为什么不直接用 buy_record买 90 万行原始交易│├─ 问题1JOIN 用 OR 条件(sale_user_idx OR pay_user_idx)→ 索引失效├─ 问题2GROUP BY MAX UNION → 全表扫描└─ 问题3每天查询都重复扫描浪费│▼cn_user_daily_flow_summary按天预先聚合├─ 已经算好每个用户每天的交易数 transaction_count├─ 唯一索引 (stat_date, user_id) → 按天查询走索引└─ 数据量从90万降到23万这就是经典的**「读时计算 → 写时计算」**重构把高频查询的聚合结果提前算好。三、表结构设计预警快照表 cn_user_churn_warning_recordCREATE TABLE cn_user_churn_warning_record (id BIGINT AUTO_INCREMENT PRIMARY KEY,stat_date DATE NOT NULL COMMENT 统计日期,user_id BIGINT NOT NULL COMMENT 用户ID,phone VARCHAR(20),business_name VARCHAR(255),province VARCHAR(50),last_trade_time DATETIME COMMENT 最后交易日,create_time DATETIME DEFAULT CURRENT_TIMESTAMP,UNIQUE KEY uk_date_user (stat_date, user_id),KEY idx_stat_date (stat_date),KEY idx_user_id (user_id));设计要点决策 理由(stat_date, user_id) 唯一索引 同一天同一用户只能一条快照天然防重冗余 phone/business_name/province 反规范化查询免联表数据量小每天几千条冗余成本可忽略last_trade_time 冗余 展示时直接显示无需回查不设 del_flag 快照是历史记录不应删除用 TRUNCATE 做整表重置为什么不存「沉默天数」我一度纠结是否要冗余 silent_days 字段。最终决定不存因为last_trade_time 已经足够推导沉默天数是相对统计日期的如果快照固定存「当时的沉默天数」之后查看语义会混乱相对哪天保持数据最小化宁可前端现算四、核心 SQL连续3天无交易的判定判定逻辑架构师视角「连续3天无交易」有两种实现口径方案A最后交易距今 ≥ 3天MAX(create_time) DATE_SUB(NOW(), INTERVAL 3 DAY)优点一条 SQL简洁缺点是「最后一次交易很久以前」不是严格「连续3个自然日无交易」方案B昨天、前天、大前天这3个自然日都无交易最终采用LEFT JOIN ... s1 ON s1.stat_date 昨天 AND 有交易LEFT JOIN ... s2 ON s2.stat_date 前天 AND 有交易LEFT JOIN ... s3 ON s3.stat_date 大前天 AND 有交易WHERE s1 IS NULL AND s2 IS NULL AND s3 IS NULL优点语义精确符合「昨天前天大前天都没有交易」的原始诉求优点走 uk_stat_date_user_id 唯一索引三个点查极快缺点依赖 daily_flow_summary 的时效性我选择了方案B因为业务原始诉求明确指向「连续3个自然日」。且配合凌晨时序0:02 填昨日数据 → 3:01 统计保证数据就绪。防呆设计INNER JOIN cn_user_daily_flow_summary hist ON hist.transaction_count 0这条 INNER JOIN 确保只预警曾经交易过的用户。否则全平台没交易过的新用户全被捞进来预警就失去意义了。五、定时任务设计每日时间线00:02 fillV2(昨天) → 补齐昨天的 daily_flow_summary03:01 saveChurnWarning() → 跑预警统计写快照依赖时序 预警统计依赖 daily_flow_summary 完整所以必须放在凌晨0:02 填充之后。我特意把预警放到3:01留出近3小时缓冲避免填充任务异常导致预警漏判。幂等性 快照 SQL 用 ON DUPLICATE KEY UPDATE last_trade_time VALUES(last_trade_time)即使任务重复执行或凌晨3:01手动补跑同一天也只会有一条不会产生脏数据。六、接口与页面后端接口接口 作用POST /admin/mall/churnWarning/save 手动触发统计异步POST /admin/mall/churnWarning/list 查询最新快照分页异步化设计 save 接口用线程池异步执行立即返回避免大 SQL 阻塞 HTTP 请求导致超时。// 用项目已有的线程池而非 new Thread()AutowiredQualifier(asyncServiceExecutor)private Executor taskExecutor;PostMapping(/admin/mall/churnWarning/save)public AjaxResult save() {taskExecutor.execute(() - churnWarningService.saveChurnWarning());return AjaxResult.success(统计中稍后刷新);}前端页面手动统计按钮测试/初始化用关键词搜索手机号、企业名沉默天数标签按最后交易日计算绿/橙/红分级分页数据量大时分页展示设计权衡 页面只展示最新一次快照WHERE stat_date (SELECT MAX(stat_date) ...)默认不提供日期选择。因为业务方明确说「不用查历史日期」简化交互。七、架构复盘与改进空间做得对的快照模式把「实时查询」改为「每日归档」历史可回溯聚合中间层引入 daily_flow_summary避免大表反复扫描幂等写入唯一索引 ON DUPLICATE KEY容错重跑反规范化冗余展示字段查询免联表可改进的方向 说明预警通知闭环 目前只记录展示可扩展为企业微信/短信通知滑动窗口 当前是固定「昨天前天大前天」节假日可能误报可改为「最近N天滑动窗口无交易」多维信号 目前只看交易可叠加登录、浏览等行为信号提升准确率沉默天数冗余 如业务需要按沉默天数排序/分组可冗余存 silent_days数据分区 快照表按 stat_date 分区历史数据量大时可归档八、总结这个「每日预警系统」的本质是把业务规则翻译成可执行、可追溯、高性能的工程方案。从架构角度它体现了几条通用原则写时计算优于读时计算 — 聚合结果提前算好快照优于实时 — 历史可回溯性能可控冗余换取性能 — 反规范化存储展示字段幂等保证可靠 — 定时任务可安全重跑异步保护体验 — 大任务不阻塞请求它不是最复杂的系统但把「业务诉求 → 数据模型 → 任务调度 → 展示层」这条链路走通且跑稳对运营决策提供了实实在在的支撑。这大概就是架构的价值——不炫技但每一处设计都有据可依。

相关新闻

Claude Code + cc-switch + Git + Node.js 一站式完整安装配置教程(2026最新·国内可用版)

Claude Code + cc-switch + Git + Node.js 一站式完整安装配置教程(2026最新·国内可用版)

Claude Code cc-switch Git Node.js 一站式完整安装配置教程(2026最新国内可用版) 整体安装顺序(严格按此执行,避免依赖报错) Node.js(必须前置,Claude Code、cc-switch均依赖npm&#xff09…

2026/8/4 18:05:12 阅读更多 →
Unity WebGL模块化加载实战:用Sea.js优化游戏首屏与增量更新

Unity WebGL模块化加载实战:用Sea.js优化游戏首屏与增量更新

1. 项目概述:为什么要在Unity WebGL中引入Sea.js?如果你是一个Unity开发者,尤其是做过WebGL平台发布的,肯定对那个动辄几十兆、甚至上百兆的单一.data文件和.js文件印象深刻。当用户打开你的游戏网页时,浏览器需要一口…

2026/8/4 18:05:12 阅读更多 →
无人机被动探测与定位

无人机被动探测与定位

一、被动探测真正要解决的,不只是“有没有信号”无人机被动探测通常利用目标自身发射或转发的无线信号,不主动照射目标。它的优势是电磁暴露低、部署灵活,并且能够保留目标信号的频谱、时域和协议特征;但被动也意味着系统无法自行…

2026/8/4 18:05:12 阅读更多 →

最新新闻

2026 微信小程序主体变更准入条件、公证办理实操、后台提交流程与开发侧适配改造全方案

2026 微信小程序主体变更准入条件、公证办理实操、后台提交流程与开发侧适配改造全方案

小程序主体变更是微信开放平台为解决账号运营主体权属转移推出的合规能力,广泛应用于企业架构重组、个人账号企业化升级、项目股权交割等业务场景。整个流程分为前置条件校验、公证文件办理、后台资料提交、审核缴费、变更后系统与备案整改五大环节,其中…

2026/8/4 18:52:28 阅读更多 →
本地部署AI语音合成与克隆:知更鸟项目实践指南

本地部署AI语音合成与克隆:知更鸟项目实践指南

这次我们来看一个名为“知更鸟”的开源项目。这个名字听起来很文艺,但它解决的是一个非常实际的技术问题: 本地化、高质量、可控的AI语音合成与克隆 。简单来说,它让你能在自己的电脑上,用一段参考音频,快速生成相似…

2026/8/4 18:52:28 阅读更多 →
利用AI与自动化技术构建家庭日历播客:从信息整合到语音周报的实践指南

利用AI与自动化技术构建家庭日历播客:从信息整合到语音周报的实践指南

1. 先搞清楚“家庭日历播客”到底能帮你做什么如果你正在寻找一种方法,把家里那些零散的计划、提醒和家庭讨论,用一种更生动、更易于回顾的方式组织起来,那么把 ChatGPT 这类对话模型和“家庭日历播客”结合起来,可能是一个值得尝…

2026/8/4 18:52:28 阅读更多 →
非遗文化展览系统的设计与实现

非遗文化展览系统的设计与实现

一、项目背景与意义 非物质文化遗产是中华民族悠久历史与文化积淀的瑰宝,承载着丰富的民族记忆与地域特色。然而,在现代化进程加速的今天,许多非遗项目正面临传承人老龄化、年轻人关注度不足、传播渠道单一等严峻挑战。传统的非遗展览与传播方…

2026/8/4 18:52:28 阅读更多 →
测试数据生成工具-JSON对比

测试数据生成工具-JSON对比

一、痛点网络上有很多json对比工具,但是用起来不是很方便。有时候,有些公司是不让连外网的。外网工具就不能用例。其次,对比后结果要每次编辑。然后发给开发看。效率不够搞。所有加在这个工具里面。解决痛点如下:①对比结果查看方…

2026/8/4 18:51:28 阅读更多 →
ComfyUI-WanVideoWrapper实战手册:从创意到视频的智能转换方案

ComfyUI-WanVideoWrapper实战手册:从创意到视频的智能转换方案

ComfyUI-WanVideoWrapper实战手册:从创意到视频的智能转换方案 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否曾经想象过,把一段文字描述、一张静态图片&#xff…

2026/8/4 18:51:28 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →