面试常问问题
项目篇
Faasit项目有什么难点 or 创新点 ?
首先Faasit项目我负责了几个模块,分别有部署模块、运行时模块、AI训练模块
部署模块中我遇到的难点有原生的
Knative
部署非常慢并且有着国内的网络问题,于是我通过kn
的API自己搭建了一套kn
的部署方案方案中的创新点包括:使用base镜像+代码目录映射的方式进行部署,可以加快部署的效率
方案中的难点包括:
k8s
orkn
并不支持像docker
那样的目录映射功能kn
支持持久化卷pvc
,但要求那个卷是只读的,而我们需要可读可写的(因为要上传代码)
运行时模块中遇到的难点包括
durable function
模型的设计,由于不像Azure
一样有一个事件机制,因此只能手动模拟一个调用堆栈
你在项目中用到了哪些设计模式
工厂方法
- 不同的运行时行为不同,我定义了一个
create_handler
方法创建对应平台的运行时
- 不同的运行时行为不同,我定义了一个
生成器模式
- 设计
workflow
的时候其需要指定较多的函数,使用了一个builder
实现workflow
的构建 - 实现函数状态类的时候,有一个
DurableFunctionState
类以及ScopedClient
类,以此做不同类型的状态存储
- 设计
单例模式
适配器模式
- 将一个函数适配到多个平台使用了
后端篇
有用户说他登录不上某个网页了,你该怎么排查
可能的原因
- 服务器出口带宽不够用。
- 服务器过载太大忙不过来,CPU或内存消耗完了
- 代码没写好,MySQL语句没有优化
- 数据库瓶颈,数据库太大了
排查方法
- 自己先打开一下,看看是服务端的问题还是客户端的问题
- 使用浏览器的调试功能查看是哪个数据加载的太慢
- 看一下硬件资源(带宽,CPU和内存)
- 如果硬件资源消耗都不高,看一下日志
Redis是如何加锁的
Redis的SET命令有个NX参数可以实现”当key不存在的时候才插入”,所以可以用它来实现分布式锁
- 如果
key
不存在,则显示插入成功,可以用来表示加锁成功 - 如果
key
存在,则显示插入失败,可以用来表示加锁失败
- 如果
Redis实现分布式锁时,对于加锁操作,需要满足3个条件
- 加锁包括了读取锁变量、检测锁变量和设置锁变量的操作,因此他们必须是原子的,可以使用SET命令带上NX选项实现加锁
- 锁变量需要设置过期时间,以免客户端拿到锁后发生异常
- 锁变量的值需要能够区分来自不同客户端的加锁操作,使用SET命令设置锁变量值时,每个客户端设置的值是一个唯一值
https
解决的HTTP的问题
- 信息加密:交互信息无法被窃取
- 校验机制:无法篡改通信内容,篡改了就无法显示了
- 身份证书:验证访问的对象是不是真的对象
能不能写一个CPU消耗为100%的程序,50%呢
- 100%运行的只要
while(1)
就好了 - 50%的可以设置忙等时间和休息时间相等,忙等时间就可以写不断地获取时间,计算忙等的时间够不够了
你去办卡接入了一个网络,你怎么判断你连接到的网络是不是安全的
检查网络配置
- 使用加密协议,确保无限网络使用了加密协议
- 检查路由器确保更改了默认的用户名和密码
验证证书和加密
- https
- DNS
你连接到一个网络之后打开淘宝之类的APP,使用HTTP协议输入用户名和密码,会导致密码泄露吗
- 不安全,因为http协议是明文传输,这意味着数据在传输过程中可以被拦截和读取
如果是在登录态访问淘宝,会有密码泄露吗?
会话劫持
- 可以获取会话令牌
- 中间人攻击
重放攻击
使用了https,有可能发生密码泄露吗?
- 会的,中间服务器伪造证书,但是会提示用户是否信任中间证书,怕危险就不要点,本质上是不会泄露的。
数据库的范式有哪些
第一范式——无重复列
- 每一列都是不可分割的基本数据项
第二范式——属性完全依赖于主键(消除部分子函数依赖)
- 满足第一范式的基础上,每一个非主属性完全函数依赖于某个候选键
- 例如如果有属性学号、课程名称、成绩、学分的属性,那就不满足,因为学分不完全依赖于学号
第三范式——属性不依赖于其他非主属性(消除传递依赖)
- 每个非主属性都不传递依赖于候选键
BCNF范式
- 数据库表中的每个属性都不传递依赖于候选键
第四范式
- 非主属性不应该有多值
第五范式
- 表必须可以分解为较小的表
面试常问问题
http://example.com/2024/05/28/interview/