沐游虞笔记
  • 前端面试题

    • HTML面试题汇总(无答案)
    • HTML面试题汇总
    • CSS 面试题汇总(无答案)
    • CSS 面试题汇总
    • javascript 面试题汇总(无答案)
    • javascript 面试题汇总
    • promise 面试题(无答案)
    • promise 面试题
    • 浏览器面试题汇总(无答案)
    • 浏览器面试题汇总
    • 网络面试题汇总(无答案)
    • 网络面试题汇总
    • 工程化面试题汇总(无答案)
    • 工程化面试题汇总
    • VUE面试题汇总(无答案)
    • VUE面试题汇总
  • 直播课文件

    • 静态页面学习指导
    • 属性的计算过程
    • 层叠继承规则总结
    • BFC
    • JS基础知识回顾
    • DOM 事件的传播机制
    • DOM 事件的注册和移除
    • 阻止事件默认行为
    • 基础领航考试题
    • 基础领航考试题(答案)
    • 2024前端发展
    • JS核心概念学习指导
    • 第三方库与工程化学习指导
    • Vue入门学习指导
    • vue进阶学习指导
    • 前端性能优化
  • 笔面试环节知识讲解

    • 目录
    • 图像处理
    • 图像处理(面试)
    • Webpack构建优化
    • Webpack构建优化(面试)
    • TTS性能优化
    • TTS性能优化(面试)
    • 实时协作
    • 实时协作(面试)
    • 网页复制图片到剪贴板
    • 网页复制图片到剪贴板(面试)
    • vite插件
    • vite插件(面试)
    • 表单数据同步与保持
    • 表单数据同步与保持(面试)
    • 优化虚拟列表
    • 优化虚拟列表(面试)
    • 微前端解决巨石应用
    • 微前端解决巨石应用(面试)
    • DNS解析与优化
    • DNS解析与优化(面试)
    • 前端监控
    • 前端监控(面试)
    • 12.跨标签页通信
    • 12.跨标签页通信(面试)
    • 13.Vite相关优化
    • 13.Vite相关优化(面试)
    • 14.计时器节流问题
    • 14.计时器节流问题(面试)
    • 15.多文件预览支持
    • 15.多文件预览支持(面试)
    • 16.defer优化白屏时间
    • 16.defer优化白屏时间(面试)
  • Vue3整体变化
  • Vue2响应式回顾
  • Vue3响应式变化
  • nextTick实现原理
  • 两道代码题
  • Vue运行机制
  • 渲染器核心功能
  • 事件绑定与更新
  • computed面试题
  • watch面试题
  • 图解双端diff
  • 图解快速dff
  • 最长递增子序列
  • 模板编译器
  • 模板编译提升
  • 组件name作用
  • 路由传参方式
  • 基础篇

    • 序章React介绍
    • JSX基础语法
    • React基本介绍
    • 表单
    • 生命周期
    • 组件与事件绑定
    • 组件状态与数据传递
    • Hooks
    • React--redux介绍
    • React-router介绍
  • 就业篇

    • 属性默认值和类型验证
    • 高阶组件
    • Ref
    • Context
    • Render Props
    • Portals
    • 错误边界
    • 组件渲染性能优化
    • 前端框架的理解
    • Reacti和Vue描述页面的区别
    • 前端框架的分类
    • 虚拟DoM
    • React整体架构
    • React渲染流程
    • Fiber双缓冲
    • MessageChannel
    • Scheduleri调度普通任务
    • Scheduleri调度延时任务
    • 最小堆
    • React中的位运算
    • beginWork工作流程
    • completeWork工作流程
    • 图解diff算法
    • commit工作流程
    • lane模型
    • React中的事件
    • Hooks原理
    • useStateuseReducer.
    • effect相关hook
    • useCallbackuseMemo
    • useRef
    • Update
    • 性能优化策略之eagerState
    • 性能优化策略之bailout
    • bailoutContextAPl
    • 性能优化对日常开发启示
  • 前端监控概述
  • 错误监控
  • 数据上报
  • 页面性能监控
  • 用户行为收集与埋点
  • CSS3手册
  • HTML5手册
  • JavaScript语言提升

    • es补充
    • 事件循环
    • promise基础
    • Promise的链式调用
    • Promise的静态方法
    • async和await
    • Promise相关面试题
  • 网络

    • 客户端与服务器
    • 关于 Apifox 的使用
  • git文档
  • 工程化

    • CommonJS
    • ES module
    • npm文档(包管理)
    • Lass笔记
    • webpack工具
  • canvas详解
  • uinapp笔记
  • 自动化测试
  • oauth2令牌

    • 认识Oauth2
    • 三方应用实现github授权
    • 微信三方应用登录实现
    • 支付宝沙箱支付功能
  • 前端面试题

    • HTML面试题汇总(无答案)
    • HTML面试题汇总
    • CSS 面试题汇总(无答案)
    • CSS 面试题汇总
    • javascript 面试题汇总(无答案)
    • javascript 面试题汇总
    • promise 面试题(无答案)
    • promise 面试题
    • 浏览器面试题汇总(无答案)
    • 浏览器面试题汇总
    • 网络面试题汇总(无答案)
    • 网络面试题汇总
    • 工程化面试题汇总(无答案)
    • 工程化面试题汇总
    • VUE面试题汇总(无答案)
    • VUE面试题汇总
  • 直播课文件

    • 静态页面学习指导
    • 属性的计算过程
    • 层叠继承规则总结
    • BFC
    • JS基础知识回顾
    • DOM 事件的传播机制
    • DOM 事件的注册和移除
    • 阻止事件默认行为
    • 基础领航考试题
    • 基础领航考试题(答案)
    • 2024前端发展
    • JS核心概念学习指导
    • 第三方库与工程化学习指导
    • Vue入门学习指导
    • vue进阶学习指导
    • 前端性能优化
  • 笔面试环节知识讲解

    • 目录
    • 图像处理
    • 图像处理(面试)
    • Webpack构建优化
    • Webpack构建优化(面试)
    • TTS性能优化
    • TTS性能优化(面试)
    • 实时协作
    • 实时协作(面试)
    • 网页复制图片到剪贴板
    • 网页复制图片到剪贴板(面试)
    • vite插件
    • vite插件(面试)
    • 表单数据同步与保持
    • 表单数据同步与保持(面试)
    • 优化虚拟列表
    • 优化虚拟列表(面试)
    • 微前端解决巨石应用
    • 微前端解决巨石应用(面试)
    • DNS解析与优化
    • DNS解析与优化(面试)
    • 前端监控
    • 前端监控(面试)
    • 12.跨标签页通信
    • 12.跨标签页通信(面试)
    • 13.Vite相关优化
    • 13.Vite相关优化(面试)
    • 14.计时器节流问题
    • 14.计时器节流问题(面试)
    • 15.多文件预览支持
    • 15.多文件预览支持(面试)
    • 16.defer优化白屏时间
    • 16.defer优化白屏时间(面试)
  • Vue3整体变化
  • Vue2响应式回顾
  • Vue3响应式变化
  • nextTick实现原理
  • 两道代码题
  • Vue运行机制
  • 渲染器核心功能
  • 事件绑定与更新
  • computed面试题
  • watch面试题
  • 图解双端diff
  • 图解快速dff
  • 最长递增子序列
  • 模板编译器
  • 模板编译提升
  • 组件name作用
  • 路由传参方式
  • 基础篇

    • 序章React介绍
    • JSX基础语法
    • React基本介绍
    • 表单
    • 生命周期
    • 组件与事件绑定
    • 组件状态与数据传递
    • Hooks
    • React--redux介绍
    • React-router介绍
  • 就业篇

    • 属性默认值和类型验证
    • 高阶组件
    • Ref
    • Context
    • Render Props
    • Portals
    • 错误边界
    • 组件渲染性能优化
    • 前端框架的理解
    • Reacti和Vue描述页面的区别
    • 前端框架的分类
    • 虚拟DoM
    • React整体架构
    • React渲染流程
    • Fiber双缓冲
    • MessageChannel
    • Scheduleri调度普通任务
    • Scheduleri调度延时任务
    • 最小堆
    • React中的位运算
    • beginWork工作流程
    • completeWork工作流程
    • 图解diff算法
    • commit工作流程
    • lane模型
    • React中的事件
    • Hooks原理
    • useStateuseReducer.
    • effect相关hook
    • useCallbackuseMemo
    • useRef
    • Update
    • 性能优化策略之eagerState
    • 性能优化策略之bailout
    • bailoutContextAPl
    • 性能优化对日常开发启示
  • 前端监控概述
  • 错误监控
  • 数据上报
  • 页面性能监控
  • 用户行为收集与埋点
  • CSS3手册
  • HTML5手册
  • JavaScript语言提升

    • es补充
    • 事件循环
    • promise基础
    • Promise的链式调用
    • Promise的静态方法
    • async和await
    • Promise相关面试题
  • 网络

    • 客户端与服务器
    • 关于 Apifox 的使用
  • git文档
  • 工程化

    • CommonJS
    • ES module
    • npm文档(包管理)
    • Lass笔记
    • webpack工具
  • canvas详解
  • uinapp笔记
  • 自动化测试
  • oauth2令牌

    • 认识Oauth2
    • 三方应用实现github授权
    • 微信三方应用登录实现
    • 支付宝沙箱支付功能
  • 必看导言

    • 就业的核心问题

      • 课件
    • 表现力的训练

      • 课件
  • 简历制作

    • 课件
    • 简历准备课堂笔记
    • 个人信息课堂笔记
    • 求职意向课堂笔记
    • 技术栈课堂笔记
    • 教育经历课堂笔记
    • 个人优势与评价课堂笔记
    • 工作经历课堂笔记
    • 项目
    • 项目亮难点问题

    • 项目经历

  • 项目准备

    • 课件
    • 课件
  • 技术重点

    • 划重点

    • 非技术环节
  • 简历投递和面试准备

    • 简历投递
    • 面试准备
  • 笔面试环节知识讲解
  • 项目准备
  • 难点攻关
  • 实时协作
  • 课件资料
