在大厂面试中,候选人常常面临一些技术难题,面试官希望通过这些问题考察应聘者的综合技术能力和解决问题的思维能力。除了常见的编程能力和算法题,大厂面试还涉及大量的系统设计、高并发、分布式系统、网络安全等高阶话题。在这篇文章中,我们将通过解答一些常见的深度面试问题,帮助你更好地理解这些核心技术,以便在面试中获得成功。
1. RocketMQ 事务模型
编辑
RocketMQ 是一款分布式消息队列,广泛应用于大规模、高并发的场景中。RocketMQ 的事务消息模型是它的一个重要特性,用于保证消息发送的原子性,即要么发送成功,要么发送失败,不会出现消息丢失或不一致的情况。
RocketMQ 的事务模型由以下几个部分组成:
- 事务消息的发送:消息发送方首先发送一个半消息(事务消息),然后根据事务执行的结果决定是提交(commit)还是回滚(rollback)这个消息。
- 事务状态回查:RocketMQ 会在事务消息执行后定期进行事务状态回查,以确保事务的最终一致性。回查的服务会查询事务消息的状态,确保消息在提交或回滚时能够被正确处理。
这种事务消息的设计非常适合处理分布式事务,尤其是确保在复杂系统中多个系统的状态一致性。
2. NameServer 如何知道 Broker 挂掉了
在 RocketMQ 中,NameServer 负责提供服务注册与发现的功能。它维护着一个 Broker 列表,客户端通过访问 NameServer 获取 Broker 的信息。当 Broker 出现故障或挂掉时,NameServer 会通过以下方式检测到:
- 心跳机制:Broker 会定期向 NameServer 发送心跳消息,报告自己的状态。如果 NameServer 在一定时间内没有收到某个 Broker 的心跳信息,它就认为该 Broker 已经挂掉。
- 超时机制:如果 Broker 在预定的心跳间隔时间内未能发送心跳,NameServer 会把该 Broker 从可用 Broker 列表中移除。
通过心跳机制和超时监测,NameServer 能够及时更新 Broker 的状态并做出相应的调整,保证消息的可靠传输。
3. 怎么防止消息丢失?
编辑
消息丢失是分布式消息系统中需要重点关注的问题。为了防止消息丢失,常用的技术手段包括:
- 消息持久化:消息持久化是防止消息丢失的重要手段。在 RocketMQ 中,消息被写入磁盘存储,当消息写入成功后,它就被认为是已持久化的。
- ACK机制:消息接收方确认收到消息的机制(如消息的ACK应答)是确保消息不丢失的另一手段。当消息发送方收到接收方的确认后,才认为消息已成功传输。
- 同步与异步双重确认:可以通过同步和异步两种方式确保消息传递的可靠性,尤其是在重要的消息传递时,建议使用同步确认机制来减少丢失的风险。
- 副本机制:像 Kafka 和 RocketMQ 等消息队列系统通常会使用数据副本技术,保证在某个 Broker 节点发生故障时,其他节点可以提供备份数据。
4. 谈一谈原子性
编辑
原子性是指操作要么全部成功,要么全部失败。在计算机系统中,原子性通常用于描述数据库事务、消息队列中的操作以及分布式系统中的一致性操作。原子性确保了在系统出现故障时,不会留下一半完成的操作状态。常见的实现原子性的方法包括:
- 事务机制:数据库和消息队列中都会有事务机制来保证原子性。例如,在消息队列中可以采用事务消息来保证消息发送的原子性。
- 锁机制:通过加锁可以确保某个操作在执行过程中不被中断或并发执行,进而实现原子性。
5. 谈一谈 Java 的锁
Java 提供了多种锁机制,用于保证多线程环境下的原子性和数据一致性。常见的锁有:
- synchronized:Java 中最基本的锁机制。它通过对方法或代码块加锁来保证线程安全。它是一种互斥锁,同一时间只有一个线程能获取到锁。
- ReentrantLock :是
java.util.concurrent包提供的一种显式锁机制,它具有更灵活的锁控制,例如可以尝试获取锁(tryLock()),支持定时锁等功能。 - 读写锁 :
ReadWriteLock是为了解决读多写少的场景而设计的锁,允许多个线程同时读取数据,但写操作仍然是独占的。
6. HTTP 和 HTTPS 的区别
- HTTP (Hypertext Transfer Protocol)是一个明文的协议,用于在客户端和服务器之间传输数据。由于其不加密,数据在传输过程中容易被窃取或篡改。
- HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 的加密版,通过 SSL/TLS 协议对 HTTP 数据进行加密,确保传输过程中的数据安全性和完整性,防止中间人攻击。
7. HTTPS 的连接过程
编辑
HTTPS 的连接过程涉及一系列加密和认证步骤,主要包括以下几个阶段:
- 客户端向服务器发送请求:客户端发起 HTTPS 请求时,会要求建立一个加密的连接。
- 服务器返回证书:服务器将其公钥证书(包含公钥)发送给客户端,客户端用证书中的公钥验证服务器身份。
- 密钥交换:客户端生成一个对称密钥,用服务器的公钥加密后发送给服务器。服务器用私钥解密,获取该对称密钥。
- 建立加密连接:双方使用该对称密钥加密通信内容,建立起安全的通信通道。
8. 中间人是什么?
中间人(Man-in-the-Middle,MITM)攻击是一种网络攻击形式,攻击者在客户端和服务器之间截获、篡改或伪造通信数据。通过这种方式,攻击者能够获取敏感信息,甚至伪造消息或篡改通信内容。HTTPS 协议通过 SSL/TLS 加密通信,能够有效防止中间人攻击。
9. 什么是对称加密和非对称加密?
- 对称加密 :使用相同的密钥进行加密和解密。优点是加密速度快,但密钥的分发和管理问题较为复杂。常见的对称加密算法有 AES、DES 等。
- 非对称加密:使用一对公钥和私钥,公钥加密,私钥解密。由于加密和解密使用不同的密钥,非对称加密在密钥分发上比对称加密更加安全,但速度较慢。常见的非对称加密算法有 RSA、ECC 等。
10. CA 认证过程
编辑
CA(Certificate Authority)认证过程通常包括以下步骤:
- 生成密钥对:用户首先生成一对公钥和私钥。
- 提交证书请求:用户将公钥以及其他相关信息提交给 CA,申请证书。
- CA 验证:CA 对用户的身份进行验证,验证通过后,CA 会用自己的私钥对用户的公钥进行签名,生成证书。
- 用户收到证书:用户可以将证书与私钥一起使用,通过公钥加密和私钥解密的方式进行安全通信。
11. DNS 解析过程
编辑
DNS(Domain Name System)是将域名解析为 IP 地址的系统,解析过程如下:
- 本地缓存检查:首先检查本地 DNS 缓存是否有目标域名的解析结果。
- 递归查询:如果本地缓存没有,DNS 查询会通过递归方式向根 DNS 服务器、顶级域(TLD)服务器、权威 DNS 服务器等逐步查询。
- 返回 IP 地址:一旦找到对应的 IP 地址,DNS 服务器将结果返回给客户端。
12. 先判断 hosts 还是先判断 Chrome 的缓存?
浏览器访问网页时,首先会判断本地的 hosts 文件,看是否有域名到 IP 的映射。如果 hosts 中没有对应记录,浏览器才会通过 DNS 解析。浏览器的 DNS 缓存 存储了上次访问的域名和对应 IP 地址,如果缓存未过期,浏览器会直接使用缓存的结果,而不会再次发起 DNS 查询。
更改 hosts 后,Chrome 缓存是否失效?