一面
- 介绍项目整体架构
- 了解gRPC吗,pb文件是一个什么样的文件?(面试官说可以理解为一组API )
protobuf 是一种用于序列化结构数据的工具,实现数据的存储与交换,与编程语言和开发平台无关。可以简单理解为,是一种跨语言、跨平台的数据传输格式(数据序列化协议)。与json的功能类似,但是无论是性能,还是数据大小都比json要好很多。
- 序列化速度快(由专门的protoc编译器进行编译,二进制数据)、体积小(只有原先的1/10 ~ 1/3)、传输和解析速度快(提高20倍甚至更高)
- 跨平台和语言、扩展性好(.proto多平台只需维护一套协议文件)
- 加密性好(http传输内容通过抓包只能看到字节数)
- 序列化:将结构数据或者对象转换成能够用于存储和传输的格式。
- 反序列化:在其他的计算环境中,将序列化后的数据还原为结构数据和对象。
- Go slice 切片介绍原理?
- Go channel介绍下,并且为什么是线程安全的?介绍下【向channel中写数据】和【从channel中读数据】 的流程?
send发送/recv接收 的细化操作:
- 加锁
- 把数据从goroutine中copy到 “环形队列buf” 中,或从 “环形队列buf” 中copy数据到goroutine中; 进/出队列
- 释放锁
- Go中有哪些锁?(Mutex、RWMutex)
- Go map为什么是非线程安全的?遍历map的key为什么是乱序的?
- Go GMP调度介绍下?
3个流程:正常情况下 → 线程阻塞时 → runqueue执行完成
- 介绍下内存对齐?
- 使用空间换时间,提高读取内存数据时的效率:数据结构应该尽可能地在自然边界上对齐,如果访问未对齐的内存,处理器可能需要做两次内存访问,而对齐的内存访问仅需要一次访问
- 使代码拥有更好的可移植性:有些CPU可以访问任意地址上的任意数据,而有些CPU只能在特定地址访问数据
- Go 中为什么小对象多了会造成gc的压力?
因为三色标记法中的 标记过程中要检索的对象多了
- 内存逃逸?
- Golang 中的并发控制?Go Context的原理(我不知道…)?
参考:Golang中常用的并发模型
Channel、WaitGroup、Context
- MySQL索引及原理?
- MySQL MVCC介绍下?
- MySQL 主从?主从可能会存在哪些问题(主从数据同步延迟的问题)
- 从库去同步主库的binlog,但每次同步总会少两条binlog日志记录(丢数据),这可能是什么原因导致的?(我不是很了解,要继续看下…)
- Go Gin框架中间件(Middleware)原理,参考:go面试题-gin中间件原理分析
中间件是为了过滤路由而发明的一种机制,也就是http请求来到时先经过中间件,再到具体的处理函数
- gin框架路由使用前缀树,路由注册的过程是构造前缀树的过程,路由匹配的过程就是查找前缀树的过程。
- gin框架的中间件函数和处理函数是以切片的形式的调用链条存在的(本质上就是函数指针切片),我们可以顺序调用也可以借助 c.Next() 方法实现嵌套调用。
- 借助c.Set()和c.Get()方法我们能够在不同的中间件函数中传递数据。
- Redis常用的数据结构有哪些?(我举例说了striing,zset以及其底层 压缩链表/跳表/hash表 等原理)
- 如果使用Redis zset的数据结构来实现异步消息队列,可能会存在哪些问题?
数据丢失(比如Redis宕机了,可能会丢失最近1s的数据,即使有持久化机制)、阻塞情况、幂等性问题
- 写一个API接口需要统计哪些问题?
与前端协商接口请求字段及响应字段、接口参数的验证、考虑接口幂等性问题、以及其中涉及的业务查询sql的性能优化、接口压测…
- MySQL中怎么判断一条sql查询是否是全表扫描?那么type字段什么值才表示当前sql有最优的查询效率?一个sql中有
between ... and
时,type是什么值?
通过Explain分析的type字段是否是ALL来判断。
const: 针对主键或唯一索引的等值查询扫描,最多只返回一行数据。
range:表示使用索引范围查询,通过索引字段范围获取表中部分数据记录。这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中。例如下面的例子就是一个范围查询:explain select * from user_info where id between 2 and 8;
面试官给的建议:下面可以再了解下MVCC和主从。。。