首页 > 其他分享 >优雅启动:避免流量打到没有启动完成的节点

优雅启动:避免流量打到没有启动完成的节点

时间:2024-11-19 21:43:08浏览次数:3  
标签:调用 服务 应用 启动 优雅 Bean 注册 节点

背景

运行了一段时间后的应用,执行速度会比刚启动的应用更快。在运行过程中,JVM虚拟机会把高频的代码编译成机器码,被加载过的类也会被缓存到JVM缓存中,再次使用的时候不会触发临时加载,这样就使得“热点”代码的执行不用每次都通过解释,从而提升执行速度。

这些“临时数据”,在应用重启后就消失了。刚启动的应用就承担像停机前一样的流量,会使应用在启动之初就处于高负载状态,从而导致调用方过来的请求可能出现大面积超时,进而对线上业务产生损害行为

让应用一开始只接少许流量。低功率运行一段时间后,再逐渐提升至最佳状态。【启动预热

什么是启动预热?

简单来说,就是让刚启动的服务提供方应用不承担全部的流量,而是让它被调用的次数随着时间的移动慢慢增加,最终让流量缓和地增加到跟已经运行一段时间后的水平一样。

RPC中如何实现启动预热

调用方负载均衡在选择连接的时候,区分一下是否是刚启动不久的应用,对于刚启动的应用,可以让它被选择到的概率特别低,但这个概率会随着时间的推移慢慢变大,从而实现一个动态增加流量的过程。

具体实现

调用方如何知道服务提供方启动时间

  • 一种是服务提供方在启动的时候,把自己启动的时间告诉注册中心
  • 另外一种就是注册中心收到的服务提供方的请求注册时间

调用方通过服务发现,除了可以拿到IP列表,同时拿到对应的启动时间。把该时间作用在负载均衡上,基于权重的负载均衡,但是这个权重是由服务提供方设置的,属于一个固定状态。现在要让这个权重变成动态的,并且是随着时间的推移慢慢增加到服务提供方设定的固定值,整个过程如下:

image-20241119212710992

保证当服务提供方运行时长小于预热时间时,对服务提供方进行降权,减少被负载均衡选择的概率,避免让应用在启动之初就处于高负载状态,从而实现服务提供方在启动后有一个预热的过程。

启动预热更多是从调用方的角度出发,去解决服务提供方应用冷启动的问题,让调用方的请求量通过一个时间窗口过渡,慢慢达到一个正常水平,从而实现平滑上线。

服务提供方出发,与热启动息息相关,那就是延迟暴露

延迟暴露

Spring容器会顺序加载Spring Bean,如果某个Bean是RPC服务的话,不光要把它注册到Spring-BeanFactory里面去,还要把这个Bean对应的接口注册到注册中心。注册中心在收到新上线的服务提供方地址的时候,会把这个地址推送到调用方应用内存中;当调用方收到这个服务提供方地址的时候,就会去建立连接发请求。

服务提供方应用可能还在加载其它的Bean。对于调用方来说,只要获取到了服务提供方的IP,就有可能发起RPC调用,但如果这时候服务提供方没有启动完成的话,就会导致调用失败,从而使业务受损。

如何避免服务启动尚未完成,就有流量打过来?

RPC服务注册到注册中心时机过早,这就导致在后续加载没有完成的情况下服务提供方的地址就被服务调用方感知到了。

接口注册到注册中心的时间挪到应用启动完成后。具体的做法就是在应用启动加载、解析Bean的时候,如果遇到了RPC服务的Bean,只先把这个Bean注册到Spring-BeanFactory里面去,而并不把这个Bean对应的接口注册到注册中心,只有等应用启动完成后,才把接口注册到注册中心用于服务发现,从而实现让服务调用方延迟获取到服务提供方地址。

上述方法仅能保证服务启动完毕,但是JVM内存还是冷的,此时如果大量请求进来,依旧可能出现大面积超时。

如何解决?

利用服务提供方把接口注册到注册中心的那段时间

在服务提供方应用启动后,接口注册到注册中心前,预留一个Hook,让用户实现可扩展的Hook逻辑。Hook里面模拟调用逻辑,从而使JVM指令能够预热起来,也可以在Hook里面事先预加载一些资源,只有等所有的资源都加载完成后,最后才把接口注册到注册中心。整个应用启动过程如下:

image-20241119214233761

可以预留一些接口,用户可以自定义扩展,在应用启动完毕之后,发布注册中心之前,做“启动预热”。

