当前位置:网站首页>千万级QPS下服务如何才能平滑启动
千万级QPS下服务如何才能平滑启动
2022-08-02 17:43:00 【InfoQ】
背景
原因分析
解决方案
- 第一步要保证系统顺利完全启动完成后,才能有流量访问;
- 第二步小流量预热,通过小部分流量让JVM 虚拟机把高频的代码编译成机器码缓存到 JVM 缓存中,再次使用的时候不会触发临时加载;
- 第三步逐步放到流量到全量,当大流量请求使用热点代码时,不用每次都通过都进行解释,最终实现平滑启动。
系统完全启动
F5探活
注册中心注册
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=service_id1,service_id2
探针探活
<--省略无用信息-->
spec:
containers:
- name: *****
image: *****
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8090
initialDelaySeconds: 5 # 容器启动后多久开始探测
failureThreshold: 10 # 连续探测10次失败表示失败
timeoutSeconds: 10 # 表示容器必须在10s内做出相应反馈给probe,否则视为探测失败
periodSeconds: 5 # 探测周期,每5s探测一次
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8090
initialDelaySeconds: 10 # 容器启动后多久开始探测
timeoutSeconds: 2 # 表示容器必须在2s内做出相应反馈给probe,否则视为探测失败
periodSeconds: 30 # 探测周期,每30s探测一次
successThreshold: 1 # 连续探测1次成功表示成功
failureThreshold: 3 # 连续探测3次失败表示失败
<--省略无用信息-->
小流量预热
开源 Dubbo
- 服务提供端在向注册中⼼注册服务的过程中,将⾃身的预热时⻓ WarmupTime、服务启动时间 StartTime 通过元数据的形式注册到注册中⼼中;
- 服务消费端在注册中⼼订阅相关服务实例列表,调⽤过程中根据 WarmupTime、StartTime 计算个实例所分批的调⽤权重;
- 刚启动 StartTime 距离调⽤时刻差值较⼩的实例权重下,从⽽实现对刚启动应⽤分配更少流量实现对 其进⾏⼩流量预热。
开源美团OCTO-RPC
Serivce Mesh Isito-proxy
message SlowStartConfig {
// Represents the size of slow start window.
// If set, the newly created host remains in slow start mode starting from its creation time
// for the duration of slow start window.
google.protobuf.Duration slow_start_window = 1;
// This parameter controls the speed of traffic increase over the slow start window. Defaults to 1.0,
// so that endpoint would get linearly increasing amount of traffic.
// When increasing the value for this parameter, the speed of traffic ramp-up increases non-linearly.
// The value of aggression parameter should be greater than 0.0.
// By tuning the parameter, is possible to achieve polynomial or exponential shape of ramp-up curve.
//
// During slow start window, effective weight of an endpoint would be scaled with time factor and aggression:
// `new_weight = weight * time_factor ^ (1 / aggression)`,
// where `time_factor=(time_since_start_seconds / slow_start_time_seconds)`.
//
// As time progresses, more and more traffic would be sent to endpoint, which is in slow start window.
// Once host exits slow start, time_factor and aggression no longer affect its weight.
core.v3.RuntimeDouble aggression = 2;
}
总结
- 实例启动,包括JVM、Spring等初始化和一些微服务组件如配置中心的初始化,值得注意的是资源未完全加载前不要注册到注册中心中,可以通过设置延迟注册,让应⽤在充分初始化后再注册到注册中⼼对外提供服务;
- 小流量预热,通过客户端负载和权重算法,使刚启动的实例节点流量成线性增长,最终达到正常水平;
- 全量运行,需要查看JVM、接口相应时间指标监控和日志,保证新启动实例上线没问题。
边栏推荐
- IDEA相关配置(特别完整)看完此篇就将所有的IDEA的相关配置都配置好了、设置鼠标滚轮修改字体大小、设置鼠标悬浮提示、设置主题、设置窗体及菜单的字体及字体大小、设置编辑区主题、通过插件更换主题
- MySQL表的约束
- Navicat 连接Oracle时提示oracle library is not loaded的问题解决
- 攻防世界-favorite_number
- golang刷leetcode滑动窗口(9) 颜色分类
- 安全至上:落地DevSecOps最佳实践你不得不知道的工具
- 创新云集技术咖,工赋汇聚实战派:2022工赋开发者峰会
- 详细教学——1688关键词搜索API操作流程
- 年轻人接棒大妈,金价跌回“4字头”,七夕迎黄金消费小热潮
- 新特性解读 | MySQL 8.0 GIPK 不可见主键
猜你喜欢
Security First: Tools You Need to Know to Implement DevSecOps Best Practices
Cpolar application example of data acquisition equipment
详细教学——1688关键词搜索API操作流程
解决多版本jar包冲突问题
恒驰5真的没大卖
阿波罗 planning代码-modules\planning\lattice\trajectory_generation\PiecewiseBrakingTrajectoryGenerator类详解
MySQL命令(命令行方式,而非图形界面方式)
erp系统和wms系统有什么区别
55.【sort函数的升序降序】
宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码
随机推荐
搭建属于自己的知识库(Wikijs)
golang源码分析(10)slice
golang刷leetcode动态规划(10)编辑距离
KunlunBase 1.0 发布了!
小程序毕设作品之微信体育馆预约小程序毕业设计成品(8)毕业设计论文模板
再获权威认证!马上消费安逸花APP通过中国信通院“金融APP人脸识别安全能力评测”
详细教学——1688关键词搜索API操作流程
MySQL基本语法
字节面试官狂问我:你没有高并发、性能调优经验,为什么录取你?
ffmpeg cannot find libx264 after compilation
H.265视频流媒体播放器EasyPlayer.js集成时报错“SourceBuffer ”如何解决?
载20(S)-人参皂苷/细胞穿膜肽-单克隆抗体-载丝裂霉素白蛋白纳米微球的制备
启航
发挥云网融合优势,天翼云为政企铺设数字化转型跑道
查看数据库数据量大小,占用磁盘大小
红队实战靶场ATT&CK(一)
NeRF:火爆科研圈的三维重建技术大揭秘
Smart Microelectronics Releases Low-Power MM32L0130 Series MCU Products
golang 计算器实现
织梦提示信息提示框美化