多端看课进度怎么同步才不打架:断点续播、进度合并与冲突处理

简介: 用户在手机、电脑、平板间切换看课时,学习进度常出现断点不准、进度回退、多端互相覆盖等问题。本文把进度同步拆成上报、合并、冲突三件事:用时间加事件双触发节流上报并在离开页面前补报,用取最远位置的归并规则替代按到达时间覆盖,再单独处理拖动复习、跳章和离线补传三类冲突,最后给出工程落地与上线自检清单。

用户在手机上看课看到第 12 分钟,回到家打开电脑网页版,期望视频直接从第 12 分钟继续;可现实经常是:电脑还停在开头,或者进度条莫名其妙回退,甚至两端互相覆盖,刚看完的章节又变成"未学"。学习进度同步看似是个小功能,真正要做到"多端一致、弱网不丢、断点准确",需要把上报、合并、冲突三件事拆开设计。

一、先想清楚:进度数据的本质是什么

一条学习进度至少要回答四个问题:哪个用户、哪节课、看到了多少秒、这次上报发生在什么时候。最小数据模型:

CREATE TABLE learn_progress (
  user_id    BIGINT NOT NULL,
  lesson_id  BIGINT NOT NULL,
  position   INT NOT NULL,        -- 已观看位置,单位秒
  duration   INT NOT NULL,        -- 视频总时长,用于算完成度
  finished   TINYINT NOT NULL DEFAULT 0,
  updated_at BIGINT NOT NULL,     -- 客户端事件时间戳(毫秒)
  server_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (user_id, lesson_id)
);

这里有个关键区分:updated_at 是客户端产生事件的时间,server_at 是服务器收到的时间。弱网下用户在地铁里看的进度可能延迟几十秒才上报,判断"哪条更新"时要看事件时间而不是到达顺序,否则旧进度后到会覆盖新进度。

二、断点续播:进度上报要"节流"而不是"每帧上报"

视频每秒都有播放回调,如果每个回调都写一次数据库,写量会被放大几十倍;但如果只在暂停或退出时上报,用户直接杀进程就会丢一大段进度。合理的上报策略是"时间 + 事件"双触发:

let lastReport = 0;
player.on('timeupdate', ({
    currentTime }) => {
   
  const now = Date.now();
  // 每 5 秒上报一次,避免写放大
  if (now - lastReport >= 5000) {
   
    lastReport = now;
    reportProgress(currentTime);
  }
});
// 暂停、切后台、离开页面前补报一次,保证断点尽量新
['pause', 'beforeunload', 'visibilitychange'].forEach(ev =>
  player.on(ev, () => reportProgress(player.currentTime))
);

beforeunload 里发请求要用 navigator.sendBeacon,普通 ajax 在页面卸载时可能发不出去。断点续播时,进入播放页先拉一次服务端进度,seek 到对应位置即可;为避免每次拖动都被拉回,可以只在"本地无进度或本地进度明显落后"时才 seek。

三、多端进度合并:取"最远位置"而不是"最后上报"

同一节课用户可能在手机、电脑、平板间切换,多端各自上报进度,服务端该信谁?对"已观看位置"这种单调不减的数据,正确的合并规则是取最大有效位置,而不是按上报到达时间覆盖:

-- 只有新进度比当前更远才更新,天然抵御旧消息乱序到达
UPDATE learn_progress
SET position = CASE WHEN ? > position THEN ? ELSE position END,
    finished = finished OR ?,
    updated_at = GREATEST(updated_at, ?)
WHERE user_id = ? AND lesson_id = ?;

这样即使一台旧设备延迟上报了一个较小的位置,也不会把进度往回拉。要注意"最远"必须有上界:位置不能超过视频总时长,客户端传上来的值要先和 duration 校验,过滤掉拖动条甩到末尾、脏数据导致的虚假完成。

四、冲突处理:这几类情况要单独对待

不是所有冲突都能简单取最大值,有三种边界要专门处理:

  1. 用户手动拖回复习:用户故意把进度拖回第 3 分钟重看,此时不应被"最大位置"顶回去。区分"自然播放位置"和"拖动目标",复习拖动只影响本地播放头,不上报为更小的学习进度即可。
  2. 换课/跳章:上报必须带 lesson_id,章节切换时先结算上一节、再初始化下一节,避免 A 课进度写到 B 课。
  3. 离线观看后联网同步:离线期间产生的多条进度,客户端按事件时间排队,联网后批量上报;服务端逐条用上面的"取最远"规则归并,最终收敛到离线期间到达的最远位置。

完成度判定建议由服务端统一计算(如 position/duration ≥ 0.95 记为完成),不要各端各算一套,否则同一节课在不同端"已学/未学"状态不一致。

五、踩坑清单

  • 每帧上报进度,数据库写量放大数十倍;
  • 只在退出时上报,杀进程、断网导致进度丢失;
  • 按服务器到达时间覆盖,弱网旧进度把新进度冲掉;
  • 进度不设上界,脏数据直接标记"已学完";
  • beforeunload 用普通 ajax,卸载时请求发不出去;
  • 完成度各端各算,章节状态对不上。

六、工程落地建议

落地时先把"进度单调不减、按事件时间归并、服务端统一判完成"这三条主规则定下来,再处理节流上报和离线补传;上报接口设计成幂等的(同一用户+课程+位置重复上报无副作用),方便客户端放心重试。成型的在线教育平台一般已内置多端进度同步、断点续播与章节完成判定(如基于成型平台的课程学习能力,如乔拓云教育系统),自研时重点保证多端合并规则与弱网补传的正确性。

