前言:我们通常在面试的时候难免会慌张不已。想必,经历过的人都能体会。但是如果你提前预测和准备面试官要问你的问题,并想出合理的回答方式,就会轻松很多。所以接下来的面试题是我从自己和其他人的面试经历中总结出来的,可能也不是很全面,毕竟 Java 的技术点还是很多的,我所总结的不过是九牛一毛。希望能帮助到你。

一,session 共享

首先第一个要解决的就是 sesison 共享的问题,如下图。

架构面试问题 架构师面试题及答案2020_spring

通常有两种解决方案,第 1 种是配置 nginx 的负载集群策略为 ip_hash,第 2 种是将 session 存储到其它地方,一般推荐放到 redis 中。

第 1 种方案适合于临时解决或者是为了兼容历史项目,但是从应用服务器无状态的角度考虑,推荐把用户会话 session 放到 redis,如下图。

架构面试问题 架构师面试题及答案2020_sql_02

二,本地缓存

如果使用本地缓存,当从单体迁移到集群后,就会面临缓存同步的问题,如下图。

架构面试问题 架构师面试题及答案2020_架构面试问题_03

最佳实践是上分布式缓存,既解决了缓存同步的问题,也释放了应用服务器的内存资源,如下图。

架构面试问题 架构师面试题及答案2020_java_04

三,文件服务

应用服务器在上集群之前,文件通常会放在本地,或者单独的文件服务器上,因为文件服务需要占用大量的硬盘空间,以上两种方案都无法很好的解决硬盘扩容的问题,最佳实践是放到云存储上,比如阿里云的 OSS,或者腾讯云的 COS 上,这样可以做到按需扩容,如下图。

架构面试问题 架构师面试题及答案2020_架构面试问题_05

四,分布式环境下线程同步问题

在单机环境下,使用 lock 就可以解决线程同步的问题,一旦上了集群之后,lock 就不管用了,这时需要上分布式锁,分布式锁的解决方案也有很多,我这里推荐使用 redis 的 setnx,需要注意的是,如果 redis 是集群部署的,需要考虑这种情形:假设我们在 redis 的主节点上添加了一把分布式锁,不幸的是主节点挂掉了,而且主节点上的锁还没有同步到从节点上,如果此时有客户端来请求获得同一把锁,那么它将顺利地获得锁,之前那把锁会被无情地忽视掉,这就是分布式锁在 Redis 集群中遇到的麻烦。

《一线大厂 Java 面试真题解析+Java 核心总结学习笔记+最新全套讲解视频+实战项目源码》开源

Java 开发优秀开源项目:

  • ali1024.coding.net/public/P7/Java/git
  • github.com/spring-projects

Kafka 进阶篇知识点

架构面试问题 架构师面试题及答案2020_spring_06

Kafka 高级篇知识点

架构面试问题 架构师面试题及答案2020_数据库架构_07

44 个 Kafka 知识点(基础+进阶+高级)解析如下

架构面试问题 架构师面试题及答案2020_spring_08