Spring cloud 当Eureka实例在关闭自我保护的情况下跳过针对Eureka服务器的心跳时会发生什么?

Spring cloud 当Eureka实例在关闭自我保护的情况下跳过针对Eureka服务器的心跳时会发生什么?,spring-cloud,netflix-eureka,spring-cloud-netflix,Spring Cloud,Netflix Eureka,Spring Cloud Netflix,考虑以下设置: 禁用自我保护模式的Eureka服务器,即启用自我保护:false 2个Eureka实例,每个实例对应2个服务(例如服务1和服务2)。共4个实例 其中一个实例(比如srv#1inst#1,一个服务实例#1)发送了心跳信号,但没有到达Eureka服务器 好的,在服务器端按顺序执行以下操作: 服务器步骤1:服务器观察到某个特定实例丢失了心跳信号 ServerStep2:服务器将实例标记为逐出 ServerStep3:服务器的逐出计划程序(定期运行)从注册表逐出实例 现在在实例(

考虑以下设置:

  • 禁用自我保护模式的Eureka服务器,即启用自我保护:false
  • 2个Eureka实例,每个实例对应2个服务(例如服务1和服务2)。共4个实例
其中一个实例(比如srv#1inst#1,一个服务实例#1)发送了心跳信号,但没有到达Eureka服务器

好的,在服务器端按顺序执行以下操作:

  • 服务器步骤1:服务器观察到某个特定实例丢失了心跳信号
  • ServerStep2:服务器将实例标记为逐出
  • ServerStep3:服务器的逐出计划程序(定期运行)从注册表逐出实例
现在在实例(srv 1inst 1)端:

  • 实例步骤1:它跳过心跳
  • InstanceStep2:它意识到心跳并没有到达Eureka服务器。它在指数后退的情况下重试
哎呀,驱逐和登记不会马上发生。Eureka服务器定期为这两个任务运行单独的计划程序

我有一些与此过程相关的问题:

  • 序列正确吗?如果没有,我错过了什么
  • 关于驱逐和登记的假设正确吗
  • 服务#2的实例在ServerStep2之后立即从服务器请求新的注册表副本。
    • srv#1inst#1是否会在新的注册表副本中,因为它尚未被逐出?
      • 如果是,srv 1 INST 1的标记是上调还是下调
  • srv#1inst#1的InstanceStep2的重试请求在ServerStep2之后立即到达服务器。
    • 登记处会立即变更吗
    • 这将如何影响对服务实例2请求刷新注册表的响应?它将如何影响驱逐计划程序

    • 这个问题由in回答

      为了完整起见,我在这里加上他的解释


      在我具体回答问题之前,这里有一些关于心跳和驱逐(基于默认配置)的高级信息:

    • 实例只有在错过3次连续心跳时才会被逐出
    • (大多数)心跳不会重试,而是每30秒一次。心跳将重试的唯一时间是心跳线程上存在线程级错误(即
      超时
      拒绝执行
      ),但这应该非常罕见
    • 让我试着回答你的问题:

      序列正确吗?如果没有,我错过了什么

      答:经过上述澄清,顺序是正确的

      关于驱逐和登记的假设正确吗

      答:逐出由内部调度程序处理。注册由注册请求的处理程序线程处理

      服务#2的实例在ServerStep2之后立即从服务器请求新的注册表副本

      • srv#1inst#1是否会在新的注册表副本中,因为它尚未被逐出?
        • 如果是,srv 1 INST 1的标记是上调还是下调
      答:这里有几点:

    • 在实例实际被逐出之前,它将是结果的一部分
    • 逐出并不涉及更改实例的状态,它只是从注册表中删除实例
    • 服务器拥有世界状态的30秒缓存,返回的就是这个缓存。因此,在逐出场景中,客户端所看到的确切结果仍然取决于它何时落在缓存的更新周期内
    • srv#1inst#1的InstanceStep2的重试请求在ServerStep2之后立即到达服务器

      • 登记处会立即变更吗
      • 这将如何影响对服务实例2请求刷新注册表的响应?它将如何影响驱逐计划程序
      答:还有几件事:

    • 当实际驱逐发生时,我们会检查每个被驱逐者的时间,看看他们是否有资格被驱逐。如果实例能够在此事件之前更新其心跳,则它不再是逐出的目标
    • 所讨论的3个事件(在驱逐时评估驱逐资格、更新实例的心跳状态、生成要返回到读取操作的结果)都是异步发生的,它们的结果将取决于执行时对上述标准的评估