Java Chassis 3技术解密:注册中心分区隔离

news2025/1/10 21:08:11

原文链接:Java Chassis 3技术解密:注册中心分区隔离-云社区-华为云

注册中心负责实例的注册和发现,对微服务可靠运行起到举足轻重的作用。实例变更感知周期是注册中心最重要的技术指标之一。感知周期代表提供者的实例注册或者下线后,消费者感知实例注册或者下线的周期。影响实例变更感知周期的技术因素有很多。

  • 数据一致性。一致性指实例在注册中心的一个节点注册,从注册中心的不同节点能否同时读取到实例的注册信息。这个技术因素对于实例变更感知周期有一定影响,比如最终一致性的感知速度会慢,强一致性的感知速度会快。但多数场景,这个技术指标不是核心因素。
  • 变更通知机制。变更通知机制指消费者获取最新实例列表的方式,通常有几种方式:定期Pull的方式,消费者周期性的从注册中心查询实例列表;注册中心Push的方式,注册中心通过长连接、WebSocket等协议,将实例变化通知消费者。定期Pull的方式感知周期相对较长,工作机制比较可靠,容错效率高,对于网络要求低,更加安全;注册中心Push的方式感知周期很短,容易出现事件错乱或者堆积,对于网络规划有一定要求。
  • 注册中心检测实例状态的方式。注册中心检测实例状态的方式表示如何判断实例的状态是正常还是异常。比如Service Center需要实例定期的发送心跳,如果在3个心跳周期未检测到心跳,那么认为实例异常;比如Nacos则根据微服务实例与注册中心的长连接状态判断实例是否异常。

此外,实例管理规模、支持元数据管理等也是注册注册中心比较常见的功能特性。比如Java Chassis 2要求注册中心必须支持契约的注册和管理。

Java Chassis 3的设计目标之一,就是降低对于注册中心功能的依赖,能够支持尽可能多的注册中心,而不降低微服务自身的可靠性。 在描述 Java Chassis 3的实例管理机制之前,先讨论一个典型的问题:注册中心分区隔离。

注册中心分区隔离是指如下场景:

微服务提供者与注册中心之间的网络发生故障,而服务消费者与注册中心之间的网络是正常的,即产生分区隔离。在发生分区隔离的场景下,现有的保活机制都会认为微服务提供者下线,进而导致微服务消费者访问微服务提供者出现大规模失败。分区隔离通常会发生在注册中心在多AZ部署/容灾的场景,微服务提供者和微服务消费者连接的是不同AZ的注册中心实例。在微服务提供者和消费者跨AZ部署的时候,也可能发生。

注册中心分区隔离故障会造成大面积的应用调用失败,是注册中心有关故障中,最严重的故障之一。

  • Ribbon的解决方案

Ribbon在客户端提供了 IPing 接口来检测实例故障,以检测注册中心错误下线实例,而实例实际可以工作的场景。 该机制在多数场景工作良好,然而在容器场景下,可能长期保留错误的实例。因为微服务提供者不是由于分区隔离错误,而是重启的场景下,如果原来的端口被其他服务占用,则会导致微服务消费者始终保留错误的实例。

public interface IPing {
    boolean isAlive(Server server);
}
  • Spring Cloud的解决方案

Spring Cloud的机制和Ribbon类似,提供了 HealthCheckServiceInstanceListSupplier ,并允许开发者定义实例监控状态检测方式。

  • Java Chassis的解决方案

Java Chassis结合实例是否在注册中心查询到(History)、实例状态(Status)、Ping状态(Ping)、隔离状态(Isolation)将实例分组,并给不同的组分配不同的优先级。

在 Java Chassis 3技术解密:负载均衡选择器 中,解密了Java Chassis分组实例使用的机制。当出现注册中心分区隔离的情况,实例在注册中心查询不到,仍然被保留到了 History 分组,只要实例 Ping 状态正常, 这个实例仍然会被使用, 从而防止了实例被错误下线。

