chris3will 发表于 2023-3-28 10:35

美团二面 记宝贵的大厂深挖项目经历体验

本帖最后由 chris3will 于 2023-3-28 10:55 编辑

美团二面 复盘
2023年3月27日

## 说在前面

美团二面是我开启暑期实习档口之后,腾讯二面,阿里二面之后的第三家大厂,感谢美团给我这个机会。这次机会我也深刻感受到了看到的那么多面经中,深挖项目到底是一个什么概念了。自己的基本情况就是双9的科班硕士。

明明很多技术细节,技术特点,我们平时即使是部署的项目也算是维护一个可用性就够了,高并发高性能高可用,除了在商用条件下,我们平时也没这个资金去购买服务器与冗余节点来进行测试不是吗?真的就是想和这股子对技术好奇与应用的劲头,想去找一份实习。

## 正题
总体时间包括反问在内大概持续了1h。

面试官介绍,部门介绍,确认工作地点
自我介绍

问有没有Java的开发经验,引出一个信息平台项目,特点是前后端分离,前端为小程序,后端为Java的SpringBoot框架。

### 深挖简历
*有没有用Java写过项目?*

*你在项目里的角色是怎么样的?* 回答自己负责的职责和开发的模块

*这是一个什么样的项目?课程项目吗?*

*开发完之后有多少人使用?*

人家为什么要用你这个自发开发的东西? 我们想尝试解决校园的一些痛点

*提供的具体功能是什么?*

*你负责的模块是怎么设计,能具体讲一下吗?*
这部分答的很慌,逻辑思路有点不清晰,需要着重训练。

*你们的模块是怎么考虑安全性的?如果在前端浏览框注入一些攻击的脚本来攻击数据库,你们有做防护吗? *
回答了一些包括访问频率的统计,SQL预编译确保sql访问合法

*你们有实际应用吗?*
回答是没有,我们当时还在确保基础功能的bug是ok的

*你可以告诉我你想实际怎么实现吗?你可以假设一下你要怎么实现,你自己也说你可以通过统计的方式判断客户端行为是否存在危险操作,你要怎么设计?*
答的是统一几个用户在多少秒内是否有重复点击行为,或有高频访问数据库的行为。用MySQL加一个字段来标记用户的上一次访问截止时间这样

*MySQL记录的话数据库分分钟爆炸,还能有什么解决方案? *
回答的是引入Redis,为每个用户设置一个key,然后有一个自动过期时间,只有这个key不存在与数据库,用户的请求才能真正发送到后台。

*十秒钟太长了,如果真实用户来说,那他发现10s的空闲间隔,下次就不会使用了。其实一两秒钟释放都不是一个特别好的方案。假设一个页面,10请求来请求数据,那这样你是向后台请求几份数据?*

自己提了个消息队列,发现不对劲,场景不配套,

*你关于文章这个评论的表是怎么做的?*
这部分其实应该再细看的,我们这边来说是基于一个text的实体,通过type来区分其是一个comment或者一个文章。如果是comment类,则其targetid和roottype都会被纳入考虑。可以说只要字数限制没有超过前端输入的限制,在后台都是存的最长字符串。

*你还记得当时的语句时怎么写的吗?大概讲一下是一个什么样的SQL?*
这部分当时懵逼了,现在复习重温。
我们有几个相关的SQL,其在Mybatis中的resultMap都是textList,这个是我们用来对应Java属性以及表字段的映射。

id = queryTextList时,
```sql
SELECT * FROM text_file ORDER BY create_time DESC
```
id= queryTextListByType时,
```sql
SELECT * FROM text_file WHERE text_type=#{textType} ORDER BY create_time DESC
```
分页请求时,
```sql
         SELECT *
      FROM text_file
      <if test="maxIndex != -1 or type != -1">WHERE </if>
      <if test="maxIndex != -1"> text_id <=#{maxIndex}</if>
      <if test="maxIndex != -1 and type != -1">and </if>
      <if test=" type != -1">text_type = #{type} </if>
      ORDER BY create_time DESC
      LIMIT #{startIndex},#{count}
```

根据具体类型请求时,
```sql
         SELECT *
      FROM text_file
      WHERE question_id=#{questionId}
      <if test="maxIndex != -1 or type != -1">and </if>
      <if test="maxIndex != -1"> text_id <=#{maxIndex}</if>
      <if test="maxIndex != -1 and type != -1">and </if>
      <if test=" type != -1">text_type = #{type} </if>
      ORDER BY create_time DESC
      LIMIT #{startIndex},#{count}
```

回答的时候具体还是讲明白了limit的分页部分,但是where条件在第一时间没有讲明白。

*举个例子,比如说现在一口气你们现在做推广,一口气好多同学一口气登上来了,然后你现在可能就会碰到什么问题,你能想到吗?有1000个人登录了首页。*

我回答,对数据库性能进行优化,对图片进行oss优化,添加负载均衡,添加redis缓存保存热点数据。

*你能具体说一下怎么加Redis吗?*

*Redis你打算缓存哪些数据?*

*Redis里的数据是怎么一个更新的?怎么写进去的?顺序是怎样的? 它肯定有一个动作去触发的,怎么触发的?*
*
刚开始的时候,Redis内容为空,如果两个用户同时初次访问触发了Redis更新行为,会不会有什么问题?*

*你们之前考虑过热点问题吗?还是你现在是临时思考的答案?*

回答可以用分布式锁 setnx或者加一些lock,谁先来的把锁请求到,然后就可以触发更新行为了,后来的不会触发这个热点更新。

*回到数据库表设计,你在文章的哪些字段上加了索引?*
我们只在text_id上加了主键索引

