4 prácticas típicas de limitación de corriente para garantizar una alta disponibilidad de las aplicaciones | Guía para ingenieros de eficiencia en la nube

Introducción: cuatro prácticas típicas de limitación de corriente garantizan una alta disponibilidad de las aplicaciones. Este artículo resume una guía práctica de limitación de corriente de AHAS. Si su sistema corre el riesgo de ser atacado por usuarios maliciosos, o si una aplicación en el sistema es anormal, puede causar una efecto avalancha Entonces este artículo te ayudará.

Hola a todos, mi nombre es Huang Bowen, mi apodo es Yanmei y actualmente estoy a cargo del diseño y desarrollo de la tubería Flow, un producto de Yunxiao. Bajo la arquitectura de microservicios, hay más y más servicios, y las llamadas entre servicios serán cada vez más complejas. Cómo garantizar la alta disponibilidad de los servicios se ha convertido en un desafío. Uno de los productos en los que participé anteriormente tuvo una falla, la razón fue que cierta llamada API aumentó repentinamente docenas de veces, lo que resultó en una alta carga de servicio y afectó el uso de los usuarios. Si existe un mecanismo en ese momento para limitar o fusionar rápidamente esta API anormal, puede evitar que el servicio caiga en un estado inestable. La propia Yunxiao utiliza Alibaba Cloud AHAS (Servicio de alta disponibilidad de aplicaciones) para garantizar la alta disponibilidad de las aplicaciones. Este artículo resume una guía práctica de limitación actual de AHAS. Si su sistema corre el riesgo de ser atacado por usuarios malintencionados o aparece una aplicación en el sistema Las anomalías pueden causar un efecto de avalancha, entonces este artículo te ayudará.

Una solución completa de alta disponibilidad de la aplicación primero necesita monitorear la interfaz de la aplicación y puede contar la situación de QPS de la interfaz de la aplicación actual en tiempo real. En segundo lugar, es necesario poder configurar varias reglas de limitación y fusión de corriente para diferentes API y escenarios.Por ejemplo, si el QPS de una API supera los 300, es necesario realizar un procesamiento de limitación de corriente en las llamadas en exceso. Hay muchas herramientas que pueden proporcionar limitación de corriente, las más populares son Guava RateLimiter, Hystrix, etc. Sin embargo, estas herramientas cuestan mucho para comenzar y no es fácil construir todo el sistema.

¿Cómo establecer rápidamente un sistema de limitación de corriente para aplicaciones? Esto presentará el servicio de alta disponibilidad de aplicaciones AHAS (Application High Availability Service) proporcionado por Alibaba Cloud. AHAS es un producto en la nube precipitado por el sistema interno de alta disponibilidad de Alibaba durante muchos años Basado en el control de flujo de código abierto de Alibaba y el componente de degradación Sentinel, toma el tráfico y la tolerancia a fallas como el punto de entrada, desde control de flujo, aislamiento de llamadas inestables, disyuntor downgrade, protección de tráfico de punto de acceso, sistema Múltiples dimensiones, como protección de sobrecarga adaptativa, control de flujo de clúster y anti-fluctuación de servicio, ayudan a garantizar la estabilidad de los servicios y puertas de enlace, y brindan funciones de análisis y monitoreo de tráfico de segundo nivel. AHAS no solo se usa ampliamente en campos de comercio electrónico como Taobao y Tmall en Ali, sino que también tiene mucha práctica en finanzas de Internet, educación en línea, juegos, industria de transmisión en vivo y otras grandes empresas gubernamentales y centrales.

¿Cuál es el límite actual?

El propósito de la limitación de corriente es evitar que el sistema quede inutilizable debido al tráfico excesivo. Entonces, ¿de dónde vendrá este tráfico?

Según la forma de acceso, se puede dividir en:

  1. Llamadas síncronas a HTTP. Por ejemplo, cuando visitas una página de un sitio a través de un navegador, se generará este tipo de tráfico.
  2. Llamada de tarea en segundo plano. Esto depende de la forma de negocio, por ejemplo, si un sitio abre la posibilidad de que los usuarios ejecuten tareas regularmente, cada tarea adicional configurada por el usuario causará más tráfico al sistema.

Según la finalidad del acceso, se puede dividir en:

  1. Crecimiento empresarial normal. Por ejemplo, el aumento de usuarios, actividades operativas, etc., conducirá a un aumento en el volumen comercial general.
  2. Acciones maliciosas por parte de usuarios malintencionados. Por ejemplo, un usuario realiza un ataque DDOS en un sitio web, o para el sitio web mencionado anteriormente que brinda la capacidad de ejecutar tareas con regularidad, configura maliciosamente una gran cantidad de tareas cronometradas, causando indirectamente una gran carga en el sistema, y ​​así en.

Según la fuente de acceso, se puede dividir en:

  1. los usuarios finales. Estos usuarios son usuarios finales y su tráfico total crecerá con el negocio normal.
  2. llamada del sistema. Por ejemplo, si otros sistemas crean sus propios productos en función de sus capacidades, debe llegar a un acuerdo con estos sistemas sobre la frecuencia máxima de acceso e implementar el valor de estas frecuencias en la estrategia de limitación actual.