Java Chassis还设计了新的Ping机制,解决容器场景下,可能长期保留错误的实例的问题。 Ping机制的核心逻辑包含如下几个部分:

  • 微服务提供者向注册中心注册的时候,生成实例ID。实例ID需要保证进程的每次重启,都是唯一的。
  • 微服务消费者通过PING消息检测微服务提供者的存活状态。PING消息包含微服务提供者的实例ID。
  • 微服务提供者检测PING消息里面的实例ID,如果实例ID与自己的实例ID相同,则返回健康,否则返回异常。

Java Chassis提供了新的健康检查接口:

@RestSchema(schemaId = ManagementEndpoint.NAME, schemaInterface = ManagementEndpoint.class)
public class ManagementEndpointImpl implements ManagementEndpoint {
  private RegistrationManager registrationManager;

  @Autowired
  public void setRegistrationManager(RegistrationManager registrationManager) {
    this.registrationManager = registrationManager;
  }
  
  @Override
  public boolean health(String instanceId, String registryName) {
    String mySelf = registrationManager.getInstanceId(registryName);
    if (StringUtils.isEmpty(mySelf)) {
      return false;
    }
    return mySelf.equals(instanceId);
  }
}

Java Chassis 2结合Service Center的功能设计,共同保障了注册发现的可靠性。Java Chassis 3通过应用客户端技术,降低了对于注册中心的依赖,使得 Java Chassis 3使用不同的注册中心都能够取得很高的可靠性。 内置的实例状态分组管理和创新的Ping机制设计,使得 Java Chassis 3在注册中心分区隔离故障条件下也能稳定的工作。

客户故事:注册中心推空故障是 Nacos 的经典故障,对于系统可靠性运行产生了非常大的影响。推空故障的影响机制和分区隔离故障的影响机制类似。借助于Java Chassis 3,能够将业务影响的时间和范围降到最低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1388478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni书写TP6,环境7.3,随意二开,源码交付。APP小程序H5都有,UI美观

随着数字技术的迅猛发展和教育信息化的推进,智慧校园教务管理系统软件设计开发定制成为教育管理的重要举措。这样的系统可以利用先进的技术手段,提供全面的教务管理功能,提高教育管理的效率和质量。 课程管理:智慧校园教务管理系…

人力资源智能化管理项目(day01:基础架构拆解)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈 一、基础架构拆解 1.拉取模板代码 git clone GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template 项目名 2.core-js…

js 回文串

思路: 判断一个字符串是否为回文字符串的基本思路是比较字符串的正序和倒序是否相同。 两者相同,则该字符串是回文字符串,否则不是。 要实现这一思路,我们可以使用 JavaScript 字符串的一些方法。我是忽略了所有的空格和符号&…

岛屿问题(DFS)

DFS的基本结构 网格结构比二叉树结构稍微复杂一点,它其实是一种简化版的图的结构。要写好网格上的DFS遍历,我们首先要理解二叉树上的DFS遍历方法,再类比写出网格结构上的DFS遍历。我们写的二叉树DFS遍历一般是: public void tra…

我自己总结记忆的23种设计模式

1, 对23种设计模式,大家的第一个印象就是抽象繁琐,记不住!!不常用?? 其实设计模式是非常有用的,大家只要理解设计模式了,思想上就能有质的飞跃! 但是&#…

有哪些好用的视频剪辑工具?这几款剪辑必备

有哪些好用的视频剪辑工具?随着社交媒体的兴起,视频内容已经成为人们获取信息、娱乐和交流的重要方式。对于许多内容创作者来说,选择一款合适的视频剪辑工具是至关重要的。今天,我们就来介绍几款视频剪辑工具,它们各具…

uniapp中,子组件给父页面传值(父组件)

前言 最近在做的一个小程序项目中,有一个身份切换的功能,点击切换按钮时,子组件向父组件传递身份信息,父页面依据这个身份信息对页面进行显示与隐藏。 具体实现 子组件中定义一个点击事件,在这里是identitySwitching()方法 &l…

