Su的技术博客

  • 首页
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • Other
  • 工具
  • 打赏
  • 关于
  1. 首页
  2. Java
  3. 正文
                           

【原创】Eureka源码剖析之六:自我保护机制

2020-01-31 23点热度 0人点赞 0条评论

 

当EurekaServer由于自身发生网络故障等原因无法接收到EurekaClient端发送的心跳(续约)时,不会将未收到心跳(续约)请求的服务下线,虽然这样短时间内可能造成EurekaServer维护的注册列表信息不是完全准确的,但保证了EurekaServer可用性。

 

主要通过expectedNumberOfRenewsPerMin,numberOfRenewsPerMinThreshold(expectedNumberOfClientsSendingRenews新版本,做了优化,具体这里不做分析,有兴趣者可自行研究)这两个值判断是否进入自我保护模式,当每分钟收到的心跳数量小于期望收到的心跳数量,EurekaServer便会进入自我保护模式,不会剔除任何一个服务,直到心跳回复正常后退出自我保护模式。

自我保护模式默认是开启的。服务注册和下线都会更新对应的值:expectedNumberOfRenewsPerMin和expectedNumberOfClientsSendingRenews,配置RenewalPercentThreshold默认值:0.85,expectedClientRenewalIntervalSeconds:30秒。

触发自我保护模式:Renews (last min) < Renews threshold。假如当前有10个服务,那么每分钟续约数Renews (last min)=10 * 2=20,阈值:20 * 0.85=17,这个是正常的不会触发。一旦出现Renews (last min)小于17,则会触发自我保护模式。

 

服务注册:
synchronized (lock) {
    if (this.expectedNumberOfClientsSendingRenews > 0) {
        // Since the client wants to register it, increase the number of clients sending renews
        // 期望客户端发送续约数增1
        this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews + 1;
        // 更新每分钟续约阈值
        updateRenewsPerMinThreshold();
    }
}


// 更新每分钟续约阈值:期望客户端续约数*2(60/30秒默认)*百分比(0.85),即每分钟续约数量
protected void updateRenewsPerMinThreshold() {
    this.numberOfRenewsPerMinThreshold = (int) (this.expectedNumberOfClientsSendingRenews
            * (60.0 / serverConfig.getExpectedClientRenewalIntervalSeconds())
            * serverConfig.getRenewalPercentThreshold());
}
服务下线:
synchronized (lock) {
       if (this.expectedNumberOfClientsSendingRenews > 0) {
           // Since the client wants to cancel it, reduce the number of clients to send renews
           // 期望客户端发送续约数减1
           this.expectedNumberOfClientsSendingRenews = this.expectedNumberOfClientsSendingRenews - 1;
           // 更新每分钟续约阈值
           updateRenewsPerMinThreshold();
       }
   }
在Eureka初始化中,会启动定时调度任务:
在剔除任务EvictionTask中,会根据阈值进行相关剔除操作;在获取实例信息时也会根据是否达到阈值后续约是否过期进行相关判断。
总结

自我保护模式机制,是eureka在防止网络分区等故障时造成服务的“意外不可用”。
它不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,它自动退出自我保护模式。
Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
一般不推荐关闭自我保护模式(默认开启),也不推荐调整阈值低于0.5以下,一般推荐是增加Eureka server服务节点。
 


 

本文仅供学习!所有权归属原作者。侵删!文章来源: 搬运工来架构

标签: 原创 开源框架 源码 eureka 注册中心
最后更新:2023-02-25

Cocodroid

专注Java后端,分享技术。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最新 热点 推荐
最新 热点 推荐
殷浩详解DDD 第四讲:领域层设计规范 既生@Resource,何生@Autowired? Go整洁架构实践 接口优化的常见方案实战总结 QQ音乐高可用架构体系 构建一个布隆过滤器 —— Building a Bloom filter
殷浩详解DDD 第四讲:领域层设计规范Redis为什么这么快?构建一个布隆过滤器 —— Building a Bloom filterQQ音乐高可用架构体系接口优化的常见方案实战总结Go整洁架构实践
用了@Autowired注入,竟然被警告 你所说的“事件驱动”是什么? What do you mean by “Event-Driven”? Eureka源码剖析之五:服务下线 Eureka源码剖析之一:初始化-启动 笔记 | 5种网络IO模型 MySQL性能优化浅析及线上案例讲解

@Autowired (1) @Resource (1) API网关 (1) ddd (6) DP (1) ElasticSearch (1) eureka (7) go (1) HTTP (1) IDEA (1) iOS (1) Java (8) JSR (1) QQ音乐 (1) repository (1) Spring (1) SQL优化 (1) 代理 (1) 依赖注入 (1) 同城双活 (1) 垃圾回收 (1) 定时任务 (1) 容灾 (1) 布隆过滤器 (1) 异地双活 (1) 接口优化 (1) 故障转移 (1) 数据库 (2) 整洁架构 (1) 文件网关 (1) 方案 (2) 服务续约 (1) 注册中心 (7) 流水账 (1) 流量 (1) 第五 (1) 线上案例 (1) 线上问题 (2) 缓存 (1) 缓存击穿 (1) 编译 (3) 网络 (3) 聊聊 (1) 订单 (1) 设计规范 (1) 详解 (1) 连接池 (1) 限流 (1) 领域驱动设计 (4) 高可用 (1)

COPYRIGHT © 2014-2023 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2