Una vez que comprendemos de dónde proviene el tráfico, sabemos qué limitar.

  1. Limite la frecuencia de uso de todo el sistema. En el uso real, esto generalmente se convierte en la frecuencia de uso de una sola máquina para garantizar que la única máquina no se vea abrumada. Al mismo tiempo, coopera con la alarma y, cuando se produce un cuello de botella, el problema se puede resolver mediante una expansión de emergencia.
  2. Limite la frecuencia de uso por parte de un solo usuario (o un solo inquilino, según su forma de negocio).
  3. Limite la frecuencia de uso de diferentes llamadas al sistema aguas arriba.
  4. 针对上述的限制,都需要能够支持HTTP的同步调用和后台任务调用。

接下来我们从保证系统整体可用性、防止个别用户滥用、隔离上游系统异常调用以及全方位限流4个方面,具体讲解如何使用阿里云AHAS实现限流。

保证系统整体可用性

配置限流时,我们需要建立一个通用的限流规则保障核心接口的稳定性,避免单点瓶颈引发全局问题。

一个流控规则包含以下内容:

  • 接口名称:即对哪个接口进行流控。
  • 来源应用:设置为default,即对所有调用方都一视同仁,对整个系统的调用进行限流。关于这个配置的用法,会在后面的“针对其他上游系统调用的限流”部分展开讨论。
  • 单机QPS阈值:单机的QPS容量,超过阈值后会被限流
  • 流控效果:当接口调用超过QPS阈值后的处理措施

我们也可以配置触发限流后的接口返回值。对于Web接口而言,通常被限流的接口会返回429 Too Many Requests错误码,告知调用方请求太频繁。

对一个接口进行限流时,难点是填写具体的QPS阈值。我们可以在性能测试环境对应用进行压测,压出单机下某个接口的QPS极限值,然后将阈值定为极限值的某个比例,比如极限值的90%。比如某个接口单机可承受极限为200QPS,那么阈值可定为200*90%= 180。

防止个别用户滥用

这个场景下,需要先梳理出来系统的核心业务入口,通常是service层的一个入口函数,针对每个入口函数预设单个用户合理的使用频率,然后就可以利用AHAS的热点参数流控能力,来并进行限制。

在入口函数上添加注解:

@SentinelResource(value = "biz1")
public Result doBussinessLogic(String uid, int type) {
    // uid参数索引为0,type参数索引为1。
    // some logic here...
}
复制代码

代码中需要做两件事情

  1. 从请求中提取出需要防护的维度,比如上面代码中的uid,即用户的标识。并保证该标识作为业务入口函数的入参传入。
  2. 给该函数添加@SentinelResource注解。其中的value="biz1"为这个资源的标识,会用在控制台配置中进行引用。

然后在控制台进行配置。假设我们希望,在服务级别每分钟单用户最多调用20次,服务共有5个实例。则可以进行如下配置。意思是在第0个参数,也就是用户,这个维度上进行限流,单机最多每60s进行4次调用,则集群维度就是每分钟最多20次调用。

目前AHAS还不支持直接进行集群维度的配置,实际使用中需要简单的换算下。

详细说明,请参考:
help.aliyun.com/document\_d…

隔离上游系统异常调用

对于一个应用的接口来说,通常会被上游多个系统调用。上面虽然介绍了如何对单个接口进行整体限流,但实际场景中,我们会需要对不同的上游系统采用不同的限流阈值。比如上游调用方A是主链路,希望QPS阈值能高一些,上游调用方B为旁支链路,QPS阈值可以低一些。那么我们需要在Web容器启动时注入抽取租户特征值的拦截器。根据来源应用标识来对不同来源给予不同的阈值。

@Configuration
public class InterceptorConfiguration extends WebMvcConfigurerAdapter {
    
    @PostConstruct
    public void setOriginParser() {
        WebCallbackManager.setRequestOriginParser(httpServletRequest -> httpServletRequest.getHeader("income"));
    }
}
复制代码

WebCallbackManager.setRequestOriginParser 接受一个参数为HttpServletRequest的回调,我们需要通过HttpServletRquest对象中的内容来区分调用方A和B。比如应用A和B在调用接口时会传入不同的header income,那么就可以通过该header来区分来源应用A和B。最后在流控规则中建立起对A和B不同限流阈值。如下图所示。

全方位限流,不限于HTTP

AHAS可以快速的把Web接口纳入到流控之中。但如果我们应用的一些代码不属于Web接口,但也想启用流控,那么仍然可以使用AHAS提供的热点规则的能力。以下是个示例。

    @SentinelResource(blockHandler = "blockHandlerExecuteTask")
  public Boolean executeTask(Long taskId) throws Exception {
    return taskService.executeTask(taskId);
    }


    public Boolean blockHandlerExecuteTask(Long taskId, BlockException ex) {
        throw new RuntimeException("execute task exceed");
    }
复制代码

重启应用后,在接口详情页的自定义埋点tab中,就可以看到AHAS收集的自定义埋点接口数据,接口名称组成为类名:方法名的格式。

接着可以给这个埋点接口配置限流规则,开启防护。

以上就是我们使用AHAS服务时配置限流的常用实践,希望对大家有所帮助。

原文链接

本文为阿里云原创内容,未经允许不得转载。

Supongo que te gusta

Origin juejin.im/post/7078866799906783239
Recomendado
Clasificación