后端开发二面面经
完整信息
本篇目录
面试时长约45分钟,主要围绕简历项目展开,追问比较细。本轮没有手撕算法。
自我介绍与项目背景
你们这个平台的团队大概有多少人?你们项目有多少人?
简单介绍一下 Vue 3、TypeScript、Go、Gin、MySQL、Kafka、Argo、Kubernetes,这些东西在你开发的过程中分别承担什么责任?
接口性能优化
我看这个接口从12.4秒降到了650毫秒。这个接口一开始就是你负责的,还是你进来实习之后接手的?
之前这个接口需要12秒,性能瓶颈在什么地方?
这个瓶颈是怎么定位到的?
所以是通过接口的响应和日志,判断到底哪个环节出了问题,是吗?
定位之后,怎么确定这个方案的?异步是怎么做的,简单介绍一下。
用户批量导入之后,第一步怎么做父子任务拆分?
你们批量导入的都是一些文件吗?
拆分子任务,是根据上传文件的类型,以及各个数据拆的吗?
我上传了10个文件,就会创建10个子任务,是这个意思吗?
这10个子任务存储在哪儿?
你们 MySQL 存的是什么数据?
假设上传了10个文件,MySQL 里面会存什么样的数据?大概有几条?
投递的时候,异步是通过什么方式做的?通过 Kafka 做异步,是吗?
假设任务发生异常,或者项目重启导致任务中断了,第一怎么识别,第二怎么继续执行这个任务?
我指的是从 Kafka 里面拿到一条消息,需要去处理它。无论调用大模型、算法还是业务库,假设中间出现未知异常,后面怎么重新消费这条数据、继续处理?
假设拿到一条消息,处理时出现了“1除以0”的异常,这条任务就终止了。那 Kafka 里面的消息怎么处理?后续还能不能正常处理这条消息?
Kafka 的消息已经被你的服务端拿到了,它怎么判断这条消息需要重新消费?
Kafka 里面有 Offset 的概念,你知道吗?
你说“返回 Offset”,返回的是偏移量吗?你对接 Kafka 的时候,怎么告诉它已经完成了,还是没完成?
假设后端有5个服务,A拿到1,B拿到2,后面是3、4、5。5先完成,返回了一个5,但是1、2、3、4都失败了,还能拿到1、2、3、4吗?
Offset 已经是5了,前面的任务因为异常或者重启中断,怎么再拿到它们继续执行?
无论是异常还是项目重启,怎么识别哪些任务需要重新执行?能不能知道它执行到了哪一步,前面的步骤不用再执行?有没有这样的动作?
你刚才提到了 Partition,那我反问一下,刚才那个问题成立吗?假设3个或者5个服务端服务去消费一个 Partition,这样可以吗?
是因为要保证有序,所以才由一个消费者去消费一个 Partition 吗?
消费者拉取消息的时候,也是通过 Offset,取这个 Offset 或者时间戳之后的消息,对吧?
你提到了重复投递,这块怎么做幂等?
继续追问接口优化的实际效果
用户批量导入同一批数据,现在这650毫秒主要消耗在哪里?这边有做过评估吗?
我理解异步之后,就是上传 OSS 加入库的时间,是这样优化的吗?相当于把链路切了一半,先存起来,后面异步处理?
Redis 分布式锁、锁粒度与业务幂等
你写了用 Redis 分布式锁控制任务抢占,锁粒度、过期时间,还有异常释放,分别怎么设计?
你说避免任务“创建多次”,具体指怎么创建多次?
刚才已经说做了幂等,那如果不加这把锁,会有什么影响?具体会产生什么问题?
这个锁到底锁的是哪块业务,是写库还是任务执行?
是任务已经进入 MySQL,然后取出来异步执行的时候,在那个环节加锁吗?
你说在 MySQL 之前做隔离,具体隔离什么?锁粒度到底是什么,锁的是什么内容?
如果锁的是唯一索引,它在什么情况下会调用两次?你是防并发的,那什么情况下可能出现这个并发?
刚才聊到,Redis 锁加在拆完任务、进入 MySQL 之前。所以这是用户在平台上传文件后触发的动作,是这个意思吗?
我作为用户上传一个文件,这个唯一锁是从哪来的?
假设我先上传一个文件,还没等返回就关掉窗口,然后又上传同一个文件,这时候唯一键是相同的,还是不同的?
假设有一个按钮,点击后弹框上传文件。我点了两次,上传同一个文件,在你们这里会创建几个任务?
你怎么识别上传的是同一个文件?
假设我修改了文件里面的几个字,也能识别到吗?是通过哈希吗?
我看你做了专业术语和 Query 重复问题的优化,为什么选择向量检索、BM25 和 Rerank 这套方案?
BM25 其实就是关键词检索,对吧?向量检索和 BM25 分别借助了什么库?
当时的技术选型你参与了吗?对比了什么方案,向量库和关键词检索为什么这样选?
Milvus 用的是云服务,还是自己部署?
现在向量库大概存了多少数据?往里面导入了多少数据,这个了解吗?
发现纯向量检索召回率较低后,引入关键词检索,为什么选择 MongoDB,没有选择类似 Elasticsearch 的方式?
你把文件存进 MongoDB,具体怎么存?
假设存的是图片、视频、网页等非文本数据,BM25 怎么把它们查出来?
你说通过标签,也就是图片、视频的元数据信息,那 Milvus 能实现吗?除了向量,它也可以存元数据,做类似 MySQL 的等于、大于、小于这些查询吧?
当时是没有在 Milvus 里面这样使用,所以转到 MongoDB,还是知道 Milvus 支持这个能力,但仍然选择 MongoDB?
你们同时使用向量和关键词两种检索方式,这两种方式的权重是固定的,还是动态的?
召回率从72%提升到85%,单纯是加了 BM25 这条链路带来的提升吗?有没有其他优化?
听下来就是做了问题重写,对吧?除了这个,还有其他的吗?
你们对向量模型做过什么对比?
不是向量存储,我问的是用什么模型做向量化。这个模型有没有做过对比,优劣是什么?
国内这些模型有对比过吗?比如千问、腾讯、字节,在相同输入下,不同向量模型对结果有什么影响?#牛客AI配图神器#
本篇目录
当前问题0159
- 01
你们这个平台的团队大概有多少人?你们项目有多少人?
- 02
简单介绍一下 Vue 3、TypeScript、Go、Gin、MySQL、Kafka、Argo、Kubernetes,这些东西在你开发的过程中分别承担什么责任?
- 03
我看这个接口从12.4秒降到了650毫秒。这个接口一开始就是你负责的,还是你进来实习之后接手的?
- 04
之前这个接口需要12秒,性能瓶颈在什么地方?
- 05
这个瓶颈是怎么定位到的?
- 06
所以是通过接口的响应和日志,判断到底哪个环节出了问题,是吗?
- 07
用户批量导入之后,第一步怎么做父子任务拆分?
- 08
你们批量导入的都是一些文件吗?
- 09
拆分子任务,是根据上传文件的类型,以及各个数据拆的吗?
- 10
我上传了10个文件,就会创建10个子任务,是这个意思吗?
- 11
这10个子任务存储在哪儿?
- 12
你们 MySQL 存的是什么数据?
- 13
假设上传了10个文件,MySQL 里面会存什么样的数据?大概有几条?
- 14
投递的时候,异步是通过什么方式做的?通过 Kafka 做异步,是吗?
- 15
假设任务发生异常,或者项目重启导致任务中断了,第一怎么识别,第二怎么继续执行这个任务?
- 16
我指的是从 Kafka 里面拿到一条消息,需要去处理它。无论调用大模型、算法还是业务库,假设中间出现未知异常,后面怎么重新消费这条数据、继续处理?
- 17
假设拿到一条消息,处理时出现了“1除以0”的异常,这条任务就终止了。那 Kafka 里面的消息怎么处理?后续还能不能正常处理这条消息?
- 18
Kafka 的消息已经被你的服务端拿到了,它怎么判断这条消息需要重新消费?
- 19
Kafka 里面有 Offset 的概念,你知道吗?
- 20
你说“返回 Offset”,返回的是偏移量吗?你对接 Kafka 的时候,怎么告诉它已经完成了,还是没完成?
- 21
假设后端有5个服务,A拿到1,B拿到2,后面是3、4、5。5先完成,返回了一个5,但是1、2、3、4都失败了,还能拿到1、2、3、4吗?
- 22
Offset 已经是5了,前面的任务因为异常或者重启中断,怎么再拿到它们继续执行?
- 23
无论是异常还是项目重启,怎么识别哪些任务需要重新执行?能不能知道它执行到了哪一步,前面的步骤不用再执行?有没有这样的动作?
- 24
你刚才提到了 Partition,那我反问一下,刚才那个问题成立吗?假设3个或者5个服务端服务去消费一个 Partition,这样可以吗?
- 25
是因为要保证有序,所以才由一个消费者去消费一个 Partition 吗?
- 26
消费者拉取消息的时候,也是通过 Offset,取这个 Offset 或者时间戳之后的消息,对吧?
- 27
你提到了重复投递,这块怎么做幂等?
- 28
用户批量导入同一批数据,现在这650毫秒主要消耗在哪里?这边有做过评估吗?
- 29
我理解异步之后,就是上传 OSS 加入库的时间,是这样优化的吗?相当于把链路切了一半,先存起来,后面异步处理?
- 30
你写了用 Redis 分布式锁控制任务抢占,锁粒度、过期时间,还有异常释放,分别怎么设计?
- 31
你说避免任务“创建多次”,具体指怎么创建多次?
- 32
刚才已经说做了幂等,那如果不加这把锁,会有什么影响?具体会产生什么问题?
- 33
这个锁到底锁的是哪块业务,是写库还是任务执行?
- 34
是任务已经进入 MySQL,然后取出来异步执行的时候,在那个环节加锁吗?
- 35
你说在 MySQL 之前做隔离,具体隔离什么?锁粒度到底是什么,锁的是什么内容?
- 36
如果锁的是唯一索引,它在什么情况下会调用两次?你是防并发的,那什么情况下可能出现这个并发?
- 37
刚才聊到,Redis 锁加在拆完任务、进入 MySQL 之前。所以这是用户在平台上传文件后触发的动作,是这个意思吗?
- 38
我作为用户上传一个文件,这个唯一锁是从哪来的?
- 39
假设我先上传一个文件,还没等返回就关掉窗口,然后又上传同一个文件,这时候唯一键是相同的,还是不同的?
- 40
假设有一个按钮,点击后弹框上传文件。我点了两次,上传同一个文件,在你们这里会创建几个任务?
- 41
你怎么识别上传的是同一个文件?
- 42
假设我修改了文件里面的几个字,也能识别到吗?是通过哈希吗?
- 43
我看你做了专业术语和 Query 重复问题的优化,为什么选择向量检索、BM25 和 Rerank 这套方案?
- 44
BM25 其实就是关键词检索,对吧?向量检索和 BM25 分别借助了什么库?
- 45
当时的技术选型你参与了吗?对比了什么方案,向量库和关键词检索为什么这样选?
- 46
Milvus 用的是云服务,还是自己部署?
- 47
现在向量库大概存了多少数据?往里面导入了多少数据,这个了解吗?
- 48
发现纯向量检索召回率较低后,引入关键词检索,为什么选择 MongoDB,没有选择类似 Elasticsearch 的方式?
- 49
你把文件存进 MongoDB,具体怎么存?
- 50
假设存的是图片、视频、网页等非文本数据,BM25 怎么把它们查出来?
- 51
你说通过标签,也就是图片、视频的元数据信息,那 Milvus 能实现吗?除了向量,它也可以存元数据,做类似 MySQL 的等于、大于、小于这些查询吧?
- 52
当时是没有在 Milvus 里面这样使用,所以转到 MongoDB,还是知道 Milvus 支持这个能力,但仍然选择 MongoDB?
- 53
你们同时使用向量和关键词两种检索方式,这两种方式的权重是固定的,还是动态的?
- 54
召回率从72%提升到85%,单纯是加了 BM25 这条链路带来的提升吗?有没有其他优化?
- 55
听下来就是做了问题重写,对吧?除了这个,还有其他的吗?
- 56
你们对向量模型做过什么对比?
- 57
不是向量存储,我问的是用什么模型做向量化。这个模型有没有做过对比,优劣是什么?
- 58
定位之后,怎么确定这个方案的?异步是怎么做的,简单介绍一下。
- 59
国内这些模型有对比过吗?比如千问、腾讯、字节,在相同输入下,不同向量模型对结果有什么影响?
