前段时间,一个在外包待了5年的朋友跟我说,他拿到了阿里的Offer,并给我分享了一下他的面试过程,以及面试官问他的技术栈,现在,小编就把它分享给大家。
小编分别从分布式、中间件、大数据与高并发、数据库、设计模式与实践、数据结构与算法、面试举例,这7个方面给大家进行分享。
分布式
一、大型网站系统的特点
- 高并发,大流量
- 高可用
- 海量数据
- 用户分布广泛,网络情况复杂
- 安全环境恶劣
- 需求快速变更,发布频繁
- 渐进式发展
二、大型网站架构演化发展历程
- 初始阶段的网站架构
- 应用服务和数据服务分离
- 使用缓存改善网站性能
- 使用应用服务器集群改善网站的并发处理能力
- 数据库读写分离
- 使用反向代理和 CDN 加速网站响应
- 使用分布式文件系统和分布式数据库系统
- 使用 NoSQL 和搜索引擎
- 业务拆分
- 分布式微服务
三、拆分 VS 集群
四、微服务 VS SOA
五、前后端完全分离与Rest规范
六、CAP三进二和Base定理
- 关系型数据库遵循ACID规则
- CAP三进二
- BASE定理
- 分布式一致性理论paxos、raft、zab算法
中间件
一、缓存
- 为什么要使用缓存
- 优秀的缓存系统Redis
- redis为什么这么快
- redis的数据类型,以及每种数据类型的使用场景
- redis的过期策略以及内存淘汰机制
- 渐进式ReHash
- 渐进式rehash的原因
- 渐进式rehash的步骤
- 缓存穿透
- 缓存雪崩
二、消息队列
- 消息队列应用场景
- 异步处理
- 应用解耦
- 流量削锋
- 日志处理
- 消息通讯
- 消息中间件示例
- 电商系统
- 日志收集系统
- JMS消息服务
- 消息模型
- 消息消费
- 防止消息丢失
- 同步的事务——停止等待
- 同步的事务——连续ARQ
- 异步的事务——回调机制
- 消息的幂等处理
- 消息的按序处理
三、搜索引擎
- 概述
- 特点(优势):
- 使用场景:
- 倒排索引
- 创建索引
- 一些要索引的原文档(Document)
- 将原文档传给分次组件(Tokenizer)
- 将得到的词元(Token)传给语言处理组件(Linguistic Processor)
- 将得到的词(Term)传给索引组件(Indexer)
- 搜索索引
- 用户输入查询语句
- 对查询语句进行词法分析,语法分析,及语言处理
- 搜索索引,得到符合语法树的文档
- 根据得到的文档和查询语句的相关性,对结果进行排序
- Lucene和ElasticSearch
- 分词器
大数据与高并发
一、秒杀架构设计
- 业务介绍
- 业务特点
- 瞬时并发量大
- 库存量少
- 业务简单
- 技术难点
- 现有业务的冲击
- 直接下订单
- 页面流量突增
- 架构设计思想
- 限流
- 削峰
- 异步
- 缓存
- 整体架构
- 客户端优化
- 秒杀页面
- 防止提前下单
- API 接入层优化
- 限制用户维度访问频率
- 限制商品维度访问频率
- SOA 服务层优化
- 秒杀整体流程图
- 总结
二、数据库架构发展历程
- 单机MySQL的美好年代
- Memcached(缓存)+MySQL+垂直拆分
- Mysql主从复制读写分离
- 分表分库+水平拆分+mysql集群
三、MySQL的扩展性瓶颈
四、为什么要使用NOSQL NOT ONLY SQL
五、传统RDBMS VS NOSQL
六、NOSQL数据库的类型
七、阿里巴巴中文站商品信息如何存放
- 商品基本信息
- 商品描述、详情、评价信息(多文字类)
- 商品的图片
- 商品的关键字
- 商品的波段性的热点高频信息
- 商品的交易、价格计算、积分累计
- 大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案
八、数据的水平拆分和垂直拆分
- 垂直拆分
- 水平拆分
- 拆分原则
- 案例分析
九、分布式事务
- 假如没有分布式事务
- 什么是分布式事务?
- XA两阶段提交(2PC)
- XA三阶段提交(3PC)
- MQ事务
- TCC事务
十、BitMap
- Bit-map的基本思想
- Bit-map应用之快速排序
- Bit-map应用之快速去重
- Bit-map应用之快速查询
- Bit-map扩展——Bloom Filter(布隆过滤器)
- 总结
- 应用
十一、Bloom Filter
十二、常见的限流算法
- 计数器法
- 滑动窗口
- 漏桶算法
- 令牌桶算法
- 计数器 VS 滑动窗口
- 漏桶算法 VS 令牌桶算法
十三、负载均衡
- dns域名解析负载均衡
- 反向代理负载均衡
- http重定向协议实现负载均衡
- 分层的负载均衡算法
十四、一致性Hash算法
数据库
一、数据库范式
- 1NF(第一范式)
- 2NF(第二范式)
- 3NF(第三范式)
二、数据库开发规范
- 基础规范
- 命名规范
- 字段设计规范
- 总结
三、数据库索引
- 唯一索引
- 非唯一索引
- 主键索引
- 聚集索引(聚簇索引)
- 扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用?
- 索引实现机制
- 索引建立原则
四、MyISAM vs InnoDB
五、并发事务带来的问题
- 丢失更新
- 脏读(未提交读)
- 不可重复读
- 幻读(Phantom Read)
六、事务隔离级别及锁的实现机制
- 一级封锁协议 (对应 read uncommited)
- 二级封锁协议 (对应read commited)
- 三级封锁协议 (对应reapetable read )
- 最强封锁协议(对应Serialization)
七、MVCC(多版本并发控制)
八、间隙锁与幻读
- 间隙锁(Next-Key锁)
- RR级别下防止幻读
设计模式与实践
一、OOP五大原则SOLID
- 单一责任原则
- 开放封闭原则
- 里氏替换原则
- 依赖倒置原则
- 接口分离原则
二、设计模式
三、代理模式
- 定义与举例
- 静态代理
- 动态代理
- JDK动态代理
- CGLIB动态代理
四、面向切面编程(AOP)
- 基本思想
- 登录验证
- 基于RBAC的权限管理
- 角色访问控制(RBAC)
- 执行流程分析
- 日志记录
- 志记录最佳实践
- 事务处理
- 统一异常处理
五、工厂模式
- 简单工厂
- 工厂方法
- 抽象工厂
六、控制反转IOC
七、观察者模式
八、Zookeeper
- ZK简述
- 存储结构
- znode
- znode中的存在类型
- 应用场景
- 统一命名服务
- 负载均衡
- 统一配置管理
- 集群管理
- 服务器动态上下线
- 写数据流程
- Leader选举
数据结构与算法
一、 树
二、BST树
三、BST树
四、AVL树
五、红黑树
六、B-树
七、B+树
八、字典树
九、跳表
十、HashMap
- 简介
- 内部实现
- 存储结构-字段
- 功能实现-方法
- 确定哈希桶数组索引位置
-
分析HashMap的put方法 扩容机制
5.线程安全性
十一、ConcurrentHashMap
- 锁分段技术
- CAS无锁算法
- 实现方式
- 存在的缺点
十二、ConcurrentLinkedQueue
- 延迟更新tail节点
- 延迟删除head节点
十三、Topk问题
- 简述
- 解决方案
- 实际运行
(1)单机+单核+足够大内存
(2)单机+多核+足够大内存
(3)单机+单核+受限内存
(4)多机+受限内存
4.经常被提及的该类问题
5.重复问题
十四、资源池思想
- 作用
- 线程池
- 连接池
十五、JVM内存管理算法
- 判断对象是否存活
- 引用计数法
- 可达性分析算法
- 垃圾回收算法
- 标记-清除算法(Mark-Sweep)
- 复制算法(Copying)
- 标记-整理算法(Mark-Compact)
- 分代收集算法(Generational Collection)
十六、容器虚拟化技术,Doocker思想
- 为什么会有docker
- docker理念
- 实现方式
- docker的组成
- 镜像
- 容器
- 仓库
- 总结
十七、持续集成、持续发布,jenkins
- 持续集成
- 手动部署
- 自动部署
面试题举例
一、设计一个分布式环境下全局唯一的发号器
- UUID
- 数据库自增长序列或字段
- 数据库sequence表以及乐观锁
- Redis生成ID
- Twitter的snowflflake算法
二、设计一个带有过期时间的LRU缓存
- 问题描述
- 问题分析
- 过期时间实现
- 维护一个线程
- 惰性删除
三、设计一个分布式锁
- 什么是分布式锁?
- 我们需要怎样的分布式锁?
- 基于数据库做分布式锁
- 基于乐观锁
- 基于悲观锁
4.基于 Redis 做分布式锁
- 基于 redis 的 setnx()、expire() 方法做分布式锁
- 基于 redis 的 setnx()、get()、getset()方法做分布式锁
5.基于 ZooKeeper 做分布式锁
6.使用分布式锁的注意事项
7.分布式可重入锁的设计
四、设计一个分布式环境下的统一配置中心
- 配置中心概述
- 演进中的配置
- 配置中心之简版
- 配置中心之性能改进
- 配置中心之可用性改进
五、如何准备HR面试
所有的资料及文档小编已经整合,需要的朋友可以点击下方链接获取