Eureka的自我保护机制

自我保护机制介绍

当检测到同时有大量已注册客户端因为非正常断开连接然后准备从注册列表剔除,Eureka 服务器就会进入自我保护模式(self-presevation mode)。这是为了保证大规模网络中断事件不会导致 eureka 的注册时间被抹掉并传播到所有客户端(消费者)。

eureka 中已注册客户端被剔除方式:

  1. 对于 eureka 的协议,客户端停止注册的正常流程应该使执行一个明确的动作。例如:在 java 客户端中的 shutdown 方法。
  2. 另外,如果 eureka server 在连续 3 个 heartbeat 周期时间单位内没有收到一个客户端的心跳包,就会认为这个客户端"不明确的中断了",将会在后台的剔除任务中从注册列表剔除这个客户端。

自我保护模式针对的使第二种断开方式,当有超过 15% 已注册客户端处于这种状态的时候,自我保护模式将会被开启。自我保护模式开启后,将会停止所有客户端剔除工作,直到以下任一条件满足为止:

  • eureka server 检测到恢复心跳的客户端超过了期望阈值
  • 自我保护模式被关闭

自我保护模式在默认情况下使开启的,默认开启自我保护模式的阈值是当前注册客户端数量的 15%。

个人理解

和大多数注册中心(服务发现)一样,消费者从注册中心获取服务提供方联系信息,直接对生产者发起远程调用(k8s 的服务发现不是)。如果存在"少量"服务方不明确地不可达的时候,通常来说,注册中心同步这个消息到消费者不会出现大问题。

相对的,如果使短时间内大量服务不可达的时候,这个消息如果同步到消费者,那么这个微服务构建的分布式系统将明确的进入不可响应状态。但是同时出现大量生产者 crash 的情况是较低概率的,一般是网络问题导致,即生产者到注册中心之间的链路出现了问题,但是消费者到生产者的链路可能是没问题的,所以 eureka 在这方面采用保守做法,保留自己的注册信息从而使得消费者中已经同步的生产信息不被删除。

相关服务端配置

  • eureka.renewalPercentThreshold:指定触发自我保护模式的阈值(多少已注册客户端非正常断开),范围是 [0.0, 1.0]。
  • eureka.enableSelfPreservation:是否开启自我保护模式,true开启、false关闭
  • eureka.server.eviction-interval-timer-in-ms:客户端剔除时间窗口,个人理解是一个断开连接的客户端最迟要在"确定断开的时间点"之后该时间间隔内从注册中心剔除。单位 ms 。

相关客户端配置

  • eureka.client.lease-renewal-interval-in-seconds:客户端向服务端续约的时间间隔(发送心跳包)。单位 s。
  • eureka.client.lease-expiration-duration-in-seconds:告诉服务端发送的租约(心跳包)过期时间。单位 s。(检测是否需要启动自我保护机制的时间单位)

参考阅读


   转载规则


《Eureka的自我保护机制》 阿钟 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录