luzhichang
2024-09-18
目录

04-面试讲解

# 实时协作面试讲解

# 技术点图谱

涉及到的技术点有:

  1. WebSocket
    • HTTP
  2. 安全验证
  3. 冲突算法
    • OT
    • CRDT
  4. 本地存储
image-20240623102030273

# 难点描述

模拟问题:我看到你的这个项目里面,有一个项目亮点是实现实时协作编辑功能,具体是怎么实现的呢?

问题分析

  1. 先介绍项目整体的架构
  2. 项目里面涉及到关键节点有哪些?
  3. 针对一些关键的需求是如何设计和处理的?
  4. 设置一些钩子

参考答案

我先说一下我们项目的架构吧,当时我们整个项目采用的是 BFF 架构,有前端服务器和后端服务器。

客户端和前端服务器建立 WebSocket 连接,这样可以保障用户的操作能够及时同步到其他用户的视图中。

除此之外前端服务器的职责还有:

  1. 身份验证:验证客户端发送的 JWT 令牌。
  2. WebSocket 连接管理:处理来自客户端的 WebSocket 连接。
  3. 转发操作:将经过验证的操作转发给后端服务器。

这一块儿工作相当于都是属于我们前端职责范围内的工作。

而后端服务器主要负责:

  1. 请求处理:接收和处理来自前端服务器的操作请求。
  2. 冲突解决:使用相应的算法来解决并发冲突,确保文档一致性。
  3. 数据存储:将最终的编辑结果存储到数据库中。

