介绍你的项目

考察项目经历和开发经验

  • 基本业务流程
  • 遇到什么困难,你是如何解决的
  • 从项目引出熟悉的技术栈

自我管理问题

考察总结和知识构建能力

  1. 说一个你解决过最复杂的问题
  2. 如何学习一门新技术

算法

考察算法基础能力(技术问题的倒数第二题),看对方的能力水平,问两题,第一题从Leetcode挑选经典题,第二题从限流算法或海量数据处理算法中选一题,如果都不会但要会二分查找和快排

  • 排序算法
  • 查找算法
  • 海量数据处理算法
  • 限流算法
  • 高阶算法(时间轮/雪花算法/布隆过滤器/一致性哈希)

系统设计

技术栈系列问题

  1. 考察技术栈的熟悉程度(三个维度:流程、性能调优、高可用)
  2. 从整体流程引申实现细节问题(根据面试者的水平挑选适当层次的问题,能回答上来在细化)
  3. 尝试关联的项目的业务中
  4. 是否考虑过该技术栈的可靠性,即如果宕机如何处理

MySQL

1. MySQL查询工作流程,以join为例

  • MySQL网络协议通信
  • 查询缓存
  • 解析器–计划器–执行器
  • Innodb缓冲池––>缓冲池结构及性能指标
  • 磁盘主键索引查询––>非聚集索引––>为什么不能使用平衡二叉树––>PG索引结构
  • join池的连接算法
  • 数据输出

2. MySQL DML流程

  • 到执行器之前与DQL相同
  • 读取到缓冲池,写入change buffer
  • 创建事务读视图––>事务定义与实现及并发事务问题––>MVCC––>PG事务id––>PG的实现方式
  • 数据加锁––>MySQL按不同方面划分的锁 —> 乐观锁/悲观锁及其使用场景
  • 创建undo log
  • 提交事务,写入redo log和bin log––>PG WAL
  • 修改内存数据页
  • 写入脏页––>性能指标
  • 修改数据页,但不会压缩空间––>PG vacuum––>相关性能指标

3. MySQL高可用

4. MySQL性能优化

JVM

1. JVM工作流程(执行java -jar)

  • 创建JVM进程,分配JVM内存––>JVM模型––>内存配置方式
  • 创建类加载器
  • 加载标准类库,ext类库,和应用类
  • 类加载流程
  • 创建对象分配内存
  • 执行引擎执行字节码––>JIT编译优化
  • GC流程––>GC收集器类型,对象引用

计算机网络

网络请求流程

  • 浏览器发起请求
  • 键盘硬中断和软中断
  • 创建socket
  • DNS
  • DCHP
  • TCP三次握手
  • SSL握手
  • 发起http请求––>查找缓存
  • 发送网络包––>网络协议栈
  • 交换机,路由器
  • 接收网络包
  • 接收方响应,发送方接收ACK––>流量控制––>拥塞控制
  • 浏览器处理响应网络包
  • TCP四次挥手

Redis

  • 为什么要使用Redis
  • Redis为什么快 —> 为什么是单线程
  • 过程中引入Redis执行流程
  • Redis网络协议通信及IO多路复用 —> IO模型 —> IO多路复用 —> select/poll/epoll
  • 服务端输入缓存,解析
  • Socket排队等待线程处理
  • 处理完成后执行后处理操作查询/写入数据,包括AOF写入,慢日志
  • Redis服务端回复写入输出缓冲,回复请求
  • Redis如何保证数据不会丢失 —> 介绍AOF和RDB
  • 项目中使用了哪些数据结构
  • 有设置过期时间吗,你了解的过期策略是怎样的
  • 有没有用过zset,内部数据结构如何实现,为什么不使用红黑树
  • 你还了解其他应用场景吗
  • 如何保证缓存和数据库一致性 —> 通常有两套解决思路(删除缓存和Canal)—> 为什么要删除而不能修改
  • 有没有遇到过缓存失效问题,如何解决(缓存穿透/缓存击穿/缓存雪崩)

Redis高可用

  • 如果Redis宕机怎么办,你们项目如何保证Redis的可用性
  • 主从复制/Sentinel/集群
  • 集群为什么使用哈希槽而不是一致性hash
  • 会出现脑裂/3C/羊群效应问题吗,如何解决

Kafka

Elasticsearch

  • 为什么要使用ES —> MySQL不适合做全文检索
  • 底层Lucene —> 倒排索引原理
  • ES相比Lucene有什么优点 —> 提供了高可用方案
  • 引入到ES查询流程来保证高可用 —> 近实时查询和实时查询
  • ES索引保证数据原子性和持久性
  • 项目中如何使用ES —> 从系统架构入手说明
  • ES在项目中如何规划
  • 使用过程中遇到哪些问题,怎么做调优(深度分页,使用过滤器)

Prometheus

  • 为什么使用Prome —> 为什么关系型数据库不合适 —> 时序数据库的原理
  • 为什么选择Prome而不是open-falcon
  • 项目中如何使用Prome —> 从系统架构中入手说明
  • Prome在项目中如何规划
  • 使用过程中遇到哪些问题,怎么做调优(大内存问题)