说说你对Eureka的缓存机制的理解?
1 个回答
浪漫固然重要,但真诚更胜一筹。法相### **Eureka 的缓存机制** Eureka 的缓存机制旨在提高服务发现的效率,并减少服务注册中心的压力,尤其是在面对大量服务注册和查询请求时。Eureka 提供了一个多层缓存架构,帮助提升响应速度和降低数据库压力。通过这种设计,Eureka 提供了较好的可用性(AP能力),虽然无法完全保证一致性。 | **缓存** | **类型** | **说明** | |----------------------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------| | **registry** | `ConcurrentHashMap` | 实时更新,作为 `AbstractInstanceRegistry` 类的成员变量,UI端请求的是这里的服务注册信息。 | | **readWriteCacheMap** | `Guava Cache / LoadingCache` | 实时更新,作为 `ResponseCacheImpl` 类的成员变量,缓存时间为 180 秒,减少对 `registry` 的访问压力。 | | **readOnlyCacheMap** | `ConcurrentHashMap` | 周期更新,作为 `ResponseCacheImpl` 类的成员变量,默认每 30 秒从 `readWriteCacheMap` 更新,Eureka client 默认从此缓存更新服务注册信息,也可配置直接从 `readWriteCacheMap` 更新。 | Eureka 的缓存机制主要由三个层次组成: 1. **registry(服务注册表)** 2. **readWriteCacheMap(可读写缓存)** 3. **readOnlyCacheMap(只读缓存)** ### **各层缓存的功能和设计** #### 1. **registry(服务注册表)** - **作用**:`registry` 是 Eureka 的核心数据存储结构,保存所有服务实例的注册信息。该信息包括服务名称、IP 地址、端口、健康状态等。 - **实现**:使用 `ConcurrentHashMap` 作为底层数据结构,确保线程安全。 - **更新机制**:每当服务实例注册、续约或注销时,`registry` 会即时更新,反映最新的服务状态。并且,默认每隔 90 秒剔除掉没有续约的服务。 #### 2. **readWriteCacheMap(可读写缓存)** - **作用**:`readWriteCacheMap` 用于缓存服务实例的最新状态,提供快速的读写访问。它是 `registry` 的一个近实时反映,目的是减少对 `registry` 的直接访问压力,提升性能。 - **实现**:使用 `Guava Cache`(`LoadingCache`)来缓存服务信息。 - **更新机制**:当 `registry` 数据发生变化时,`readWriteCacheMap` 会同步更新,缓存数据的过期时间为 180 秒。这样可以确保缓存中的数据尽可能与最新的注册信息同步。 #### 3. **readOnlyCacheMap(只读缓存)** - **作用**:`readOnlyCacheMap` 提供一个只读的服务信息视图,主要用于处理大量的客户端查询请求,提供高效的读取性能。该缓存不允许被修改,适合频繁的读取操作。 - **实现**:使用 `ConcurrentHashMap` 来存储数据。 - **更新机制**:`readOnlyCacheMap` 每隔 30 秒从 `readWriteCacheMap` 获取最新的数据快照,确保信息的新鲜度和一致性。 ### **缓存更新机制概述** - **服务注册、续约或注销时**: - `registry` 会立即更新,反映最新的服务状态。 - `readWriteCacheMap` 会同步更新,保证缓存中的数据是最新的。 - 每 90 秒,Eureka 会自动剔除未续约的服务实例。 - **定时更新**: - 每隔 30 秒,`readOnlyCacheMap` 会从 `readWriteCacheMap` 获取最新的数据快照,保持缓存的新鲜度。 ### **总结** Eureka 的三层缓存机制有效地平衡了速度、性能和一致性: - `registry` 作为权威数据源,提供准确的服务实例信息。 - `readWriteCacheMap` 提供快速的读写访问,减少了对 `registry` 的直接访问。 - `readOnlyCacheMap` 提供高效的只读查询能力,适应大量客户端的查询需求。 通过这种缓存机制,Eureka 提供了更快的服务发现响应速度,同时减少了对服务注册表的访问压力,但它在一致性上有所妥协,符合 AP(高可用性)能力的设计目标。发布于 2024-11-15 21:37 •IP属地 吉林举报评论收藏
公众号进入网站体验更佳

