美团核心本地商业-美团平台 一面 没凉 第二天二面

161 阅读9分钟
  1. 自我介绍
  2. 问项目:地图具体做的什么,怎么实现的;webRTC的token具体指什么,怎么传的;token加密了吗?和后台打交道吗?前后端联调过程中API规范谁定?地图上有多少个节点?
  3. 性能优化怎么做的,怎么保证地图不卡顿? 定义无限滚动行为以及图片的懒加载(使用占位图片)。
  4. 我理解你这种方式是控制请求数量上进行优化对吧?那渲染方面呢? 使用了vue-virtual-scroller,控制视口范围内的节点渲染。
  5. 你刚刚提到了使用了ng的缓存代理,我们平时常用的缓存策略?具体介绍这四个字段?资源没修改会返回什么状态码? 在web开发中,浏览器缓存机制分为协商缓存(也称为对比缓存)和强制缓存(也称为强缓存)。这两种缓存机制的目的是为了提高网页加载速度和减少服务器负载。下面是这两种缓存机制的详细流程:

    强制缓存(强缓存)

浏览器请求资源

-   浏览器首先检查本地缓存,查看是否有该资源的缓存副本。

检查缓存有效期

-   浏览器查看资源的HTTP响应头中的

    ```
    Cache-Control
    ``````
    Expires
    ```

    字段,判断资源是否在有效期内。

max-age:指定资源在缓存中的最大存活时间(以秒为单位)。例如,max-age=3600 表示资源可以被缓存 1 小时。 no-cache:表示不使用强制缓存,每次请求都需要向服务器进行验证,确认资源是否有更新。这并不意味着不缓存,而是要求在使用缓存前必须与服务器协商。 no-store:指示请求和响应都不应被缓存。每次都会向服务器请求数据,适用于敏感信息的传输。 public:表示响应可被所有用户缓存,即使是身份验证的用户也可以缓存该响应。 private:表示响应只能被单个用户缓存,不能被共享缓存(如CDN)缓存。

使用缓存或重新请求

-   如果资源在有效期内,浏览器直接使用本地缓存副本,不会向服务器发送请求。
-   如果资源已过期,浏览器会向服务器发送请求,进入协商缓存流程。

协商缓存(对比缓存)

浏览器请求资源

-   浏览器向服务器发送请求,请求头中包含资源的缓存信息,如`If-Modified-Since``If-None-Match`

服务器验证缓存

-   服务器检查请求头中的缓存信息,与服务器上的资源进行对比:

    -   `If-Modified-Since`:与资源的`Last-Modified`时间对比,判断资源是否在指定时间后被修改。
    -   `If-None-Match`:与资源的`ETag`值对比,判断资源内容是否发生变化。

返回响应

  • 如果资源未被修改(即缓存仍然有效),服务器返回304状态码(Not Modified),浏览器继续使用本地缓存副本。
  • 如果资源已被修改,服务器返回200状态码,并附带新的资源内容和新的缓存信息(如Cache-ControlExpiresLast-ModifiedETag等)。
  1. 一些常规计网问题,包括TCP三次握手为什么两次不行?TCP和UDP区别,什么协议使用的UDP?项目里提到了并发的请求,HTTP1.0和2.0在处理并发上有什么区别?详细介绍一下1.0、1.1和2.0;
  • 1.0:短连接,可以用connection字段设置成长连接;
  • HTTP1.1:默认支持长连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,并且客户端可以不同等待响应到来就可以发下一个请求,但服务端要按顺序返回响应;引入了更多的缓存控制策略,如If-Unmodified-Since, If-Match, If-None-Match等缓存头来控制缓存策略;引入range,允许值请求资源某个部分;引入了更多请求方式,如put、delete;
  • HTTP2.0引入了一些新特性,如多路复用,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了”队头堵塞”;二进制分帧,帧是HTTP2通信中最小单位信息 HTTP/2 采用二进制格式传输数据,而非 HTTP 1.x的文本格式,解析起来更高效;每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装,这也是多路复用同时发送数据的实现条件;首部压缩HTTP/2在客户端和服务器端使用首部表来跟踪和存储之前发送的键值对,对于相同的数据,不再通过每次请求和响应发送,首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新;HTTP2引入服务器推送,允许服务端推送资源给客户端,服务器会顺便把一些客户端需要的资源一起推送到客户端,如在响应一个页面请求中,就可以随同页面的其它资源,免得客户端再次创建连接发送请求到服务器端获取,这种方式非常合适加载静态资源。

