代码之家  ›  专栏  ›  技术社区  ›  narendra-choudhary

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

  •  4
  • narendra-choudhary  · 技术社区  · 7 年前

    考虑此设置:

    • 禁用自我保护模式的Eureka服务器,即。 enableSelfPreservation: false
    • 2个Eureka实例,每个实例对应2个服务(例如服务#1和服务#2)。共4个实例。

    和其中一个实例(例如srv#1inst#1,服务#1的实例) 发送了心跳信号,但未到达Eureka服务器

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

    • ServerStep1:服务器发现某个特定实例丢失了心跳信号。
    • ServerStep2:服务器将实例标记为逐出。
    • ServerStep3:服务器的逐出调度程序(定期运行)从注册表逐出实例。

    现在在实例(srv#1inst#1)侧:

    • 实例步骤1:它跳过心跳。
    • InstanceStep2:它意识到心跳信号并没有到达Eureka服务器。它在指数后退的情况下重试。

    哎呀,驱逐和登记不会立即发生。Eureka服务器定期为这两个任务运行单独的调度程序。

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

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

    此问题的答案为 qiangdavidliu 在里面 one of the issues of eureka's GitHub repository

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


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

    1. 实例只有在错过3个连续心跳时才会被逐出
    2. (大多数)心跳不会重试,它们是每30秒的最大努力。心跳将重试的唯一时间是,如果心跳线程上存在线程级错误(即。 Timeout RejectedExecution ),但这应该是非常罕见的。

    让我试着回答你的问题:

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

    A: 经过上述澄清,顺序正确。

    关于驱逐和注册调度器的假设是否正确?

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

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

    • srv#1inst#1是否会在新的注册表副本中,因为它尚未被逐出?
      • 如果是,srv#1inst#1会被标记为上还是下?

    A: 这里有几件事:

    1. 在实例实际被逐出之前,它将是结果的一部分
    2. 逐出并不涉及更改实例的状态,它只是从注册表中删除实例
    3. 服务器保存世界状态的30s缓存,返回的就是这个缓存。因此,在逐出场景中,客户端看起来的确切结果仍然取决于它何时在缓存的更新周期内。

    srv#1inst#1的InstanceStep2发出的重试请求在ServerStep2之后立即到达服务器。

    • 登记处会立即变更吗?
    • 这将如何影响对服务实例#2请求刷新注册表的响应?它将如何影响逐出计划程序?

    A: 还有几件事:

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