使用ConcurrencyLimitingPolicy实现请求并发数控制
您可以使用ASM流量调度套件的ConcurrencyLimitingPolicy功能来控制发往服务的请求并发度(即正在处理的请求数量),防止服务过载。该策略会追踪正在处理的请求数量,并在超过设定阈值时拒绝新请求。本文将详细介绍如何使用ConcurrencyLimitingPolicy实现请求并发度控制。
前提条件
已添加Kubernetes托管版集群到ASM实例,且ASM实例为v1.21.6.97及以上。具体操作,请参见添加集群到ASM实例。
已为Kubernetes集群中的default命名空间开启自动注入。具体操作,请参见管理全局命名空间。
已通过kubectl连接至ACK集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
已开启ASM流量调度套件。具体操作,请参见开启ASM流量调度套件。
已经部署httpbin应用,并且可以通过网关和sleep服务访问。具体操作,请参见部署httpbin应用。
步骤一:创建ConcurrencyLimitingPolicy并发数限制规则
使用kubectl连接到ASM实例,具体操作,请参见通过控制面kubectl访问Istio资源。
使用以下内容,创建ConcurrencyLimitPolicy.yaml文件。
apiVersion: istio.alibabacloud.com/v1 kind: ConcurrencyLimitingPolicy metadata: name: concurrencylimit namespace: istio-system spec: concurrency_limiter: max_concurrency: 1 parameters: max_inflight_duration: 60s selectors: - service: httpbin.default.svc.cluster.local
部分字段说明如下。关于字段的更多信息,请参见ConcurrencyLimitingPolicy CRD说明。
字段
说明
max_concurrency
最大请求并发数。示例中指定为1,即只允许服务同时处理1个请求。
max_inflight_duration
请求处理超时时间。由于集群中可能发生Pod重启等突发情况,导致ASM流量调度套件可能无法记录到请求结束事件,为防止此类请求影响并发数限制算法的判断,需要指定请求处理超时时间,超过此时间还未响应的请求将视作处理结束。您可以通过评估请求的期望最大响应时间来设定此值,示例中设定为60s。
selectors
指定应用限流策略的多个服务。示例中使用service: httpbin.default.svc.cluster.local 表示对httpbin.default.svc.cluster.local 服务进行并发数限制。
执行以下命令,开启ConcurrencyLimitingPolicy并发数限制规则。
kubectl apply -f ConcurrencyLimitingPolicy.yaml
预期输出:
concurrencylimitingpolicy.istio.alibabacloud.com/concurrencylimit created
步骤二:验证并发数限制效果
执行以下命令,进入sleep应用开启sh命令行。
kubectl exec -it deploy/sleep -- sh
执行以下命令,首先通过后台发送一个需要处理30秒的请求,然后在30秒之内紧接着发送第二个请求。
curl httpbin:8000/delay/30 -I & curl httpbin:8000 -I
预期输出:
HTTP/1.1 429 Too Many Requests date: Fri, 26 Jul 2024 13:50:55 GMT server: envoy x-envoy-upstream-service-time: 1 transfer-encoding: chunked ~ $ HTTP/1.1 200 OK server: envoy date: Fri, 26 Jul 2024 13:51:05 GMT content-type: application/json content-length: 269 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 10006 [1]+ Done curl httpbin:8000/delay/30 -I
可以看到第二次发送请求收到了429响应码,证明并发数限制生效。
相关操作
您可以通过Grafana大盘来观测ConcurrencyLimitingPolicy策略的执行效果。请确保Grafana使用的数据源Prometheus实例已经完成配置采集ASM流量调度套件相关指标。
将以下内容导入到Grafana,创建ConcurrencyLimitingPolicy策略的大盘。
大盘效果如下。