标签:调用,服务,应用,启动,优雅,Bean,注册,节点
From: https://blog.csdn.net/qq_43417581/article/details/143896508

相关文章

  • linux启动流程
    Linux启动流程笔记系统目录结构/boot目录内容[root@web01boot]#lsconfig-4.18.0-305.3.1.el8.x86_64initramfs-4.18.0-305.3.1.el8.x86_64kdump.imgefiloadergrub2......
  • 24. 两两交换链表中的节点
    https://leetcode.cn/problems/swap-nodes-in-pairs/?envType=study-plan-v2&envId=top-100-liked对于我们正常交换单向链表的两个节点我们需要知道三个节点的信息,1.对于a->b->c,我们要交换a、b就要知道a、b、c三个节点,因为我们需要将a的next指向c,将b的next指向a,由于b->c这条......
  • VMware无法启动/VMware和wsl冲突问题/VMware与Hyper-V冲突问题
    0前言第二次遇到这个问题,原因是因为我在电脑上下载了WSL。原因虚拟化技术依赖于底层硬件(如IntelVT-x或AMD-V)的支持,而不是依赖于操作系统。VMware使用的是VMware自身的虚拟化技术,而WSL则依赖于Windows自身的的Hyper-V或其他内建虚拟化技术。虽然用的虚拟化机制不一样......
  • vmware centos7.9虚拟机死机无法正常启动
    【问题】启动centos7.9虚拟机出现Generating"/run/initramfs/rdsosreport.txt"【原因】服务器卡死,经理强制关机重启导致【解决】1.使用命令ls/dev/mapper查询出/dev/mapper目录下的文件,查看后缀为-root的文件ls/dev/mapper2.查出centos-rootcentos-swapcontrol三个......
  • Linux系统启动慢/无法启动的排查方法
    Linux系统启动慢或无法启动的问题,通常需要综合考虑硬件、内核、服务配置等多方面因素进行排查。以下是详细的排查步骤和方法:1.硬件检查确认硬件状态:检查硬盘、内存、CPU等是否正常,特别是硬盘是否存在坏道(使用smartctl检测)。smartctl-a/dev/sdX拔插外部设备:移除多余......
  • jenkins远程启动任务,不登录触发远程构建
    前提:之前写了一篇文章是如何远程触发的,但是如果用web请求必须要有登录信息,这次找了一个插件,可以不需要登录就远程触发1、首先去系统管理->管理插件里边,搜索并安装插件 BuildAuthorizationTokenRootPlugin,不会安装插件的先去搜一下,安装好后如下图: 2、打开当前登录用户设......
  • 大促系统优化之应用启动速度优化实践
    作者:京东零售宋维飞一、前言本文记录了在大促前针对SpringBoot应用启动速度过慢而采取的优化方案,主要介绍了如何定位启动速度慢的阻塞点,以及如何解决这些问题。希望可以帮助大家了解如何定位该类问题以及提供一些解决此类问题的思路。下文介绍的JSF为京东内部RPC框架,类似于阿里......
  • 【迅为】瑞芯微itop-RK3568开发板Linux+HAL启动测试
    迅为iTOP-RK3568开发板AMP AMPSDK支持Rockchip平台异构多系统AMP(非对称多核架构)的开发软件包,支持Linux(Kernel)、Standalone(Hal)、RTOS(RT-Thread)组合AMP构建形式。可以满足一些特定行业应用,如电力物联网、电网继电保护、电力系统安全控制、工业自动化的需求。     ......
  • Ollama:实现本地AI大语言模型命令行启动的专业部署方案
    一、Ollama是什么?Ollama是一个强大的开源框架,专为在本地机器上便捷地部署和运行大型语言模型(LLM)而设计。以下是对Ollama的详细介绍:一、主要功能特点简化部署:Ollama通过优化的Docker容器化技术,将复杂的模型部署过程简化,使得非专业用户也能方便地管理和运行这些大型语言模型。......
  • linux 启动数据库和Teamcenter
    1.启动数据库:[infodba@tc24vm~]$exportORACLE_HOME=usr/apps/LINUX.X64_193000_db_home[infodba@tc24vm~]$exportORACLE_HOME=/usr/apps/LINUX.X64_193000_db_home[infodba@tc24vm~]$exportORACLE_SID=tc[infodba@tc24vm~]$cd$ORALCE_HOME[infodba@tc24vm~]$cd$OR......