七、上线自检清单

  1. 手机看到一半换电脑,是否能从断点附近续播;
  2. 弱网下进度延迟上报,是否不会把进度往回拉;
  3. 直接杀进程,最多丢失多少秒进度;
  4. 拖动复习是否不会错误覆盖真实学习进度;
  5. 同一节课在各端的"已学/未学"是否一致。

多端进度同步的核心,是认清"已看位置只增不减"这一业务特性,用取最远的归并规则替代简单的时间覆盖,再用节流和补传兜住弱网体验。以上为个人实践总结,具体方案请结合播放器与业务场景调整。

相关文章
|
2月前
|
人工智能 数据可视化 开发工具
Qoder CN的RepoWiki是什么?能自动生成项目文档吗?
RepoWiki 是阿里云 Qoder CN 的智能项目知识生成工具,可自动分析 Git 代码库,生成带溯源(含行号)的结构化文档;支持交互式规划、进度可视化、双向同步及多格式导出。按任务复杂度消耗 Credits,个人版首注赠300点。阿里云Qoder CN官网:https://t.aliyun.com/U/hGZKNX
|
3天前
|
弹性计算 Linux 网络安全
阿里云服务器怎么买?零经验用户从选购到配置的完整实操教程‌
阿里云ECS云服务器是你踏入云计算世界的第一步。从这里开始,你可以搭建网站、部署应用、学习运维、探索更多可能。希望这篇教程能帮助每一位新手小白顺利拥有属于自己的第一台阿里云ECS云服务器,开启你的云端之旅!
63 4
|
11天前
|
搜索推荐 算法 前端开发
SpringBoot+Vue 管理系统毕业设计|软件工程毕设开发实战
本系统基于SpringBoot+Vue开发,实现自习室预约管理,支持座位预约、签到、违规监管与数据看板。创新点在于引入协同过滤算法,根据用户历史行为智能推荐座位(如常去楼层、时段、座位类型),提升资源利用率。含完整数据库设计、核心代码及测试方案,适合作为计算机/软件工程专业本科毕设。(239字)
|
1月前
|
存储 小程序 前端开发
小程序表单与会员体系搭建实战:信息收集、权限控制与数据管理
本文拆解小程序表单与会员体系的技术实现:字段设计、校验防刷、会员分级模型与数据权限管理,并给出中小团队的低成本落地路径。
|
1月前
|
缓存 移动开发 监控
商城商品与订单管理技术实战:SKU模型、库存同步与订单状态流转
本文从技术角度拆解商城系统的三块核心设计:SPU+SKU数据模型、库存同步防超卖方案与订单状态机流转,并给出幂等与对账的落地要点,适合商城类产品开发者参考。
|
2月前
|
人工智能 JSON JavaScript
把 AI Agent 做成可治理的插件系统:能力清单、策略校验与模型适配层实践
本文提出一个TypeScript轻量框架,将Agent工具调用解耦为四层边界:插件清单(能力声明)、注册中心(生命周期)、策略层(权限控制)、模型适配层(协议隔离)。强调模型仅提供建议,执行权归属宿主,确保可枚举、可校验、可授权、可审计,兼顾安全与可维护性。(239字)
127 2
|
2月前
|
数据采集 运维 监控
Agent编排平台怎么选?先问自己这三个问题
选Agent平台不必纠结“谁最好”,关键看是否匹配自身实际。本文提出三问自检法:1.团队能否维护开源底层?2.业务是单点任务还是跨系统长链?3.数据能否出内网?厘清这三点,自然锁定最适合的生产级方案——适配比参数更重要。
119 3
|
2月前
|
存储 运维 监控
无人自助洗车平台:系统架构搭建与交易资金结算合规实践
无人自助洗车属于典型物联网撮合类业务,平台对接大量线下自助洗车设备网点,面向 C 端用户提供扫码洗车、套餐充值、次卡购买服务。业务链路涉及设备硬件、小程序前端、物联网网关、后端业务系统、多方资金结算。 平台营收来源包含单次洗车消费、套餐充值、会员次卡;资金需要拆分给设备加盟商、场地物业方、设备运维服务商以及平台自身佣金。很多初创团队优先完成设备联网、扫码启动、状态上报等业务功能,却忽略交易结算体系的设计。 早期业务规模小的时候,很多平台采用资金先进入平台账户,后期财务人工转账结算合作方。随着网点扩张、设备数量上涨,订单量爆发,就会暴露出二清风险、对账工作量巨大、结算错漏、资金流向不可追溯等问题
200 2
|
1月前
|
人工智能 搜索推荐 SEO
企业官网GEO优化实战:让AI搜索真正读懂你的网站
本文解析AI搜索时代企业官网的GEO(生成式引擎优化)落地方法:从Schema结构化标记、开放图谱到llms.txt,结合技术示例与不同建站方式的实践路径,帮助企业官网在AI搜索中获得更多曝光。
|
3月前
|
人工智能 缓存 定位技术
llms.txt如何助力GEO优化:写法与部署
llms.txt 是面向生成式引擎优化(GEO)的轻量级协议,置于网站根目录,以结构化Markdown清单精准引导AI读取核心页面。它省Token、强E-E-A-T、控叙事边界、优RAG索引,主分组建议10–30条“动词+结果”描述,上线即建度量闭环。普林斯顿GEO论文证实其可提升可见度40%。
606 0