当前位置: 首页 > news >正文

拼多多返利app的服务自动扩缩容策略:基于K8s HPA的弹性架构设计

拼多多返利app的服务自动扩缩容策略:基于K8s HPA的弹性架构设计

大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!

在拼多多返利类APP的服务架构中,流量波动具有显著的“脉冲式”特征——比如大促活动(618、双11)期间请求量激增10倍以上,而凌晨时段流量仅为峰值的1/20。若采用固定资源配置,要么大促时因资源不足导致服务熔断,要么闲时因资源闲置造成成本浪费。基于Kubernetes HPA(Horizontal Pod Autoscaler)的自动扩缩容策略,能实现“流量高峰自动扩容、流量低谷自动缩容”,以下结合实际架构设计与代码案例,详解落地方案。
拼多多返利app

一、架构基础:K8s集群与核心服务部署

首先需完成拼多多返利APP核心服务(商品查询服务、返利计算服务、订单同步服务)的K8s部署,为HPA策略提供基础载体。

1.1 核心服务Deployment配置

以“返利计算服务”为例,编写Deployment.yaml文件,指定资源请求与限制,确保HPA可基于资源指标进行扩缩容:

apiVersion: apps/v1
kind: Deployment
metadata:name: rebate-calculation-servicenamespace: pdd-rebate
spec:replicas: 3  # 初始副本数selector:matchLabels:app: rebate-calculationtemplate:metadata:labels:app: rebate-calculationspec:containers:- name: rebate-calculationimage: registry.juwatech.cn/pdd-rebate/rebate-calculation:v1.2.0ports:- containerPort: 8080resources:requests:  # 资源请求(HPA扩缩容的基础参考)cpu: "500m"  # 500毫核memory: "512Mi"limits:  # 资源限制cpu: "1000m"memory: "1Gi"livenessProbe:  # 存活探针httpGet:path: /actuator/health/livenessport: 8080initialDelaySeconds: 60periodSeconds: 10readinessProbe:  # 就绪探针httpGet:path: /actuator/health/readinessport: 8080initialDelaySeconds: 30periodSeconds: 5

1.2 自定义指标采集:基于Prometheus与Micrometer

HPA默认支持CPU、内存等基础指标,但拼多多返利APP需基于“每秒请求数(QPS)”“接口平均响应时间(RT)”等业务指标扩缩容,需通过Prometheus+Micrometer实现自定义指标采集。在Java服务中集成Micrometer(包路径包含cn.juwatech):

package cn.juwatech.rebate.config;import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;@Configuration
public class MetricsConfig {// 初始化Prometheus指标注册表@Beanpublic MeterRegistry prometheusMeterRegistry() {return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);}// 定义返利计算接口的耗时计时器@Beanpublic Timer rebateCalcTimer(MeterRegistry meterRegistry) {return Timer.builder("rebate.calc.duration").description("Duration of rebate calculation process").register(meterRegistry);}// 定义QPS计数器(通过AOP切面使用)@Beanpublic io.micrometer.core.instrument.Counter rebateRequestCounter(MeterRegistry meterRegistry) {return io.micrometer.core.instrument.Counter.builder("rebate.request.qps").description("QPS of rebate calculation requests").register(meterRegistry);}
}

通过AOP切面统计接口QPS与耗时:

package cn.juwatech.rebate.aspect;import cn.juwatech.rebate.config.MetricsConfig;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MetricsAspect {@Autowiredprivate Counter rebateRequestCounter;@Autowiredprivate Timer rebateCalcTimer;// 环绕通知:统计返利计算接口的QPS与耗时@Around("execution(* cn.juwatech.rebate.service.RebateCalculationService.calculate(..))")public Object recordMetrics(ProceedingJoinPoint joinPoint) throws Throwable {// 计数+1(QPS统计)rebateRequestCounter.increment();// 统计耗时return rebateCalcTimer.record(() -> {try {return joinPoint.proceed();} catch (Throwable e) {throw new RuntimeException(e);}});}
}

二、HPA策略设计:多维度指标触发扩缩容

基于K8s HPA v2版本,支持“基础资源指标+自定义业务指标”组合触发策略,针对拼多多返利APP的流量特征,设计三层扩缩容规则。

2.1 基于CPU的基础扩缩容(保底策略)

