不管你是刚把微服务迁到云上的 K8s 集群,还是已经跑了好几年的业务,MQ 消息积压这个坑,早晚会踩到。高峰期生产者一顿猛灌,消费者处理不过来,队列肉眼可见地涨,业务延迟拉满,下游定时任务越积越多,最后变成雪崩。常规做法是人工看监控、手动扩容,或者干脆把所有消费者实例常年拉满,成本高不说,半夜也得起来处理。
我这边实际落地过的方案是用 K8s 的 HPA 配合 KEDA(Kubernetes Event-driven Autoscaling),以 MQ 队列长度作为伸缩信号,自动调整消费者副本数,消息积压时快速扩容,队列清空后自动缩容。这套方案跑下来,基本告别了"半夜盯着 RabbitMQ 看板手动加副本"的日子。这篇文章会把我的配置、参数调优思路和踩过的坑全部写出来,适合 K8s 运维、中间件负责人,以及正在做微服务弹性伸缩改造的开发者参考。
1. 消息积压场景与 HPA 的天然短板
1.1 消息积压是怎么发生的
先复盘一下消息积压最常见的几个触发点,这样后面调参的时候你才知道自己重点该防哪一个。
第一类是上游流量突增。电商秒杀、批量数据导入、第三方回调风暴,任何一次流量尖峰都会让生产速率在短时间内超过消费速率。第二类是消费者下游依赖变慢。这不是消费者代码本身慢,而是消费者要查的数据库、要调的下游接口变慢了,比如数据库连接池满了、某个第三方 API 响应从 50ms 变成 3s,消费者 pod 的 CPU 可能很低,但每条消息的处理时间直线上升,积压就开始了。第三类是消费者实例数固定,根本没有弹性能力。这其实是最常见的,很多团队上线时就把 Deployment 的 replicas 写死成 3 个,平时够用,一旦流量上来只能干瞪眼。
消息积压的危害不用多说:实时业务延迟变高,积压的数据会占队列内存或磁盘,重试机制可能造成重复消费,最终触发下游的限流和熔断,引发更大范围故障。所以"发现积压后自动扩容"这个能力,不是锦上添花,而是生产环境的刚需。
1.2 传统 HPA 为什么救不了 MQ
很多朋友第一反应是:K8s 自带 HPA,为什么不直接用?HPA 确实能自动扩缩容,但它解决的是 CPU 和内存这类资源指标问题,对 MQ 场景属于"天生迟钝"。
举个实际例子。消费者从 RabbitMQ 拉消息,然后写数据库,瓶颈是数据库连接池而不是 CPU。这时候消费者 pod 的 CPU 使用率可能只有 20%,内存也正常,HPA 一看指标没超阈值,坚决不扩容。而队列里的消息已经堆积了几十万条,消费者处理速度完全跟不上。HPA 看不到队列长度,也就不知道正在发生事故。
就算你给它配了自定义指标,HPA 本身也没有内置 MQ 的采集能力。你需要额外部署 Prometheus Adapter 之类的组件,自己写查询把队列长度暴露成 metrics,再把 metrics 转成 HPA 能消费的外部指标。这一套配置链路过长,维护成本不低,而且不同 MQ 的指标语义差别很大,每次接入新队列都得重写一遍。我当年手工搭过一次,光是调 PromQL 和 HPA metricName 对应关系就折腾了两天。
更关键的是,HPA 原生策略里没有"从 0 扩到 1"这种突发场景的良好处理。假如你的消费者服务在无消息时可以缩到 0,那么消息进来后需要先创建 Pod、拉镜像、启动应用,这个过程可能要 1 分钟甚至更久,HPA 默认是做不到在无负载时把副本降到 0 再快速拉起的。
所以结论很明确:消息积压这类事件驱动场景,需要的是能感知事件源的伸缩器,而不是只看资源使用率的传统 HPA。KEDA 就是干这个的。
2. KEDA 架构与伸缩原理
2.1 KEDA 的核心组件
KEDA 是目前社区里最成熟的 Kubernetes 事件驱动自动伸缩方案,它是 CNCF 项目,定位就是"Event-driven autoscaling"。它不是要替代 HPA,而是给 HPA 装上"外部事件源的眼睛",让 HPA 能够根据 RabbitMQ 队列深度、Kafka 消费滞后量、Prometheus 指标、数据库连接数等事件信号来决定副本数。
KEDA 的架构中有三个关键角色:
- Operator :负责监听 ScaledObject 和 ScaledJob 自定义资源。集群里创建 ScaledObject 后,Operator 会自动生成一个对应的 HPA 对象,并负责管理整个伸缩器的生命周期。
- Metrics Adapter :实现 Kubernetes 的 External Metrics API,把各种外部事件源的指标统一暴露给 HPA。HPA 定时从 external.metrics.k8s.io 这个 API 拉取指标,然后计算期望副本数。
- Scaler :是 KEDA 连接具体事件源的插件层。KEDA 内置了 50 多种 scaler,从 RabbitMQ、Kafka、Redis、MySQL 到 Prometheus、AWS SQS,基本覆盖了主流的消息系统和中间件。
当你创建 ScaledObject 之后,KEDA 的 Operator 会在同一个命名空间帮你生成一个名为类似
keda-hpa-<scaledobject-name>
的 HPA,你直接
kubectl get hpa
就能看到。这就是"KEDA 驱动 HPA"的直观体现:KEDA 负责感知事件源,HPA 负责执行 K8s 层面的扩缩容。
2.2 KEDA 的伸缩模型:从 HPA 到 ScaledObject
理解 KEDA 的伸缩模型,核心是抓住几个概念:触发器(Trigger)、轮询间隔(pollingInterval)、冷却时间(cooldownPeriod)、副本上下限(minReplicaCount / maxReplicaCount)以及激活阈值(activationThreshold)。
KEDA 的 Scaler 会按照 pollingInterval 周期性地去查询事件源,比如每隔 15 秒查一次 RabbitMQ 的指定队列当前有多少条消息。如果队列长度超过了你设定的 value,KEDA 就会通过外部指标 API 告诉 HPA"指标超了",HPA 计算期望副本数并扩容。当队列长度回落后,KEDA 继续上报低指标,HPA 会等待 cooldownPeriod(冷却时间),确保消息确实清完了,再逐步缩容。
这里有个关键点很多人第一次接触容易搞混:KEDA 并不是自己直接改 Deployment 的副本数,它做的是"指标搬运工 + 伸缩策略管家",最终伸缩动作还是由 HPA 执行。这样设计的好处是,你仍然可以享受 HPA 自带的各种保护机制,比如扩容限速、缩容稳定窗口,也可以通过 ScaledObject 的高级配置透传 HPA 的 behavior 策略。
你可以把 KEDA 理解成一个"哨兵":它盯着 MQ 队列的长度,一旦超过阈值,就告诉 HPA 该加人了;等队列清空了,再告诉 HPA 可以休息了。这个模型非常直观,也容易排查问题。
3. 从零跑通一套 KEDA + RabbitMQ + 消费者方案
3.1 部署环境与组件安装
为了让你能直接复现,我以 Kubernetes 1.26 集群为例,消息中间件用 RabbitMQ。KEDA 官方建议 K8s 1.21 以上,集群版本如果太老,外部指标 API 的支持会有差异。
第一步,安装 KEDA。我用 Helm 安装,命令如下:
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda
安装完查一下 Pod 状态:
kubectl get pods -n keda
正常情况下应该有
keda-operator
、
keda-metrics-apiserver
等 Pod 处于 Running。然后检查外部指标 API 是否注册成功:
kubectl get apiservice | grep -E "metrics|keda"
如果看到类似
external.metrics.k8s.io/v1beta1
的 APIService,就说明 KEDA 的 Metrics Adapter 已经注册成功,HPA 之后可以查询到由 KEDA 暴露的外部指标。
接下来部署 RabbitMQ。为了测试方便,我直接通过 Helm 装到集群内:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install rabbitmq bitnami/rabbitmq --namespace default \
--set auth.username=admin \
--set auth.password=admin123
等 RabbitMQ 的 Pod 启动后,创建一个测试队列 task_queue。可以用
kubectl exec
进去操作:
kubectl exec -it rabbitmq-0 -- bash
rabbitmqadmin declare queue name=task_queue durable=true
我在实际生产里 RabbitMQ 一般是独立部署在集群外的,KEDA、消费者和生产者通过同一个 AMQP 地址访问,原理完全一样。
3.2 消费者服务与基础部署
现在需要有一个消费者服务。我这里用一个 Spring Boot 应用的镜像做例子,逻辑很简单:从 task_queue 拉取消息,模拟每条消息处理耗时 200ms,然后手动确认(ack)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mq-consumer
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: mq-consumer
template:
metadata:
labels:
app: mq-consumer
spec:
containers:
- name: consumer
image: harbor.local/app/mq-consumer:1.0.0
resources:
requests:
cpu: 200m
memory: 256Mi
这里必须给 Pod 配置 resources.requests,因为 HPA 在计算副本数时依赖 Pod 的 resource 信息,而且没有 requests 的 Pod 在缩容时可能会被 scheduler 直接驱逐,行为很别扭。
为了让 HPA 能够基于 MQ 队列长度扩缩容,我们需要创建一个 KEDA 的 authentication 对象,把 RabbitMQ 的连接串交给 KEDA,让 KEDA 可以通过管理接口查询队列状态。
先在 K8s 里创建 Secret 存连接串:
kubectl create secret generic rabbitmq-secret \
--from-literal=host=amqp://admin:admin123@rabbitmq.default.svc.cluster.local:5672/
然后创建 TriggerAuthentication:
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-rabbitmq-auth
spec:
secretTargetRef:
- parameter: host
name: rabbitmq-secret
key: host
3.3 创建 ScaledObject:让队列长度驱动消费者副本数
接下来就是最核心的一步,创建 ScaledObject,把 RabbitMQ 的 task_queue 和消费者 Deployment 绑定起来。
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaledobject
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: mq-consumer
minReplicaCount: 1
maxReplicaCount: 20
pollingInterval: 15
cooldownPeriod: 60
triggers:
- type: rabbitmq
metadata:
protocol: amqp
queueName: task_queue
mode: QueueLength
value: "10"
activationThreshold: "1"
authenticationRef:
name: keda-rabbitmq-auth
创建完立刻看一下 HPA:
kubectl get hpa
KEDA 会自动生成一个 HPA 对象,名称类似
keda-hpa-rabbitmq-scaledobject
,它的 Metrics 列会显示一个外部指标,比如
external/rabbitmq-queue-task_queue
。到现在为止,整套弹性伸缩链路已经打通。
我实际第一次验证的时候,看到 HPA 列表里出现 external 类型指标,还是很兴奋的——这意味着队列长度已经真正变成了 K8s 的伸缩决策依据。至于参数为什么这么配、每个字段的含义,接下来详细说。
4. ScaledObject 配置参数与调优细节
4.1 触发器参数背后的语义
很多第一次接触 KEDA 的人会被 triggers 里的 metadata 搞晕,特别是 RabbitMQ 这个 scaler,参数组合比较多。我按实际使用频率逐个拆解。
先看
mode
,RabbitMQ scaler 支持几种模式,最常用的是
QueueLength
、
MessageRate
和
MessagesUnacked
。
- QueueLength :表示队列中的消息总数。这是最直观的积压指标,也是我线上主要使用的模式。
-
MessageRate
:表示消息的流入传出速率,需要结合
value来控制水位,适合对吞吐速率有明确预期的场景。 - MessagesUnacked :表示未被确认的消息数。如果消费者是手动 ack 模式,拿到消息但处理中未确认的消息都会被算进去,这个指标能反映"消费者手里正在处理的积压量"。
我们主要说 QueueLength。
value
字段的含义是"每个副本的平均目标队列长度"。也就是说,如果 value 设为 10,当前有 1 个消费者副本,队列里有 100 条消息,HPA 计算出的期望副本数是:
ceil(100 / 10) = 10
。反过来,随着消费者扩容,队列长度下降,期望副本数也会随之回落。
这里有个容易误解的地方:
value
并不是说"每条消息允许延迟 10 秒"之类,而是 HPA 目标水位。你要结合单副本消费能力和积压容忍度来设。比如你的消费者单副本每秒可以处理 50 条消息,积压 500 条也就 10 秒能清完,那 value 可以设大一点,比如 50;如果业务对延迟非常敏感,希望队列里基本没有积压,那 value 就设小一点,比如 5 或者 10。设太小也有风险,会因为消息波动频繁触发扩容,HPA 反复跳动,反而影响稳定性。
activationThreshold
是近几年 KEDA 版本里才用得比较顺手的一个参数。它的作用是:当消息量低于这个激活阈值时,KEDA 会向 HPA 上报一个 0 值,HPA 就不会因为"队列里还有 1 条消息"这种小事去扩容。比如设置
activationThreshold: "1"
,那么队列里只有 1 条消息时不会扩容;超过 1 条才开始正常计算。这个参数对防止毛刺缩放非常有用。
4.2 pollingInterval 与 cooldownPeriod 如何权衡
pollingInterval 默认是 30 秒,cooldownPeriod 默认是 300 秒(5 分钟)。这两个参数我花了不少时间调优,说点实际经验。
pollingInterval 影响的是 KEDA 检查队列长度的频率。如果你希望 30 秒内就感知到积压并开始扩容,可以把 pollingInterval 调到 10~15 秒。但也要注意,pollingInterval 太短会对 MQ 的管理接口造成压力,尤其是队列数量多、集群大的时候,RabbitMQ 的 management API 本身也有性能开销。15 秒是一个比较稳妥的中间值,线上如果积压发生得非常突然,再调成 5~10 秒。
cooldownPeriod 是 HPA 判断"可以缩容"之前必须等待的时间窗口。默认 300 秒的好处是避免流量抖动时副本数反复横跳。但如果你把 cooldownPeriod 设成 300 秒,高峰期结束后队列已清空,消费者却还要保持 20 个副本跑 5 分钟,这就有点浪费。我实际调优下来,一般把 cooldownPeriod 设置为 60~120 秒。比如上述配置里我写的是 60 秒,因为我们的消费者扩容后很快能把队列消费完,同时也希望能在短时间内回收资源。
需要注意,缩放方向如果配置不当,会出现"刚扩容完,又立刻缩容"的抖动。建议配合
advanced.hpaConfig.behavior
来控制扩容和缩容的速度节奏,这在后面生产环境章节会讲到。
4.3 副本上下限与从 0 扩容的适配
minReplicaCount
和
maxReplicaCount
的意义不问可知,但有几个细节要特别提醒。
第一,
minReplicaCount=0
是 KEDA 的招牌能力之一,但它并不适合所有业务。如果你的消费者应用是无状态的,启动很快,消费逻辑可以容忍消息延迟几分钟,那 min=0 确实能节省大量资源。但如果你的消费者是 Java 应用,启动要几十秒甚至更久,或者业务对消息延迟有严格要求,我不建议设成 0。因为消息进来后 Pod 要从 0 开始创建,冷启动时间会直接变成消息延迟,用户可感知的延迟一下就上去了。
第二,当你设置
minReplicaCount=0
时,
activationThreshold
尤其重要。如果没有 activationThreshold,队列里出现 1 条消息就可能触发 KEDA 创建 Pod,高频低量的消息流会导致 Pod 频繁创建和销毁,增加不稳定性。
第三,maxReplicaCount 不是越大越好。扩容后每个消费者 Pod 都会建立到 RabbitMQ 的 AMQP 连接、持有数据库连接池、占用下游服务资源。我曾经在一次压测里把 maxReplicaCount 设成 30,结果 30 个消费者同时起来,RabbitMQ 的 connection 直接被占满,下游数据库连接池也被打爆。所以 maxReplicaCount 一定要结合下游依赖的承载能力来评估,而不是只看队列积压的严重程度。
4.4 KEDA 生成的 HPA 与原生 HPA 的关系
这里有个很容易踩的坑:KEDA 创建 ScaledObject 后会自动生成一个 HPA,如果你自己再手动给同一个 Deployment 创建一个 HPA,两个 HPA 会同时作用于副本数,互相覆盖,表现就是副本数一会儿 3 个一会儿 10 个,完全失控。
KEDA 自动生成的 HPA 名字规律是
keda-hpa-<scaledobject-name>
,你可以通过
kubectl get hpa -l keda
之类的方式查看。在排查问题的时候,优先看这个 HPA 的事件和指标,不要自己另建。
另外,KEDA 的 HPA API 版本问题也值得注意。较新版本的 KEDA 会自动使用 autoscaling/v2 的 HPA,因此你在
kubectl get hpa
里看到的列名、行为策略配置都会更丰富。如果集群版本较老,可能需要手动指定 advanced 配置来适配。
5. 生产环境中的常见问题与排查经验
5.1 缩到 0 再扩容的冷启动问题
前面说了 minReplicaCount=0 可以省钱,但实际生产里我遇到最典型的问题是:消息到来时消费者从 0 到 Ready 需要时间,这个窗口期队列积压持续增加,一旦消费者 Ready 后需要处理的消息量远超单副本能力,HPA 又要进行新一轮扩容,整个系统的"爬坡"过程会显得很慢。
我这里给一个比较有效的组合拳:设置合理的 readinessProbe,让新 Pod 在真正能消费消息之前不要进入 Ready 状态,避免流量被错误的调度;同时把 minReplicaCount 设成 1 而不是 0,如果业务对延迟不敏感可以设 0,但必须接受冷启动时间作为消息延迟的一部分。
如果你的服务支持优雅缩容,比如消费者在处理完当前消息后才退出,那配合 cooldownPeriod 和 HPA 的缩容稳定窗口,可以做到几乎无损缩容。这里我建议对消费者设置 preStop hook 和终止前等待时间,让 K8s 在终止 Pod 之前给消费者留出处理完正在处理消息的时间。
5.2 扩容太猛导致下游被打爆
消息积压严重时,KEDA 会驱动 HPA 快速扩容,这个"快速"有时候会把下游直接打挂。我这边压测时出现过一次事故,队列积压了 8 万条,maxReplicaCount 设了 20,HPA 一口气把副本数拉到了 20,20 个消费者同时去消费,数据库连接池瞬间被打满,原本 100ms 的 SQL 查询变成了 3s,消费不仅没有加速,积压反而更严重了。
复盘后的结论是:必须给 HPA 的扩容速度上一把锁。KEDA ScaledObject 支持透传 HPA 的行为策略,可以在
advanced.hpaConfig.behavior
里限制扩容步长。
spec:
advanced:
hpaConfig:
behavior:
scaleUp:
stabilizationWindowSeconds: 0
selectPolicy: Max
policies:
- type: Pods
value: 3
periodSeconds: 30
scaleDown:
stabilizationWindowSeconds: 120
这个配置的含义是:每 30 秒最多新增 3 个副本,缩容前至少稳定观察 120 秒。这样即使积压很严重,系统也会以可控的速度逐步扩容,给下游足够的缓冲时间。
有人会问,扩容慢了积压怎么办?我的思路是:积压严重时,扩容速度的下限比上限重要。只要你每 30 秒能新增几个副本,整体消费能力是在提升的,积压最多多持续几十秒,但下游不会被击穿。这是两害相权取其轻。
5.3 从 HPA 状态与 KEDA 日志排查故障
如果发现弹性伸缩没有生效,先不要慌,按顺序排查。
第一步,看 HPA 状态和事件:
kubectl get hpa
kubectl describe hpa keda-hpa-rabbitmq-scaledobject
重点看
AbleToScale
、
ScalingActive
、
ScalingLimited
这几个 Condition。如果
ScalingActive
是 False,说明 HPA 拉不到指标,问题大概率出在 KEDA scaler 与 MQ 的连接上。
第二步,看 KEDA Operator 日志:
kubectl logs -n keda deployment/keda-operator
KEDA Operator 会打印 scaler 连接失败、指标查询失败等细节。常见的报错有 Unauthorized、connection refused、queue not found 等。
第三步,验证外部指标 API 是否正常返回:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/rabbitmq-queue-task_queue?labelSelector="
这个命令能直接看到 KEDA 查询到的队列消息数,如果这里返回空或者报错,问题基本锁定在配置层。
我实际排查过一个案例:RabbitMQ 队列在 vhost
/
下,但 AMQP 连接串里带了错误的 vhost 路径,导致 KEDA 虽然能连上 RabbitMQ,却查不到目标队列的消息数,HPA 一直显示
unknown
。后来把 vhost 转换为 URL 编码形式填进 host 参数,问题解决。RabbitMQ 的连接串对特殊字符非常敏感,尤其是 vhost 名称带
/
、密码带
@
或
:
时,务必做 URL encode。
5.4 Kafka 场景下的参数差异
如果你用的是 Kafka,KEDA 的 scaler 配置和 RabbitMQ 稍有不同。Kafka 场景下最常用的指标是 Consumer Group 的 Lag(消费滞后量)。
triggers:
- type: kafka
metadata:
topic: orders
bootstrapServers: kafka-cluster-kafka-bootstrap.kafka:9092
consumerGroup: order-consumer-group
lagThreshold: "50"
这里的
lagThreshold
语义上是"每个分区的目标滞后量"还是"总滞后量",不同版本略有差异。实测下来我一般按"lag 总量/分区数"来理解。Kafka 的 Lag 指标依赖消费者组实时提交 offset,如果消费者处理慢、offset 提交也慢,HPA 拿到的 lag 数据可能会偏大。
Kafka 场景下还要注意:KEDA 的 kafka scaler 默认使用 Sarama 库访问 Kafka,如果在 TLS/SASL 环境里,记得通过 authenticationRef 传入 sasl 和 tls 相关配置。我之前在开启 SASL 认证的 Kafka 集群上忘了配认证信息,KEDA 日志里反复出现 "kafka: client has run out of available brokers"。
5.5 手动压测验证伸缩效果
整套环境搭建好后,我建议做一次手动压测来验证效果,不要直接等线上流量验证。这里分享一个简单的验证链路。
先观察当前副本数:
kubectl get deployment mq-consumer
然后向 RabbitMQ 发布一批测试消息。可以用 RabbitMQ 的管理插件,也可以用一个小脚本循环发消息,比如向 task_queue 发 5000 条。
发布完成后,立刻观察 HPA 和 Pod 数量:
kubectl get hpa -w
kubectl get pods -w
正常情况下,15 秒左右 KEDA 就能查到队列消息数超过阈值,HPA 计算期望副本数并扩容。如果队列积压 5000 条、value 设为 10,理论期望副本数是 500,但 maxReplicaCount 是 20,所以 HPA 会直接拉满到 20。之后消费者处理完消息,队列长度逐步下降,缩容会延迟 cooldownPeriod 60 秒后开始。
我这边压测的典型曲线是:队列积压 2 万条时,HPA 从 1 个副本直接涨到 20 个副本,耗时约 1 分钟;消费完成后第 60 秒开始缩容,约 5 分钟回到 1 个副本。整个过程中,RabbitMQ 的连接数从 1 个涨到 20 个,对 RabbitMQ 本体的压力很小,但数据库连接池是明显吃紧的,这也是我后面加扩容限速的原因。
6. 从这套方案延伸出去的几点思考
KEDA 能做的远不止 MQ 消息积压这一件事。它内置了 50 多种 scaler,意味着任何你能想到的事件源,都可能成为 K8s 伸缩的"信号源"。
比如,Webhook 服务可以用 HTTP 请求速率作为伸缩依据;定时任务可以用 Cron 表达式在业务低峰期把消费者缩到 0;数据库连接池指标、Redis 列表长度、Prometheus 告警、甚至是你自己的自定义 HTTP API,都可以接入。只要你能把业务指标暴露成一个数字,KEDA 就有办法把它变成 HPA 的伸缩依据。
我在实际落地这套方案的时候,有一个比较深的体会:弹性伸缩这件事,核心不在"自动扩缩容"这个动作本身,而在于你选择哪个指标作为伸缩信号,以及这个指标能不能真实反映系统的处理压力。CPU 和内存是间接指标,MQ 队列长度才是直接反映积压状态的信号。选对了信号源,自动伸缩才有意义。
如果你也遇到了类似的消息积压问题,不妨先用最简单的 RabbitMQ scaler 跑通链路,再逐步切换到生产环境做参数调优。刚开始不要贪多,把 pollingInterval、cooldownPeriod、value、maxReplicaCount 这几个参数在压测环境里跑出感觉,再上生产。这套方案我已经跑了大半年,最大的好处是你不需要再盯着监控看板做手工扩容了,可以把精力花在真正需要人判断的事情上。
352




被折叠的 条评论
为什么被折叠?



