弹性问题

  • 弹性服务最好和监控服务、限流服务配合。
  • 弹性服务的监控最好低于限流服务的阈值,否则不会被触发。
  • 要注意扩容阈值和缩容阈值。如果有必要,设置阶梯阈值,离正常值越远的阶梯越不敏感,离正常值越近的阶梯越敏感。阶梯越远,弹性的量应该越大。
  • 注意弹性有静默期,注意发布和弹性静默期之间是相互矛盾的,要相互关闭。
  • 如果有压测标记,注意让弹性扩容监控包括/排除压测流量。
  • 任务调度或者特殊的有状态的中间件依赖的分布式节点应该尽量避免弹入和弹出。

慢预热服务-扩容机器服务可用性差问题

极少部分依赖缓存预热的业务在接入弹性的过程中,在业务代码配置不合理的情况下,可能出现服务节点启动时服务不可用或性能较差的情况。

出现这种问题可以产生如下情况:

  • 服务节点启动后尚未完全预热,大量流量打入导致服务不可用(TP耗时飙升)。
  • 服务依赖数据源尚未初始化完成,服务节点就已注册至服务治理的命名服务器,开始承担流量,但此时服务处于不可用状态(请求异常)。
  • 机器刚刚扩容出来时cpu.busy指标较高,承接流量后影响服务可用性。

此类问题的根本原因是:服务自身预热工作未完成时,处于服务不可用状态,此时不应该将服务节点注册至服务治理的命名服务器承接流量。

为什么服务预热未完成的情况下,服务节点仍会注册至服务治理的命名服务器?

业务自身代码中没有进行强保障,一般是由于没有指定bean加载顺序,导致在预热未完成的情况下,服务端口已启动,此时服务节点会自动注册至服务治理的命名服务器

直接由弹性服务启动的容器容易遇到这个问题,但使用发布服务发布的容器不容易遇到这个问题。

解决方案:

  1. 业务调整服务启动类加载顺序,确保服务warmup完成后,启动服务节点端:如使用 xml 配置的 bean 标签的 depends-on 属性。
  2. 开启服务慢启动配置,逐步调整新注册节点的权重比例,避免流量突增。通过服务节点权重变化实现对服务节点调用流量的控制,达成服务预热的效果。
  • 服务慢启动的触发条件:当服务状态由未启动变为正常时,都会触发慢启动
  • 以默认权重10为例:0~60s权重为1,60~120s权重自动改为3,120s之后权重为10,慢启动结束
  • 假如发布前权重为100:0~60s权重为1,60~120s权重自动改为3,120s之后权重为100,慢启动结束
  • 假如发布前权重为8:0~60s权重为1,60~120s权重自动改为3,120s之后权重为8,慢启动结束
  • 假如发布前权重为2:0~60s权重为1,60~120s权重自动改为2,慢启动结束