限流
Kitex 默认限流和自定义限流使用指南。
限流是一种保护 server 的措施,防止上游某个 client 流量突增导致 server 端过载。
目前 Kitex 支持用户自定义的 QPS 限流器和连接数限流器,同时提供了默认的实现。
注意事项
- 同时定义
server.WithLimit
和server.WithQPSLimiter
或同时定义server.WithLimit
和server.WithConnectionLimiter
时,只有后者会生效。 - 为节省请求反序列化开销提高性能,在非多路复用场景下,Kitex 默认的 QPS 限流器是在
OnRead
hook 处生效的,而在多路复用或使用自定义 QPS 限流器场景下,限流器在OnMessage
hook 处生效。这是为了保证自定义限流器能获取到请求的基本信息,避免在例如按 method 限流等场景下无法生效的问题。 - 目前的限流功能只对 Thrift、Kitexpb 协议生效,对 gRPC 协议暂不生效。gRPC 可采用流控在传输层面做流量限制,Kitex 提供了
WithGRPCInitialWindowSize
和WithGRPCInitialConnWindowSize
分别用于设置 stream 和连接的流控窗口大小,详见gRPC官方文档
使用默认的限流器
代码示例
参数说明:
-
MaxConnections
表示最大连接数 -
MaxQPS
表示最大 QPS -
UpdateControl
提供动态修改限流阈值的能力,举例:
实现
默认限流器分别使用 ConcurrencyLimiter 和 RateLimiter 对最大连接数和最大 QPS 进行限流。
- ConcurrencyLimiter:简单的计数器;
- RateLimiter:这里的限流算法采用了 " 令牌桶算法 “。
监控
默认限流器定义了 LimitReporter
接口,用于限流状态监控,例如当前连接数过多、QPS 过大等。
如有需求,用户需要自行实现该接口,并通过 WithLimitReporter
注入。
使用自定义的限流器
最后修改
September 29, 2023
: docs: update hz usage document (#787) (83b80c7)