了解 Eureka 客户端缓存

Posted

技术标签:

【中文标题】了解 Eureka 客户端缓存【英文标题】:Understanding Eureka Client Cache 【发布时间】:2018-10-20 04:15:31 【问题描述】:

我需要一些帮助来理解为什么在 Eureka 中注册的服务尽管没有实际运行,但仍希望相互通信。例如,我在 Eureka 中注册了服务 A 和服务 B。如果我关闭服务 B,服务 A 仍会尝试与服务 B 通信 30 秒到 3 分钟,即使它没有运行。这样做的目的是什么?有什么办法吗?谢谢!

【问题讨论】:

【参考方案1】:

我相信你指的是尤里卡的自我保护模式。

这样做的目的是什么?

自我保护模式旨在处理短期网络故障。实例注册后,Eureka 服务器不会永远将实例保存在注册表中。当实例首次注册时,它会为实例设置租约续订策略。该策略包括实例在从注册表中逐出之前可以错过的心跳次数。

running multiple Eureka servers时,自我保护模式很重要。

您可以通过this SO question了解有关自我保护模式的更多详细信息。

有什么办法可以解决吗?

默认启用。它可以被禁用。

您还可以调整一些属性以确保死的实例尽快被驱逐

请查看上面链接的 SO 问题以获取有关调整哪些属性的帮助。

【讨论】:

【参考方案2】:

如您所知,Netflix 正在运行大量基于 Eureka 的服务器实例。因此,通过 Eureka 查找实例的开销对于 Netflix 来说可能是很大的开销。我想这就是为什么 Eureka 有缓存、轮询间隔和其他导致刷新实例状态延迟的特性。

幸运的是,您可以使用以下属性调整此延迟。

尤里卡服务器 - eureka.server.responseCacheUpdateInvervalMs

30 秒。 Eureka 服务器的 API 有自己的响应缓存。默认是相当大的时期。您可以减小此值。

Eureka 客户端(API 调用者) - eureka.client.registryFetchIntervalSeconds

30 秒。 Eureka 客户端定期从 Eureka 服务器获取实例状态。您可以减小此值。

Eureka 客户端(API 提供者) eureka.instance.leaseExpirationDurationInSeconds

90 秒。每个注册到 Eureka 服务器的实例都可以为自己设置过期时长。如果在此期间 Eureka 服务器没有收到来自 Eureka 客户端的任何心跳,则 Eureka 服务器会过期。默认情况下,每个 Eureka 客户端每 30 秒发送一次心跳。

如果您正在运行的实例数量不是很大,您通常可以减少上述属性。

还有另一个与此延迟相关的属性。

eureka.instance.leaseRenewalIntervalInSeconds

该属性设置Eureka客户端的心跳间隔。它的默认值为 30 秒,但您无法调整此值,因为 Eureka 服务器有一些硬编码逻辑假定此周期为 30 秒。

【讨论】:

以上是关于了解 Eureka 客户端缓存的主要内容,如果未能解决你的问题,请参考以下文章

图解 Eureka 的缓存架构 #yyds干货盘点#

eureka服务列表刷新设置

Eureka 客户端已经成功下线,为啥还会有请求流入?

带你100% 地了解 Redis 6.0 的客户端缓存

带你100% 地了解 Redis 6.0 的客户端缓存

带你100% 地了解 Redis 6.0 的客户端缓存