尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

斗鱼前端面试全记录:直播业务核心考点与参考答案

斗鱼前端面试全记录:直播业务核心考点与参考答案 斗鱼的面经我拖了快两周才动笔。不是懒是面完之后确实需要时间消化——很多问题当时没反应过来回来翻资料复盘才意识到考官真正想考的是什么。我投的是斗鱼前端开发岗偏直播业务方向坐标武汉总部整个流程走下来差不多三周一共四轮面试加一轮线上笔试。这篇文章把所有核心面试题和参考答案按轮次整理出来前端方向的同学可以直接拿去当复习提纲非前端方向也可以重点看弹幕系统设计、直播链路和WebRTC这几块这些是直播业务面试的通用考点做后端、客户端、测试的兄弟同样用得上。先交个底我上一家公司做泛娱乐应用两年半前端经验Vue技术栈为主写过小程序也写过Node中间层。决定投斗鱼核心原因有两个一是直播互动的业务场景对前端来说非常锻炼人弹幕、礼物、连麦、低延迟播放每一个模块都有足够深的技术挑战二是斗鱼前端团队在音视频领域的实践积累比较厚WebRTC相关的技术文章在业内经常看到能进这样的团队对成长帮助很大。准备阶段我按照基础能力、框架原理、直播链路、系统设计四条线拆解复习后面面下来发现斗鱼的面试官基本就是围绕这四条线出题的没有太多偏题怪题。1. 面试前的准备岗位分析与技术栈预热1.1 岗位定位与简历投递从斗鱼前端JD来看岗位要求的核心能力大概是这几项扎实的JavaScript基础熟悉至少一个主流框架Vue用得多React也会问熟悉HTTP、WebSocket等网络协议有音视频或直播相关经验加分有性能优化经验加分。我把自己的项目经历做了个列表重点圈出和直播相关的部分我之前做过一个IM产品中的聊天室模块里面涉及消息的实时收发、消息列表的虚拟渲染还有类似特效气泡的动画实现。这些点和弹幕、礼物场景高度相关投递时直接把这段经历写在简历靠前的位置。简历投递这件事我多说一句。很多人喜欢海投我的建议是定向投。斗鱼武汉总部和北京、上海团队的业务侧重点有差异我投的是武汉总部JD里明确说明是直播核心业务团队那么简历就应该围绕直播互动来组织而不是把日常管理系统的一堆琐碎CRUD都堆上去。我身边有朋友投斗鱼被拒反馈是简历太通用看不出和直播业务有什么关联。这个细节值得重视。1.2 技术栈预热清单我花了一个完整的周末做知识点清单。这里整理出来方便后面准备的人对照自测JavaScript闭包与作用域链、原型与原型链、this指向、事件循环宏任务/微任务、Promise系列all/race/allSettled、跨域方案、深拷贝与浅拷贝、防抖节流、垃圾回收机制浏览器与网络从输入URL到页面展示的完整过程、HTTP缓存机制、HTTPS握手过程、HTTP/1.1与HTTP/2对比、WebSocket与HTTP的关系、WebRTC基础流程框架Vue2/Vue3响应式原理、diff算法、nextTick原理、Composition API与Options API对比、Vuex/Pinia状态管理、React Hooks如果会React也会被问工程化与性能webpack核心构建流程、Vite原理、长列表优化、首屏加载优化、CDN分发原理、Service Worker、Canvas渲染基础业务场景弹幕系统设计、礼物动画优化、直播流播放HTTP-FLV、HLS、WebRTC、弱网下的重连策略这个清单看起来内容不少但每一项其实不需要深入到源码级别。我的策略是每个知识点准备两层第一层是是什么能一句话说清楚原理第二层是为什么能讲出设计动机和适用场景。面试官追问的时候你有第二层内容就基本能接住。1.3 简历里的坑与修正这里必须诚实地提醒一句简历上写了但答不深的内容面试官一定会揪出来不要心存侥幸。我第一版简历里写了熟悉WebRTC低延迟直播方案事实上我只是做过一次技术调研根本没有落地的项目经验。一面倒是没问二面遇到一个做音视频的面试官直接让我讲一遍WebRTC的完整建连流程我讲得磕磕绊绊场面一度很尴尬。后来我回家把简历改成了解WebRTC基础协议与连接流程再面的时候用原理层面的理解去回答反而成了加分项。这个例子非常典型。直播业务团队的面试官大多深耕音视频领域任何一个不真实的措辞都会被追问穿帮。简历的写法应该是在真实和有亮点之间找平衡。建议把自己做过的项目里技术点拆细把负责XX模块改成针对XX问题采用XX方案最终达到XX效果这样既有细节又有说服力。2. 一面实录基础技术面的高频题与参考答案2.1 JavaScript核心闭包、事件循环与异步一面面试官是组里一名资深前端视频面试节奏不紧不慢。第一个大问题是闭包。问题说说什么是闭包有哪些应用场景有什么需要注意的点参考答案闭包是函数和它定义时的词法作用域的组合。简单说当函数被定义时它会保存执行上下文中的变量引用之后即使这个函数在外部被调用它依然能访问到那些变量。应用场景很典型防抖节流函数里保存定时器id模块化开发中利用IIFE创建私有变量React的useState底层也依赖类似的变量捕获机制。需要注意的点是内存管理——闭包会让被引用的变量长期不能被垃圾回收如果持有的是DOM引用或大对象可能造成内存泄漏。所以闭包用到什么地方、什么时候释放心里要有数。第二个大问题围绕事件循环展开。面试官直接抛了一段代码console.log(1); setTimeout(() console.log(2), 0); Promise.resolve().then(() console.log(3)); console.log(4);正确答案是1、4、3、2。这道题看起来基础但考点在于执行顺序的理解同步代码先执行微任务队列在同步代码执行完之后、下一个宏任务之前清空setTimeout是宏任务即使延时为0也要等微任务队列清空后才执行。面试官还追问了两个变体如果Promise后面再跟一个Promise.then输出顺序如何如果在微任务里不断生成微任务是否会阻塞宏任务第二个问题我的回答是会。微任务队列是清空式执行的如果在执行微任务时不断往队列里追加微任务宏任务会一直被阻塞。这也解释了为什么递归地用Promise写死循环会卡住页面而setTimeout的死循环则相对有机会让出主线程。这种追问虽然偏底层但恰恰是区分背过和真懂的地方。2.2 浏览器与网络URL输入、HTTPS与缓存这些是必考题斗鱼这类视频平台对网络章节格外重视。问题浏览器从输入URL到页面展示中间发生了什么参考答案完整链路是DNS解析拿到IP建立TCP连接三次握手如果是HTTPS还要完成TLS握手然后发送HTTP请求服务器返回HTML浏览器解析HTML构建DOM树同时解析CSS构建CSSOM两者合并成渲染树随后进行布局Layout和绘制Paint最后通过合成器输出到屏幕。中间遇到JS脚本还要考虑阻塞问题——这也是为什么业界流行把script标签放在body尾部或者加defer/async的原因。追问1HTTPS握手流程是什么对称加密和非对称加密分别用在哪里参考答案TLS握手流程上客户端发送ClientHello带随机数、支持的加密套件列表服务端返回ServerHello并携带证书和随机数客户端验证证书后用证书公钥加密一个预主密钥发给服务端双方根据这段预主密钥独立计算出会话密钥之后正式通信全部走对称加密。这里的关键在于非对称加密只用来安全地传递密钥不直接加密业务数据因为性能差距太大。如果每一笔请求都用非对称加密延迟和CPU开销根本扛不住。所以非对称传密钥、对称传数据是HTTPS在安全与性能之间的平衡点。追问2HTTP缓存能讲一下吗强缓存和协商缓存分别怎么工作参考答案强缓存对应的响应头是Cache-Control比如max-age3600和Expires命中强缓存时浏览器直接使用本地副本不发请求协商缓存对应Last-Modified/If-Modified-Since和ETag/If-None-Match浏览器把缓存标识带给服务器由服务器判断要不要返回304。实操中一般强缓存配文件名hash协商缓存用于不确定变化的资源。2.3 手写代码题这些题基本都会遇到斗鱼的线上笔试和一面手写环节我遇到的题目有这几类手写防抖函数、手写深拷贝、实现数组扁平化、字符串括号匹配。我重点说防抖和深拷贝。防抖的经典实现function debounce(fn, wait) { let timer null; return function (...args) { clearTimeout(timer); timer setTimeout(() { fn.apply(this, args); }, wait); }; }这里有个小细节很多人在手写时忘记保存this指向。实际上setTimeout的回调是独立调用所以需要使用fn.apply(this, args)把原始的this传进去否则在对象方法场景下this会丢失。深拷贝的话需要考虑循环引用标准写法是用WeakMap记录已拷贝的对象function deepClone(obj, map new WeakMap()) { if (typeof obj ! object || obj null) return obj; if (map.has(obj)) return map.get(obj); const result Array.isArray(obj) ? [] : {}; map.set(obj, result); for (const key of Object.keys(obj)) { result[key] deepClone(obj[key], map); } return result; }这里我特别提一句不要背代码而是要说清楚为什么用WeakMap而不是普通Map因为WeakMap的键是弱引用当源对象被释放时对应的记录可以被垃圾回收不会造成额外的内存泄漏。面试官听到这个点通常会点头。3. 二面实录直播业务深潜弹幕与WebRTC专项3.1 弹幕系统设计从传输到渲染的完整方案二面的面试官看起来是业务团队的Leader。他从一个非常业务的问题开始你平时看直播吗弹幕和礼物的交互流程你了解吗然后直接进入正题如果让你设计一个直播间的弹幕系统你会怎么设计这个问题的回答框架我认为至少包含四个层次。第一层是传输链路。弹幕是强实时场景优先用WebSocket长连接发弹幕时客户端把消息推给服务端服务端做合法性校验后向直播间内所有客户端广播。不建议用短轮询因为弹幕频率高轮询请求量会放大很多倍。第二层是客户端渲染。直播间的弹幕量很大如果每条弹幕都创建一个DOM节点在弹幕密集时页面必然卡顿。常见做法是用Canvas渲染弹幕层或者用对象池复用DOM节点配合requestAnimationFrame统一绘制。我之前的聊天室项目就是用DOM虚拟列表实现的但面试官追问了一句如果是飞行弹幕从右往左滚动呢DOM方案确实很吃力Canvas才是更适合的。第三层是消息合并与降级。弹幕高峰时没必要每条都去渲染服务端可以做批量推送客户端做合并批次比如每100ms统一渲染一批。对于礼物消息可以抽帧合并避免刷屏时动画卡死。第四层是健壮性。弱网、断线重连、消息去重、发送频率限制客户端节流、服务端限流都要考虑。弹幕这种高吞吐场景不能只考虑功能要考虑到极端情况下系统的表现。这个问题我建议大家都提前准备因为它是直播业务面试的万金油题斗鱼、虎牙、B站、快手都会问答案可以复用。3.2 WebRTC核心考点建连流程、STUN/TURN与弱网优化既然要看直播平台WebRTC基本是绕不开的一环。面试官问WebRTC的P2P连接建立流程是什么STUN和TURN有什么区别参考答案WebRTC建连大致分四步。第一步创建RTCPeerConnection实例并添加媒体流用getUserMedia获取本地音视频流或者通过addTrack添加。第二步通过信令服务器交换SDP。调用方创建offer调用setLocalDescription被调方收到offer后创建answer也调用setLocalDescription。双方通过WebSocket等信令通道把SDP传给对方。第三步ICE候选收集和交换。两端各自通过ICE框架收集Candidate包括本机局域网地址、STUN映射出的公网地址、TURN中继地址然后通过信令通道交换。双方按优先级尝试逐对打通连接同一局域网直连不同NAT环境下尝试UDP打洞打洞失败则回落到TURN中继。第四步媒体数据通过选定的传输路径以SRTP加密方式传输。关于STUN和TURN的区别直接说结论STUN的作用是让端到端设备知道自己的公网映射地址也就是NAT翻译表里那条记录它本身不转发任何媒体报文轻量且便宜TURN是一个中继转发服务器当网络环境是对称型NAT或者企业防火墙禁止UDP直连时P2P打洞打不通媒体流必须经过TURN转发它能打通但代价是额外带宽和延迟。所以建连时的优先级是直连大于STUN打洞再大于是TURN中继。追问WebRTC弱网下怎么优化参考答案WebRTC内置了拥塞控制和码率自适应机制会根据丢包率、RTT动态调整视频编码码率和分辨率。前端可以监听iceconnectionstatechange和connectionstatechange事件来感知连接状态当连接退化到disconnected甚至failed时主动触发重协商、切换TURN地址或者提示用户。同时Jitter Buffer可以对抗网络抖动让播放端尽量平滑。这里我建议不要只背概念。面试官如果继续追问你们项目里采样率、码率大概怎么设置你得能从实际角度回答。没有做过WebRTC项目的同学至少要把建连流程和STUN/TURN讲清楚这是最基础的。3.3 直播链路HTTP-FLV、HLS与延迟对比面试官接着问直播平台为什么有时候用HLS有时候用HTTP-FLV延迟差多少参考答案HLS是苹果主导的基于HTTP的流媒体协议核心是服务端把视频切成一个个的小片段通常是2到10秒的ts文件客户端按顺序下载播放。它的优势是兼容性好浏览器直接支持iOS原生支持可以充分利用HTTP缓存和CDN适合点播和延迟不敏感的场景劣势是切片机制决定了延迟会被拉高通常在5到10秒甚至更高因为客户端至少要累积好几个分片才能流畅播放。HTTP-FLV则是把FLV格式的媒体数据装进HTTP响应流里客户端收到的是持续的字节流不用等分片边下边播延迟可以压到1到3秒非常适合直播互动场景。斗鱼这类平台播放端大量使用HTTP-FLV配合CDN边缘节点分发。缺点是FLV格式本身比较老旧封装格式的灵活性不如MP4而且HTTP-FLV不支持iOS原生播放Safari不支持FLV因此iOS端往往需要用原生播放器或转封装方案。追问如果要做一个低延迟直播方案优先选WebRTC还是HTTP-FLV参考答案这个要分场景。HTTP-FLV基于CDN架构大规模分发成本低能支撑百万级并发延迟控制在秒级适合大型直播活动、游戏直播这种一对多的场景。WebRTC的优势是端到端延迟能压到几百毫秒但大规模直播分发对服务端和网络的改造要求高成本也高更适合互动性极强的场景比如连麦PK、在线教育小班课、实时互动直播。斗鱼在低延迟互动方向有WebRTC相关实践从这里能看出直播平台对延迟的持续追求。这个问题很有层次感我第一次面的时候没回答得这么完整回来查资料复盘才想清楚。建议后面面试的同学提前把HLS、HTTP-FLV、WebRTC三者的延迟、场景、优缺点列表做好面试时随手可以画出来。4. 交叉面/技术总监面系统设计与综合评估4.1 百万人在线的弹幕与礼物架构怎么设计第三面是交叉面面试官是别的团队的技术负责人问题更偏向系统和整体架构。原题大意假设一场热门比赛主播开播后瞬间涌入一百万观众弹幕和礼物消息怎么保证不卡顿参考答案拆成四个层面。接入层WebSocket网关集群按直播间维度做路由同一个room_id连接到同一个网关逻辑分组避免消息跨节点大量转发。分发层服务端收到弹幕后先做合法性校验、过滤、限流再通过消息中间件如Kafka/RocketMQ或Redis Pub/Sub进行扇出把消息推送到该直播间的连接节点。这里的关键是不要把消息实时逐条透传而是做切片或批量。播放与渲染层客户端对弹幕做批量渲染用Canvas绘制覆盖在视频之上避免DOM节点爆炸礼物动画使用CSS transform和合成层尽量减少重绘和回流聊天列表用虚拟列表。异常处理断线重连必须有指数退避策略消息带上递增序号用于去重本地缓存最近N条弹幕重连后先补拉。还有一个隐藏点弹幕和礼物是不同优先级的消息。礼物量远小于弹
返回列表