总体来看,HTTP/1.0在并发处理能力上受到短连接和无状态特性的限制,导致在多个请求交互时性能较差。而HTTP/2.0通过多路复用和其他优化技术,实现了更高效的并发处理,提升了整体的传输速度和用户体验。因此,在需要处理大量并发请求的场景中,HTTP/2.0相较于HTTP/1.0具有明显的优势。 使用UDP的协议:DNS协议,TFTP协议,BOOTP协议(引导协议);

  1. TCP怎么保证可靠性的?

校验和

TCP使用校验和(Checksum)来检测在数据传输过程中是否发生错误。发送方在发送数据时计算校验和,并将其附加到TCP段中。接收方收到数据后,重新计算校验和并与接收到的校验和进行比较。如果两者不匹配,则表示数据可能出现了损坏,接收方会丢弃该数据包并请求重传。

序列号和确认应答

每个TCP段都带有一个序列号,这样接收方可以按照正确的顺序重组数据流。接收方在成功接收数据后,会发送一个确认应答(ACK)回执给发送方,表示已成功接收某个序列号的数据。如果发送方没有在特定时间内收到确认应答,它会认为数据丢失并触发重传机制。

超时重传

为了确保数据传输的可靠性,TCP实现了超时重传机制。如果发送方在设定的超时时间内没有收到确认应答,它会自动重传未确认的数据。这种方式有助于处理网络延迟或丢包问题。

流量控制

TCP通过滑动窗口(Sliding Window)机制来控制数据流量,以防止接收方因处理不过来而导致数据丢失。发送方会根据接收方的缓冲区状态调整发送速率,从而避免网络拥塞和数据丢失。

拥塞控制

TCP还实施了拥塞控制机制,用于管理网络流量,防止过载。当网络负载增加时,TCP会降低发送速率,以避免进一步的丢包和延迟。常见的拥塞控制算法包括慢启动、拥塞避免、快速重传和快速恢复等。

连接管理

TCP是面向连接的协议,在数据传输之前,需要通过三次握手(Three-way Handshake)建立连接,并在完成数据传输后通过四次挥手(Four-way Teardown)安全关闭连接。这种管理确保了连接的可靠性和资源的有效释放。

  1. 死锁产生的条件,怎么避免死锁?

  2. 编译器和解释器有什么区别?

  • 编译器:编译器会一次性将整个源代码翻译成目标机器语言,生成一个可执行文件(如 .exe 文件)。在运行程序时,用户只需执行该可执行文件,无需再次进行编译。例如,C 和 C++ 使用编译器。
  • 解释器:解释器逐行读取源代码,并即时翻译和执行。这意味着每次运行程序时,都会对源代码进行翻译,而不是生成中间的可执行文件。Python 和 Ruby 是典型的解释型语言。

10.问了一些数据结构的内容

11.问了一下自己做的富文本编辑器,是自己实现的吗

12.在created和mounted钩子中发请求有什么区别?

  • created

    • 当 Vue 实例被创建后立即调用,此时组件的数据已经初始化,但 DOM 元素尚未渲染。因为请求数据的操作在模板渲染之前执行,因此一旦数据获取完成,组件就可以直接使用这些数据进行渲染,从而避免了用户在页面上看到空白或不完整的内容。
  • mounted

    • 在组件的 DOM 元素挂载到页面后调用。当你在 mounted 中发起请求时,组件的 HTML 已经生成并显示在用户的浏览器中。如果请求数据耗时较长,那么用户会在页面上看到短暂的闪烁或变更,因为在数据请求完成之前,组件可能会显示初始状态(例如一个加载动画或者空白)。这就是所谓的“闪屏”现象。

    因此,为了避免页面闪屏,通常建议在 created 钩子中发起数据请求,确保在组件渲染前就已经获得所需的数据。这种做法可以提高用户体验,使得页面在加载时显得更加流畅和完整。对比之下,虽然在 mounted 中发起请求也可以工作,但它可能会引入可见的延迟和不必要的闪烁效果。

  1. vue组件通信方式

  2. 操作DOM常见api?

  • 获取元素:document.getElementById,document.getElementByClassName,document.querySelector(All);
  • 创建元素:document.createElement();
  • 修改元素属性:element.setAttrinute()、element.RemoveAttrinute();
  • 修改元素内容:element.innerHTML/element.innerText;
  • 添加、删除元素:parentNode.appendChild/RemoveChild();
  • 事件监听:element.addEventListener();
  1. 工作地点偏好。

  2. 两道算法题。