实际上关于对冲突的处理,早期组内有讨论过究竟前端服务器处理还是后端服务器处理,后来我们参考了飞书以及 Google Docs 的架构模式,最终还是决定交给后端来处理。(体现在做这个项目的时候,是有深度思考的,并且设计是有依据的,增加真实性)

另外像离线编辑,联网后自动同步内容的功能,则用到了本地存储的相关技术,在我们这个项目里面使用的是 IndexedDB.

不知道面试官老师需不需要我把里面的哪一个点展开讲一讲?(钩子🪝 硬控)

# 技术点叙述

# 1. WebSocket 与 HTTP

模拟问题:你刚才说客户端和前端服务器采用的是 WebSocket 连接,你介绍一下什么是 WebSocket 连接呢?和 HTTP 连接有什么区别?

问题分析

  1. 大致介绍一下什么是 WebSocket
  2. 和 HTTP 之间的区别
  3. 紧扣自己的项目,说一下 WebSocket 在项目中的作用
  4. 设置一些钩子

参考答案

WebSocket 是一种全双工通信的协议,服务器端可以主动向客户端推送数据。(简单介绍WebScoket)与传统的 HTTP 不同,WebSocket 连接一旦建立,就会保持打开状态,直到客户端或服务器主动关闭连接。在这个连接期间,客户端和服务器可以随时发送和接收数据,而不需要像 HTTP 那样每次通信都重新建立连接。(和 HTTP 的区别)

在我们的项目里面,客户端和前端服务器之间的连接采用的是 WebSocket 连接,这样可以保障用户的操作能够非常轻松的同步到其他用户的视图中。

而前端服务器和后端服务器之间的连接则是采用的 WebSocket + HTTP 的混合方案,像保存草稿这样的普通操作用 HTTP,如果是实时编辑这样的操作则使用 WebSocket.(紧扣自己的项目,说一下项目中是如何用 WebSocket)

实时协作中最重要的冲突处理是在后端解决的,前端这边主要需要处理像身份验证、WebSocket连接管理、请求转发等操作。

现在想想,冲突处理其实也可以放在前端来做,不过当时我们主要还是参考了飞书和 Google Docs 的架构,决定将冲突处理放到后端服务器来做。

# 2. 冲突算法

模拟问题:你说冲突处理也可以放到前端来做,那么如果真的放到前端来做,你打算怎么来做呢?

问题分析