当服务CPU使用率超过70%时自动扩容,低于30%时自动缩容,确保资源利用率处于合理区间:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: rebate-calc-hpa-cpunamespace: pdd-rebate
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: rebate-calculation-serviceminReplicas: 2  # 最小副本数(避免缩容至0导致服务不可用)maxReplicas: 10  # 最大副本数(大促时上限)metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70  # CPU使用率阈值70%behavior:scaleUp:stabilizationWindowSeconds: 60  # 扩容稳定窗口(避免频繁扩容)policies:- type: Percentvalue: 50periodSeconds: 60  # 每次扩容50%,间隔60秒scaleDown:stabilizationWindowSeconds: 300  # 缩容稳定窗口(避免误缩容)policies:- type: Percentvalue: 30periodSeconds: 300  # 每次缩容30%,间隔300秒

2.2 基于QPS的业务扩缩容(核心策略)

拼多多返利APP的“返利计算接口”QPS峰值达500,当QPS超过300时扩容,低于100时缩容,确保接口响应及时:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: rebate-calc-hpa-qpsnamespace: pdd-rebate
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: rebate-calculation-serviceminReplicas: 2maxReplicas: 15metrics:- type: Externalexternal:metric:name: prometheus-queryselector:matchLabels:query: "sum(rate(rebate_request_qps[1m])) / kube_deployment_status_replicas_available{deployment=\"rebate-calculation-service\",namespace=\"pdd-rebate\"}"target:type: Valuevalue: 300  # 单Pod QPS阈值300behavior:scaleUp:stabilizationWindowSeconds: 30policies:- type: Fixedvalue: 2periodSeconds: 30  # 每次扩容2个副本,间隔30秒(快速应对流量高峰)

2.3 基于接口RT的兜底扩缩容(保障体验)

当“返利计算接口”平均响应时间超过500ms时,即使CPU、QPS未达阈值,也触发扩容,避免接口超时:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: rebate-calc-hpa-rtnamespace: pdd-rebate
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: rebate-calculation-serviceminReplicas: 2maxReplicas: 12metrics:- type: Externalexternal:metric:name: prometheus-queryselector:matchLabels:query: "avg(rebate_calc_duration_seconds_sum / rebate_calc_duration_seconds_count) * 1000"target:type: Valuevalue: 500  # RT阈值500msbehavior:scaleUp:stabilizationWindowSeconds: 20policies:- type: Percentvalue: 40periodSeconds: 20

三、扩缩容稳定性保障:避坑与优化方案

3.1 避免“扩缩容抖动”:自定义behavior配置

通过stabilizationWindowSeconds设置稳定窗口,避免短时间内流量波动导致HPA频繁扩缩容(如上述YAML中缩容稳定窗口设为300秒,确保流量确实下降后再缩容)。

3.2 数据库连接池动态调整

服务扩容后数据库连接池需同步扩容,避免连接耗尽,通过cn.juwatech.db.DynamicDataSource实现连接池动态配置:

package cn.juwatech.db;import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import javax.sql.DataSource;
import java.util.concurrent.atomic.AtomicInteger;@Component
public class DynamicDataSource {@Value("${spring.datasource.url}")private String jdbcUrl;@Value("${spring.datasource.username}")private String username;@Value("${spring.datasource.password}")private String password;private final AtomicInteger poolSize = new AtomicInteger(10);  // 初始连接池大小private HikariDataSource dataSource;// 初始化数据源public DataSource getDataSource() {if (dataSource == null) {HikariConfig config = new HikariConfig();config.setJdbcUrl(jdbcUrl);config.setUsername(username);config.setPassword(password);config.setMaximumPoolSize(poolSize.get());dataSource = new HikariDataSource(config);}return dataSource;}// 根据Pod数量动态调整连接池大小(每Pod对应10个连接)public void adjustPoolSize(int podCount) {int newPoolSize = podCount * 10;if (newPoolSize != poolSize.get()) {poolSize.set(newPoolSize);dataSource.setMaximumPoolSize(newPoolSize);// 记录连接池调整日志cn.juwatech.log.Logger.info("Dynamic adjust db pool size to: " + newPoolSize);}}
}

通过K8s API监听Pod数量变化,触发连接池调整:

