腾讯ieg_041119后端面经

24 年 11 月 19 日 星期二 (已编辑)
3133 字
16 分钟

准备了比较久 因为准备八股和算法 甚至实验报告都不写 但最终结果一言难尽...
没事 作为一段宝贵经历吧 说不定是距离腾讯最近的一次(

自我介绍

面试官好 我叫xx 2022级szu软工 面试后端开发实习。
说了一下校园经历(两个省奖)。
说了一下项目,肺音听诊器后台项目,通过goeasy实现医生和病人聊天 java spring。
提到了后端数据库有mysql和mongodb,用到了redis 包括缓存邮箱验证码、接口防刷(当时没有意识到说这个的严重性)。
说了一下实习,参与了量化数据的可视化后台开发,基于Fastapi,数据库有mysql和clickhouse 其次还有设计量化因子发布测试的cicd流程 减少认为干预(当时也没有意识到这句话的严重性)。
说了一下技术栈java spring,包括基本原理比如AOPIOCDI等,python的web框架:flask fastapi等,还有朋友提醒的go 当时有说关于养鹅的go后台项目 和一个关于rtsp的数据处理接口 还强调了说熟悉mysql的事务 索引日志,redis的基本数据结构原理和应用

问题

你的项目是如何实现限制访问的

讲了一下为啥要限制访问(因为goeasy短时间内有大量访问就要收费),然后讲实现。
拦截器获取访问者的ip和要访问的方法,然后看redis中有没有对应的数据,如果没有,就把ip+方法名存入redis,并加上过期时间(这个时间很短),如果有,就说明在过期时间内这个ip访问了这个接口,就不让访问。

没有理解 再重述一下

我又讲了一遍,加上了自定义注解accessLimited,然后在拦截器判断访问者访问的方法有没有accessLimited这个注解,如果有,就按照刚刚说的方法进行判断。

你的过期时间是怎么加的,具体是哪个api

就是什么set吧,把数据和过期时间放进去就好了(当时没理解为什么问这个问题,但的确忘了具体是哪个api)

你这个方法似乎有点简单啊 只是用redis缓存标记一下ip和方法 然后不让访问吗?

愣了一下,然后我说确实是这样的

那为什么你不用内存来存呢,你服务有几个副本(回答一个),一个副本那不刚好可以用内存,讲一下为啥还用redis

又楞了,然后编理由说是因为存邮件验证码用的redis,然后全局用redis方便一些...
然后我又反问,你说的内存是直接用hashmap存吗? 回答说都可以只是没必要用redis

有了解过xxx这种比较流行的限制访问的解决方案吗?

当时xxx说的应该是英文,他声音太小了,也可能是我没有了解过那个名词所以没有对应的内容 我反问说:你说的是jwt吗?(现在看这是一个非常蠢的反问 怎么可能是jwt 但当时发音有点像)

他回答说不是 给我科普说限制访问的解决方案有很多 我的这个不能算是可以合格的方案 然后就下一个问题了

后面了解到 我使用的应该算计数器 也应该说是一个解决方案的吧 但我没说清楚 让他以为就是一个简单的缓存 实际上是以ip+method为key 存放的是一个数字 每次这个接口请求 取出数字 如果值大于了阈值 就要拦截 仍然是隔一段时间刷新 回头总结一下别的办法吧(

工程调试

经常使用unix系统吗 你有部署过什么项目在unix系统

我说独立部署过前端项目 通过nginx 后端的java也部署过 然后实习的时候一直是用vscode连接公司服务器

项目出问题了通过什么解决

又一次愣住 这是什么问题 我尝试性回答说 如果是本地就看终端报错 生产环境就看日志

既然用过nginx 那nginx的日志文件存在哪里 或者项目出错了你用过别的什么办法检查项目状态

绷不住了 这又是啥问题 我凭记忆说是根目录var/log/nginx(刚刚看了一下 蒙对了)

你的后端项目如果出问题了 你会怎么检查

说到这里 我还没理解他问这一系列问题的原因 然后就继续尝试回答说看日志

假如说你同事前端请求你的接口 得到的东西不是想要的 你要怎么检查问题

好像get到他的意思了(实际上没有) 回答说 先看他状态码(突然打断说状态码没问题 但内容不一样) 然后我说那应该就是我后端逻辑有问题 就在本地复现情景 然后debug修复 再上传打包覆盖原来的服务

生产环境是可以这样的吗 你开发过多少项目?

我实话实说 之前一直是这样 因为bug实际上都是我们自己人发现的 并没有像很正式的服务那样稍微停一会就有人发现服务不可用(听到这里他好像妥协了 不在追问这些问题 并跟我说生产环境是不能这样的 面试完之后我朋友跟我说这个问题比较复杂 我们都没条件遇到)

CICD流程

(没有想到面试会问这个 的确疏忽了)
首先介绍了一下做的事情(写了测试脚本 包括空值判断的和是否lookahead等等) 其次说了关于yaml文件怎么写 介绍了gitlab-runner
但感觉当时说的时候肯定没有那么清晰 被问到就巨慌 没想到

具体介绍一下CD做了什么

愣住了 当时知道CDcontinue development,但实际上是持续部署 不是持续开发 之后我说我们这个需求似乎没有CD...
然后他也愣了一下 我仔细补充说 这个项目只是自动化流程 没有开发 重点是因子生成 而不是代码维护啥的 然后他就没有继续问了...
(不管怎么说 把这个CICD写在简历上完全是一个败笔 自己觉得懂了全部 实际上具体做了什么都说不清楚 写在简历上 非常自信 仅仅因为自己真的是做了 但真的做了又能怎么样 不懂原理 甚至很难说清楚做了什么 跟没做好像没什么区别...)

go项目

cicd之后 面试官问我还没有做什么有挑战性的(说这句话的时候 我就感觉凉了)
我说我之前参与过开发一个go项目(养鹅 AI+养殖) 负责了一些增删改查的接口 然后还改了一个关于jwt的bug 其次还有一个独立的关于处理RTSP视频流的接口服务

详细说说这个关于jwt的bug是什么 怎么修复的

这个项目有些数据是需要token保护的 工作人员和设备都需要访问到这些数据 工作人员可以通过登录来获取数据 但设备没有登录操作就不能主动获取数据 然后负责人就在前端主动在请求接口的时候写死用testToken 这肯定不是个办法
我通过扩展token的负荷 把设备的mac地址作为负荷的一部分 当一个设备请求时 检查mac地址在不在数据库 在的话就直接放行

再讲讲RTSP的(看得出来回答的不太行)

用的是一个叫vdk的库 通过定位第一个关键帧再计时截取固定长度的视频流然后上传到云 用的是腾讯云的oss

写题

看得出来这个小项目他也不太感兴趣 还问我要不要用go写个题 我说不太行 还是用cpp

题目不能算是算法题 具体是:截取http的内容 把请求的方法、请求路径 版本 请求体等等内容都提取出来

最开始用的cpp 我想引入stringstream但老是报错 但是以为是编译器有问题 之后发现stringstream的库名叫sstream...

然后我问能不能换语言(python) 他说可以
用python很快写出来了 直接split很好写

python
# http内容
# data中 key和value 是以': '分隔
s = """xxxxx""";

s_list = s.split('\n')

info = s_list.split(' ')
url = info[0]
method = info[1]
version = info[1]
# ...

# 用字典存data
data = {}
for i in range(len(s_list)):
    # 去掉info行
    if (i == 0):
        continue
    # 修改了这里的': '为':'
    key_val = data.split(': ')
    data[key_val[0]] = key_val[1]

但是 还是有些问题 他看了一会我的代码 把原来的xx.split(': ') 改成了xx.split(':') 然后问我 你看你代码有没有bug
我没注意数据 只关注到他把:改成了: 我想应该还行吧 只不过http的请求头的value会有前置的一个空格 后面用trim之类的api去掉空格就行了
然后他让我看一下第十行 内容变成是xxx:xxx xxx hh:mm:ss 我发现了问题 他改了代码 也改了数据格式 把key和value的分隔从:改成了: 这就导致了:分隔会有很多个元素 因为value也可能有冒号

然后他让我把data[key_val[0]] = key_val[1]修改一下 代码正确
当时脑袋抽了 想直接删掉这行 用find找到第一个冒号 然后把第一个冒号之前的作为key 之后的所有内容作为value
思路是对的 但改动很大 听了我的思路 他又加了一个冒号 代码变成了data[key_val[0]] = key_val[1:]
哎不得不说 我还得练 这里明明加个切片就好了(面到这里很想哭...)

之后他不讲我的代码了 又说起了题 说我数据并没有写完整 数据除了上面的请求头和key_value 还有一些东西 题目描述的是汉字我就直接忽略了 但实际上是要考虑的
然后就是题目要求写的是一个接口 而我是以一个脚本的形式写的 没有封装 内容也是直接输出(当时为什么会这样呢 是因为我想着功能实现了就ok 剩下的都是小事情 没想到这实际上有坑 功能谁不会写 关键还是细节...)

反问

评价
说是做的功能比较简单 还需要努力
作为学生 接触到的生产环境可能不是非常复杂 为什么不多问理论而全是实践方面的 比如刚刚的生产环境问题排查

忘记他怎么说的了 他说八股谁都会 没啥参考性(很受伤 好几天只专注一件事 最后被这样几句话轻描淡写带过了)
什么时候出结果
好像说是一周内 要看别的同学

总结

本来不想写面经的 感觉面了也什么实际收获 自我介绍的时候都那么明显的提示了说问问mysql和redis
但朋友说最好总结一下 不然面了和没面一样

  • 讲真的感觉面试官声音有点小 有些内容有点听不清 但也可能是认知问题 有些东西没听过 找不到对应的词 所以自动忽略
  • 本来很担心算法 怕紧张写不出来 没想到没考算法
  • 简历问题很大 需要大改 cicd要去掉 把八股写的再激进一些 还要找更加有技术含量的项目
  • 平常多锻炼身体 面试前一天有点发烧 难绷的
  • 还是要多认真些 有了这次经验 下次这种重点在细节而非功能的题就有防备了

没事的 没有过也问题不大 先补作业吧(

文章标题:腾讯ieg_041119后端面经

文章作者:Blank

文章链接:https://blankxiao.github.io/posts/%E9%9D%A2%E7%BB%8F/%E8%85%BE%E8%AE%AFieg_041119[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。