flink1.15 维表join guava cache和mysql方面优化

优化前 mysql响应慢,导致算子中数据输出追不上输入,导致显示cpu busy:100% 优化后效果两个图对应两个时刻: - - -- 优化前 select l.id,JSON_EXTRACT(r.msg,$$.key1) as msgv (select id,uid from tb1 l where id?) join (select uid,msg from tb2) r on l.uidr.uid;-- 优化…

@Transactional注解导致@DS切换数据源失效

原因 spring 的Transactional声明式事务管理时通过动态代理实现的。 删除事物的注解 增加其他数据库的事务注解 Transactional(rollbackFor Exception.class, propagation Propagation.REQUIRES_NEW)

YOLOv8改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (支持检测、分割、关键点检测)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,本文给大家带来的二次创新机制是通过DiverseBranchBlock(DBB)模块来改进我们的检测头形成一个新的检测头Detect_DBB,其中DBB是一种重参数化模块,其训练时采用复杂结构,推理时…

基于apriori关联规则的商品推荐系统

项目背景: 随着电子商务的快速发展,用户在购物平台上面临了海量商品选择的问题。为了帮助用户更好地找到自己感兴趣的商品,提供个性化的推荐服务变得至关重要。基于Apriori关联规则的商品推荐系统可以根据用户的历史购买记录进行分析&#x…

分布式限流要注意的问题

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 为什么需要匀速限流 同学们回想一下在Guava小节里…

如何部署Wagtail CMS并结合cpolar内网穿透实现远程访问管理界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS,建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

电商新趋势:解析养号的必要性及海外云手机运用攻略

在电商领域,什么最为关键?答案无疑是流量!然而,如何以较低成本获取大量流量成为了许多电商从业者头疼的问题。虽然直接投放广告是一种方式,但在内卷的情况下效果越来越难以令人满意,高昂的广告费用也原来越…

编译与链接(C/C++)

在C/C中关于代码的运行需要经过.c文件到.exe文件,而其中走过这些步骤这需要对原始的.c文件进行编译与链接。对于编译与链接主要构成了翻译环境,经过翻译环境之后生成.exe文件,然后在通过运行环境输出对应的结果。本篇主要讲解编译与链接。 以…

动手搓一个kubernetes管理平台(1)-需求和框架

先拍个脑袋 市面上对于kubernetes集群的管理平台其实不算少,但常用的就那么几个,比如厚重的rancher,比如老而弥坚的kube-dashboard,以及集成了很多其他功能的kubeSphere等,但和其他开源项目一样,为了满足大…

火爆!大厂流出的接口版本号规约,速度收藏

在实际项目开发中,API的版本号控制不仅仅是一个数字游戏,它的使用需遵循语义版本控制(Semantic Versioning)原则,确保代码的每一次更改都能通过版本号的变化得到准确的体现,本篇文章对版本号如何使用做了详…

八款常用uml用例图-画图干货

随着软件开发和系统设计的复杂度不断提升,UML已经成为业界标准。UML用例图作为其中一种重要图表,能够清晰地展示系统功能和用户需求。本文将为你介绍八款常用的UML用例图,助你轻松搞定画图难题! 一、费用报销系统UML用例图 二、登…

使用vite框架封装vue3插件,发布到npm

目录 一、vue环境搭建 1、创建App.vue 2、修改main.ts 3、修改vite.config.ts 二、插件配置 1、创建插件 2、开发调试 3、打包配置 4、package.json文件配置 上一篇文章讲述使用vite《如何使用vite框架封装一个js库,并发布npm包》封装js库,本文将…

Qt中QGraphicsView架构下实时鼠标绘制图形

上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章节中最后展示的动画效果来看,今年主要讲述如何在QGraphicsView架构下,实时拖动鼠标绘制图形! 今天主要以矩形为例,再来看一下展示…