- 1.1 消息队列
-
1.2 搜索引擎
-
1.2.1 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
-
1.2.2 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
-
1.2.3 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
-
1.2.4 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
-
1.3.1 在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?
-
1.3.2 Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?
-
1.3.3 Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
-
1.3.4 Redis 的过期策略都有哪些?手写一下 LRU 代码实现?
-
1.3.5 如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?
-
1.3.6 Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
-
1.3.7 Redis 集群模式的工作原理能说一下么?在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?如何动态增加和删除一个节点?
-
1.3.8 了解什么是 redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 Redis 的穿透?
-
1.3.9 如何保证缓存与数据库的双写一致性?
-
1.3.10 Redis 的并发竞争问题是什么?如何解决这个问题?了解 Redis 事务的 CAS 方案吗?
-
1.3.11 生产环境中的 Redis 是怎么部署的?
-
1.4.1 为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的?
-
1.4.2 现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?
-
1.4.3 如何设计可以动态扩容缩容的分库分表方案?
-
1.4.4 分库分表之后,id 主键如何处理?
-
1.5.1 如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥?如何解决 MySQL 主从同步的延时问题?
-
1.6.1 如何设计一个高并发系统?
-
1.2.1 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?
-
2.1 面试连环炮
-
2.2.1 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?
-
2.3.1 说一下 Dubbo 的工作原理?注册中心挂了可以继续通信吗?
-
2.3.2 Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?
-
2.3.3 Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?
-
2.3.4 Dubbo 的 spi 思想是什么?
-
2.3.5 如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?
-
2.3.6 分布式服务接口的幂等性如何设计(比如不能重复扣款)?
-
2.3.7 分布式服务接口请求的顺序性如何保证?
-
2.3.8 如何自己设计一个类似 Dubbo 的 RPC 框架?
-
2.4.1 Zookeeper 都有哪些应用场景?
-
2.4.2 使用 Redis 如何设计分布式锁?使用 Zookeeper 来设计分布式锁可以吗?以上两种分布式锁的实现方式哪种效率比较高?
-
2.5.1 分布式事务了解吗?你们如何解决分布式事务问题的?TCC 如果出现网络连不通怎么办?XA 的一致性如何保证?
-
2.6.1 集群部署时的分布式 Session 如何实现?
-
3.1.1 Hystrix 介绍
-
3.1.2 电商网站详情页系统架构
-
3.1.3 Hystrix 线程池技术实现资源隔离
-
3.1.4 Hystrix 信号量机制实现资源隔离
-
3.1.5 Hystrix 隔离策略细粒度控制
-
3.1.6 深入 Hystrix 执行时内部原理
-
3.1.7 基于 request cache 请求缓存技术优化批量商品数据查询接口
-
3.1.8 基于本地缓存的 fallback 降级机制
-
3.1.9 深入 Hystrix 断路器执行原理
-
3.1.10 深入 Hystrix 线程池隔离与接口限流
-
3.1.11 基于 timeout 机制为服务接口调用超时提供安全保护
-
2.2.1 为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?
-
4.1 关于微服务架构的描述
面试题
dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?
面试官心理分析
上一个问题,说说 dubbo 的基本工作原理,那是你必须知道的,至少要知道 dubbo 分成哪些层,然后平时怎么发起 rpc 请求的,注册、发现、调用,这些是基本的。
接着就可以针对底层进行深入的问问了,比如第一步就可以先问问序列化协议这块,就是平时 RPC 的时候怎么走的?
面试题剖析
序列化,就是把数据结构或者是一些对象,转换为二进制串的过程,而反序列化是将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
dubbo 支持不同的通信协议
- dubbo 协议
默认就是走 dubbo 协议,单一长连接,进行的是 NIO 异步通信,基于 hessian 作为序列化协议。使用的场景是:传输数据量小(每次请求在 100kb 以内),但是并发量很高。
为了要支持高并发场景,一般是服务提供者就几台机器,但是服务消费者有上百台,可能每天调用量达到上亿次!此时用长连接是最合适的,就是跟每个服务消费者维持一个长连接就可以,可能总共就 100 个连接。然后后面直接基于长连接 NIO 异步通信,可以支撑高并发请求。
长连接,通俗点说,就是建立连接过后可以持续发送请求,无须再建立连接。
而短连接,每次要发送请求之前,需要先重新建立一次连接。
- rmi 协议
走 Java 二进制序列化,多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。
- hessian 协议
走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多的情况,适用于文件的传输,一般较少用。
- http 协议
走 json 序列化。
- webservice
走 SOAP 文本序列化。
dubbo 支持的序列化协议
dubbo 支持 hession、Java 二进制序列化、json、SOAP 文本序列化多种序列化协议。但是 hessian 是其默认的序列化协议。
说一下 Hessian 的数据结构
Hessian 的对象序列化机制有 8 种原始类型:
- 原始二进制数据
- boolean
- 64-bit date(64 位毫秒值的日期)
- 64-bit double
- 32-bit int
- 64-bit long
- null
- UTF-8 编码的 string
另外还包括 3 种递归类型:
- list for lists and arrays
- map for maps and dictionaries
- object for objects
还有一种特殊的类型:
- ref:用来表示对共享对象的引用。
为什么 PB 的效率是最高的?
可能有一些同学比较习惯于 JSON
or XML
数据存储格式,对于 Protocol Buffer
还比较陌生。Protocol Buffer
其实是 Google 出品的一种轻量并且高效的结构化数据存储格式,性能比 JSON
、XML
要高很多。
其实 PB 之所以性能如此好,主要得益于两个:第一,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 XML
和 JSON
快上了 20~100
倍;第二,它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。