重点介绍冲突解决涉及到的算法,因为无法用那种算法,无论放到前端还是后端,其实都是用现成的库。

  1. 冲突算法有哪些?各自的特点?
  2. 结合项目讲一下你们选择了哪一种算法?
  3. 放到前端来做的话,你会怎么做?
  4. 放到前端和放到后端,处理上面会带来哪些变化

参考答案

首先肯定是要理解冲突处理的原理。冲突处理常见的两种算法就是 OT 算法和 CRDT 算法。

  1. OT:通过转换并发操作,使它们能够顺序执行,从而解决冲突并保持文档一致性
  2. CRDT:设计特定的数据结构,使得所有操作在不同副本上独立执行时都能自动合并,确保最终状态一致,无需转换。

(简单介绍冲突算法有哪些,各自的特点)

当时这个项目后端语言用的 Java,他们找的是 Java 生态里面的 Collab 这个库,这个库是一个用于实时协作编辑的 Java 库,使用的就是 OT 算法来解决并发冲突。(结合项目阐述项目里面具体是如何做的)

而我下来查了一下,JS 生态中其实也有实现了 OT 算法的库,例如 ShareDB、ot.js. 这也是为什么我说放在前端来处理也可以。

相比放在后端服务器,如果交由前端服务器来处理的话,能够提供更好的实时性,并且减少后端的负载。(如果放到前端,相比放到后端会有什么样的变化)不过当时项目 leader 还是决定稳妥起见,采用像飞书以及 Google Docs 这些知名项目的设计模式,将冲突处理放到后端来处理。

前端这一块儿把身份验证、离线存储、请求转发、日志记录这些功能做好就行了。(钩子🪝)

# 3. 安全验证与 JWT

模拟问题:那么在身份验证这一块儿,你是怎么做的呢?

问题分析

  1. 罗列常见的身份验证的方式
  2. 结合我们自己的项目说一下选择的是哪一种方式
  3. 设置下一个钩子

参考答案

身份验证这一块儿的方法有很多,像 OAuth、JWT、SSO,这些都是常见的身份验证的方式。(罗列常见的方式)

我们当时采用的是 JWT. 首先用户通过用户名和密码登录,服务器验证用户登录信息,如果验证通过,前端服务器会生成一个 JWT 给客户端,客户端将这个 JWT 做本地存储,存储这一块儿我选择的是存到 localstorage.(这句话是后面的一个铺垫)

之后每次客户端向服务器发送请求时,会将 localstorage 里面的 JWT 附加在请求头中,前端服务器接收到请求后,会去验证 JWT 的有效性,包括签名是否正确、令牌是否过期等。

其实早期我在做离线存储功能的时候,也是用的 localstorage,不过在后面换成了 IndexedDB. 一开始用 IndexedDB 还不是很习惯,也是通过这个项目,对 IndexedDB 的使用也更加熟悉了。(钩子🪝)

# 4. 本地存储

模拟问题:那你说一下为什么你会从一开始 localstorage 切换到 IndexedDB 呢?

问题分析

  1. IndexedDB 相较于 localstorage 有什么特点?
  2. 对项目亮点做最后的总结

参考答案

一开始使用 localstorage 是因为我对这个东西比较熟悉,一般大家都习惯于用自己熟悉的东西来做开发。

但是文档离线存储功能,要存储的是用户编辑的文档内容,这个内容就不像之前存储 JWT 那样只是一小段字符串,而是一大段内容,因此后面我就觉得用 localstorage 不太合适了。localStorage 的容量限制和它对数据结构的支持不足,使得它不太适合用于存储大量和复杂的文档内容。

之后我查了一下客户端常见的本地存储的几种方式,认为 IndexedDB 是比较合适的。IndexedDB 的容量远大于 localStorage,可以存储几百 MB 甚至更多的数据,适合存储大量数据和复杂数据结构。另外相较于 localstorage 的同步操作,IndexedDB 支持异步操作,不会阻塞主线程,性能更好,特别是在处理大量数据时。所以最终我选择了用 IndexedDB 来完成文档离线存储功能。

(阐述 IndexedDB 的优点,为什么选择了 IndexedDB)

总之这个项目里面的实时协作功能这一块儿,我作为前端负责的就是:

  1. 身份验证
  2. WebSocket 连接管理
  3. 转发请求
  4. 文档离线存储

不过后面有机会的话,我还是打算自己尝试写一个 demo,把冲突算法放在前端服务器来进行处理,也算是我自己对这一块儿的一个尝试和探索。不知道关于这一块儿,面试官老师您还有什么更好的建议不?

(完美收官)


-EOF-

Theme by Vdoing | Copyright © 2021-2024 蜀ICP备2024068710号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式