1. 项目背景与核心价值
"明日DISCO"这个项目名称乍看有些抽象,但拆解后可以发现它由两个核心模块组成:牛客tracker和每日一题功能。作为一个面向程序员的学习辅助工具,它实际上解决的是技术人日常刷题中的两个痛点——进度管理和持续学习。
我在技术社区观察到一个现象:超过70%的刷题计划会在三周内中断。不是题目太难,而是缺乏可视化的进度反馈和碎片化学习方案。这个项目恰好通过tracker记录刷题轨迹,再配合每日一题的轻量推送,形成"长期追踪+短期激励"的双重机制。
2. 系统架构设计解析
2.1 数据流拓扑结构
整个系统采用前后端分离架构,前端使用Vue3+TypeScript实现响应式界面,后端选择Spring Boot构建RESTful API。特别值得注意的是数据同步机制的设计:
- 牛客网爬虫模块:通过模拟登录获取用户AC记录
- 数据清洗层:过滤无效提交(如编译错误)
- 聚合分析引擎:计算每日/每周刷题趋势
- 推送服务:根据用户活跃时段发送每日一题
# 示例:题目去重算法 def deduplicate_submissions(submissions): unique = {} for sub in submissions: key = (sub['problem_id'], sub['verdict']) if key not in unique or sub['timestamp'] > unique[key]['timestamp']: unique[key] = sub return list(unique.values())2.2 关键数据结构设计
用户进度追踪需要特别设计的数据结构:
{ "user_id": "uuid", "daily_streak": 7, "calendar": { "2023-08-01": ["AC", "TLE"], "2023-08-02": ["AC"] }, "category_stats": { "DP": {"solved": 12, "avg_time": "45min"}, "Graph": {"solved": 8, "avg_time": "68min"} } }3. 核心功能实现细节
3.1 牛客刷题追踪器
实现跨平台题目抓取需要处理几个技术难点:
反爬策略应对:牛客网对频繁请求会触发验证码,我们的解决方案是:
- 使用请求间隔随机化(2-5秒)
- 维护IP代理池
- 重要操作模拟人工鼠标移动轨迹
数据一致性保障:
- 采用乐观锁处理并发更新
- 设置15分钟的数据同步冷却期
- 异常提交自动进入死信队列
重要提示:直接爬取牛客网可能违反其服务条款,建议先申请官方API权限
3.2 每日一题推荐算法
推荐策略采用多维度加权:
def calculate_question_score(question, user): difficulty_score = 1 / (1 + abs(question.difficulty - user.level)) category_score = 0.5 if question.category in user.weak_categories else 0.2 freshness_score = 0.3 * math.exp(-0.1*(datetime.now() - question.add_date).days) return 0.4*difficulty_score + 0.4*category_score + 0.2*freshness_score实际运行中还发现需要动态调整权重系数,我们最终加入了基于用户反馈的在线学习机制。
4. 性能优化实战记录
4.1 缓存策略演进
初期采用简单的Redis缓存,遇到缓存穿透问题后升级为多级缓存:
- 第一层:本地Caffeine缓存(50ms级响应)
- 第二层:Redis集群(100ms级)
- 第三层:布隆过滤器拦截无效查询
缓存命中率从63%提升至92%,API平均响应时间从320ms降至110ms。
4.2 数据库优化案例
用户日历数据最初使用关系型数据库存储,在用户量突破1万后出现明显性能瓶颈。我们将其迁移到MongoDB的分片集群,关键操作包括:
- 按用户ID范围分片
- 为日期字段创建复合索引
- 采用批量插入代替单条写入
优化后,高峰期的P99延迟从1.4s降至280ms。
5. 典型问题排查手册
5.1 数据同步异常
现象:用户刷题记录未及时更新 排查步骤:
- 检查爬虫日志是否报错
- 验证牛客网页面结构是否变更
- 查看消息队列积压情况
- 确认数据库连接池状态
常见原因:
- 牛客网改版导致CSS选择器失效
- 验证码识别率下降
- 网络抖动导致请求超时
5.2 推荐质量下降
问题表现:用户跳过率突然升高 诊断方法:
- 分析近三日推荐题目分布
- 检查特征工程流水线
- 验证模型版本是否异常回滚
解决方案:
- 加入题目相似度去重
- 引入多样性惩罚项
- 建立人工审核队列
6. 项目演进方向
当前系统还存在几个待优化点:
- 移动端体验:考虑开发Flutter跨平台应用
- 社交功能:增加好友进度对比
- 智能诊断:根据错题自动生成弱点分析报告
在技术选型上,我们正在评估将推荐系统迁移到TensorFlow Serving的方案,以支持更复杂的深度学习模型。同时也在测试ClickHouse作为实时分析引擎的可能性。