package cn.juwatech.k8s.listener;import cn.juwatech.db.DynamicDataSource;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1PodList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class PodCountListener {@Autowiredprivate ApiClient k8sApiClient;@Autowiredprivate DynamicDataSource dynamicDataSource;// 每30秒查询一次Pod数量@Scheduled(fixedRate = 30000)public void checkPodCount() throws ApiException {CoreV1Api coreV1Api = new CoreV1Api(k8sApiClient);V1PodList podList = coreV1Api.listNamespacedPod("pdd-rebate",null, null, null, null,"app=rebate-calculation",null, null, null, null, null);// 统计Running状态的Pod数量int runningPodCount = (int) podList.getItems().stream().filter(pod -> "Running".equals(pod.getStatus().getPhase())).count();// 动态调整数据库连接池dynamicDataSource.adjustPoolSize(runningPodCount);}
}

基于上述方案,拼多多返利APP在双11大促期间,服务副本数从初始3个自动扩容至15个,接口RT稳定在300ms以内,资源成本较固定配置降低40%。后续可结合机器学习预测流量趋势,实现“提前扩容”,进一步提升服务稳定性。

本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!


文章转载自:

http://rYFm6vE0.Lhrcr.cn
http://HpOoZcjQ.Lhrcr.cn
http://SlAnG798.Lhrcr.cn
http://SaKKU8lP.Lhrcr.cn
http://dmsiydaJ.Lhrcr.cn
http://0B2ufJvT.Lhrcr.cn
http://mC1Q2e8y.Lhrcr.cn
http://dgN695kU.Lhrcr.cn
http://PBeQWFWW.Lhrcr.cn
http://yNxorD2r.Lhrcr.cn
http://CtzD9pOX.Lhrcr.cn
http://JBObVUDL.Lhrcr.cn
http://zg9ygIC6.Lhrcr.cn
http://LVIHTiLi.Lhrcr.cn
http://e8DrVa5R.Lhrcr.cn
http://nyRtJw5R.Lhrcr.cn
http://FEFNjQpu.Lhrcr.cn
http://iMBU4BWr.Lhrcr.cn
http://2WSqCaPX.Lhrcr.cn
http://okv6VdgD.Lhrcr.cn
http://s2vZeGAI.Lhrcr.cn
http://QyOM0NFZ.Lhrcr.cn
http://jdjkhGCi.Lhrcr.cn
http://JagFhv8e.Lhrcr.cn
http://KzxQeoNJ.Lhrcr.cn
http://3Vf05Xzy.Lhrcr.cn
http://vehbVEJf.Lhrcr.cn
http://O1Wv0Bjw.Lhrcr.cn
http://OWbu0qWz.Lhrcr.cn
http://yW6paqYt.Lhrcr.cn
http://www.dtcms.com/a/383132.html

相关文章:

  • 每日前端宝藏库 | Lodash
  • LeetCode 978.最长湍流子数组
  • Java连接电科金仓数据库(KingbaseES)实战指南
  • 2025 年 AI 与网络安全最新趋势深度报告
  • PDF发票提取工具快速导出Excel表格
  • 2. BEV到高精地图的全流程,本质上是自动驾驶**车端(车载系统上传bev到云端)与云端(云端平台处理这些bev形成高精地图)协同工作
  • Nature 子刊:儿童情绪理解的认知发展机制
  • git pull还是git pull -r?
  • 使用 LMCache + vLLM 提升 AI 速度并降低 GPU 成本
  • 快速排序:高效的分治排序算法
  • stap用法
  • 鸿蒙Next ArkWeb网页文件上传与下载完全指南
  • 云轴科技ZStack AI多语种翻译平台建设实践
  • Android SDK中关于BoardConfig.mk的宏定义继承和覆盖规则
  • 链表与数组
  • 【Python】字符串
  • 【Python】实现一个文件夹快照与比较工具
  • Python的深度学习
  • 自动化测试的概念
  • [QT]信号与槽
  • 高精度运算:大数计算全攻略
  • LeetCode 3302.字典序最小的合法序列
  • 深入解析3x3矩阵:列优先与行优先约定的全面指南
  • Codeforces 1049 Div2(ABCD)
  • 【开题答辩全过程】以 “居逸”民宿预订微信小程序为例,包含答辩的问题和答案
  • AWS IAM 模块全面优化:实现完整生命周期管理与性能提升
  • RK3568 PWM驱动基础知识
  • 贪心算法应用:钢铁连铸优化问题详解
  • 9. LangChain4j + 整合 Spring Boot
  • 返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践