题目重点:设计搜索曲库、播放清单、媒体投递与多设备播放状态,明确版权区域约束。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 只明确类似QQ Music的App,无规模/功能列表。练习范围为曲库搜索、playlist、在线播放与付费离线缓存;歌词/推荐作为扩展。
- 区域授权、下架、订阅到期会改变可播性;下载了文件不代表永久播放权,具体授权政策由产品给定。
解题路线
- Track记录媒体版本/演唱者/专辑与授权区域,PlaylistEntry有稳定entryId而非只以trackId唯一,允许同曲多次出现。播放session关联设备与可播授权,不把playlist对象直接当媒体文件。
- 上传/转码生成多码率媒体,CDN分发;客户端先获取短期播放授权与媒体位置,鉴权和对象缓存分开。热门曲目预热,媒体内容不可变版本减少缓存污染。
- playlist add/remove/reorder用版本与entryId,冲突时确定拒绝重试还是合并操作;客户端离线队列每操作幂等键。删除entry不能按位置重试,否则新排序会删错歌。
- 离线下载保存授权到期、媒体hash和可恢复分片状态;恢复网络时刷新授权和同步播放进度。不同设备进度是per-track/per-session事实,是否取最近时间或最远进度需要明确用户体验政策。
手动走一遍
列表A、B、A有三个entryId。设备1删除第一个A,设备2重排第三个A,不应因为同trackId把两项全删。订阅到期但文件在手机里,客户端按授权政策停止付费播放而非重新下载就解锁。
规模与取舍
媒体带宽由并发听众×码率决定:10万并发×128kbps约12.8Gbps有效payload,数值为训练假设。playlist写按版本/条目索引;推荐和搜索状态规模另估,不混到音频字节容量。
易错点与追问
容易失分的边界
- 以trackId作为playlist唯一项,无法表达重复歌曲。
- 用户删第3项的重试按当前第3位置执行。
- CDN拿到对象就视为任何地区可播。
继续深挖
- 播放失败时怎样分辨授权、元数据、CDN和客户端解码?
- 多人协作playlist如何比较版本CAS与操作合并?