*如果你要到校园里推广,你需要怎么做索引?怎么样设计索引?*
当时这个也没答好,现在回看的话,这个表中的字段还是很多的。
text_id, user_id, question_id, text_title, text_type, like_count, comment_count, collect_count, text_cotent, message_content, state_flag, text_pic_num, text_pic_url, create_time, update_time。
这个考虑到我们的展示机制,只考虑过按照创建时间来展示文章,所以真的没考虑怎么设计会更合适,索引应该考虑建立之后使得查询条目区分度大,没准可以加一个type,当时在想无论是在点赞数或者评论数上做索引,都会导致B+树变动频繁,影响系统开销。
我就多说了一点,强调避免回表的发生,多建立联合索引。

*查文章都是看内容,肯定不能把内容放到联合索引里*

*除了减少回表,建索引这一部分还需要做一个怎么样的设计和考虑?我说的已经够详细了,还没提到怎么优化表结构。你说说索引怎么设计?*

我回答,表数据比较少的时候先不建立,多的时候我们就尝试去找到一个区分度大的字段来做索引,或者找一些排序的属性,结合orderby来查

*刚听到说你们测试过,你们测试下来不同索引的效果怎么样?你们的测试方案是怎么样的?每种方案用了不同的索引吗?*

*你了解你们信息平台的整体设计吗?*

*提供了哪些服务?*
这个说法很偏业务,我当时没反应过来

*就说你的后端服务,肯定是对外提供服务的,例如HTTP服务,比如文章本身就是一个服务,你们使用MVC做的吗?*

*你们有哪些Controller?*
没说全,说了一部分。
复盘之后,有各大板块本身的controller,还有osscontroller,filecontroller,textcontroller,websocketcontroller,logincontroller等专用

*设计的模块有哪些?哪些Service?*

*模块之间有平行的吗?还是有哪些公共的模块?*

*你的文章可以做检索吗?*
答用like做的标题模糊查询

*如果太慢的话,打算怎么优化?*
答的是用es等插件

*用过,学习过es吗?*

*你知道它文本检索在底层的一个实现方式是怎么样的吗?比如说文本关键字的检索*
答这个就不知道了

*es的整体结构有了解过吗?*

*你们用springboot开发,有读过spring源码么?讲一讲那些细节的设计?或者有没有什么重要的接口?不要泛泛而谈。*

说了一个三级缓存,postprocessor这些

*为什么设计三级缓存,或者你能说说,不设计三级缓存的话,会出现什么问题?所以一定要用这个方式去进行设计?*

*你提到了注解,你知道spring是怎么理解方法或类上面打了一些注解的吗?*

*如果让你写一个模块,去分析每个类上的或者方法上面打的注解,包括注解的属性,你要怎么实现?你知道要去怎么分析吗?*

*你提到Java自己写过一些多线程,有没有去自己尝试过哪些多线程的类库的性能差异?指的是多线程竞争同一个资源。有了解过原子类的那些底层实现吗?*

*防止指令重排序是在什么阶段做的? 编译的核心流程阶段是什么?*
复盘搜索:Java中的指令重排序有两次,第一次发生在将字节码编译成机器码的阶段,第二次发生在CPU执行的时候,也会适当对指令进行重排。
对于编译的流程,之前这一串面试给我干懵了,答的也不是特别好。说说java到字节码,然后交给jvm处理运行。

*你做过哪些Java方面的技术学习?*
答多线程,以及一些消息队列的学习

*你消息队列做过怎么样的实践?用消息队列去处理过一些什么样的问题吗?或者怎么玩一玩消息队列?*
答保证消息的有序性以及消息不丢失

*不仅是看文章,你有没有读过消息中间件的源码?有没有发现一些比较亮眼的设计?*

说了一个小demo

*你验证的场景是什么?你想测试的场景是什么?你要研究什么东西?*

*你做项目的时候,或者其他的时候,有没有什么技术难题?碰到过什么困难?怎么解决与客服的?*

*抓包是什么抓包的?*
Wireshark,抓的一些广播风暴

*你当时抓包怎么分析问题的还记得吗?*

## 反问
美团入职会有新人培训吗?
自建仓库管理代码吗?
想进行技术提升有什么建议吗?
消息队列有什么有意思的实验或者工作是自己可以验证学习的吗?

## 总结
这次大厂二面受益匪浅,自己还是需要继续学习,多见识,多练。
之前预想过,可能是八股加强,或者会有手撕,或者还要有智力题,但这次主要给人的体验就是一个项目加实战能力,要求应试者入职即能应对工业场景。

技术都不是孤立的,各个组件,各种知识总能联系,或者串在一起,作为一个还没实习经历想找一份实习来进行实际锻炼的人来说,还是要下很多功夫。

px307 发表于 2023-3-28 10:55

楼主厉害&#128077;

onpure 发表于 2023-3-28 11:33

感谢楼主,楼主厉害,学习一下。

Adolphus 发表于 2023-3-28 12:11

一个字 牛!

W7mLCytr 发表于 2023-3-28 12:20

看起来很牛,看了内容也没什么:lol

zhinian668 发表于 2023-3-28 12:29

果然是大佬,我在连个面试的机会都没有

bashen9 发表于 2023-3-28 13:13

感谢楼主 我觉得八股文还是很重要的

PAD 发表于 2023-3-28 13:26

楼主厉害 感谢楼主

quakewg 发表于 2023-3-28 13:36

不要说需要能在这样的场景中脱颖而出了,能顺利完成楼主介绍的完整流程,就已经是很不容易的事情

Js_Aaron 发表于 2023-3-28 13:52

可以内推我进美团不,我也想进大厂
页: [1] 2
查看完整版本: 美团二面 记宝贵的大厂深挖项目经历体验