overloadctrl

package
v0.3.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 5, 2026 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Overview

Package overloadctrl 提供反馈驱动的自适应限流。

与 pkg/ratelimit 的区别:ratelimit 是固定阈值(令牌桶/滑动窗口),阈值由调用方预设, 不随负载变化;本包是自适应——根据响应延迟和错误率动态收紧/放宽通过率,无需人工调参。

接口(对齐 trpc-go overloadctrl):Acquire(ctx, addr) 返回 Token,请求结束后 Token.OnResponse(ctx, err) 反馈结果,controller 据此更新该 addr 的负载画像。 调用方在 client 调用前 Acquire,拿到 Token 才发请求,调用结束 OnResponse。

算法(类 BBR/CoDel 的简化版):per-addr 维护 minRTT(滑动窗口最小值,作为健康基线) 和 lastRTT。当 lastRTT > k*minRTT(k 默认 2.0,表示延迟翻倍)且 inFlight 超过 minInflight(默认 10)时,认为过载,拒绝请求。错误率过高(连续错误)也收紧。 反馈闭环:OnResponse 更新 lastRTT/minRTT/inFlight/错误计数。

恢复:延迟梯度触发的拒绝会随在途请求自然排空(inFlight 降到 minInflight 以下)自动放开; 连续错误触发的锁定态则每隔 errRecovInterval(默认 5s)放行一个探测请求,探测成功解锁、 失败续锁——确保节点不会因连续错误被永久拒绝。

Index

Constants

This section is empty.

Variables

View Source
var ErrOverloaded = errors.New("overload controller rejected: node overloaded")

ErrOverloaded 节点过载,请求被拒绝。

Functions

This section is empty.

Types

type AdaptiveController

type AdaptiveController struct {
	// contains filtered or unexported fields
}

AdaptiveController 基于延迟梯度的自适应限流器。按 addr 维护独立负载画像。

func NewAdaptiveController

func NewAdaptiveController(opts ...Option) *AdaptiveController

NewAdaptiveController 创建自适应限流器。

func (*AdaptiveController) Acquire

func (c *AdaptiveController) Acquire(_ context.Context, addr string) (Token, error)

Acquire 判断 addr 是否可放行。过载(延迟梯度超阈 + inFlight 足够)或连续错误超阈时拒绝。

func (*AdaptiveController) Reset

func (c *AdaptiveController) Reset()

Reset 重置所有 addr 的状态。

func (*AdaptiveController) Stats

func (c *AdaptiveController) Stats() map[string]OverloadStats

Stats 返回所有 addr 的状态快照。

type NoopController

type NoopController struct{}

NoopController 空实现。Acquire 永远放行,OnResponse 空操作。默认值,零开销。

func (NoopController) Acquire

type NoopToken

type NoopToken struct{}

NoopToken 空 Token。

func (NoopToken) OnResponse

func (NoopToken) OnResponse(context.Context, error)

type Option

type Option func(*config)

Option 配置 AdaptiveController。

func WithErrorRecoveryInterval

func WithErrorRecoveryInterval(d time.Duration) Option

WithErrorRecoveryInterval 设置错误锁定后的探测放行间隔(默认 5s)。 连续错误达阈值进入锁定态后,每隔此间隔放行一个探测请求;探测成功则解除锁定, 失败则继续锁定。避免节点因连续错误被永久拒绝、无法恢复。

func WithErrorThreshold

func WithErrorThreshold(n uint32) Option

WithErrorThreshold 设置连续错误阈值(默认 5),达此值直接拒绝。

func WithMinInflight

func WithMinInflight(n int) Option

WithMinInflight 设置触发过载判断的最小在途请求数(默认 10)。 低于此值时即使延迟高也不拒绝(避免低负载时的偶发延迟误判)。

func WithOnDrop

func WithOnDrop(fn func(addr string)) Option

WithOnDrop 设置请求被拒时的回调(打 metric/日志用)。

func WithRTTMultiple

func WithRTTMultiple(k float64) Option

WithRTTMultiple 设置延迟梯度阈值倍数(默认 2.0,即延迟翻倍视为过载)。

func WithRTTWindow

func WithRTTWindow(n int) Option

WithRTTWindow 设置 minRTT 采样窗口大小(默认 20)。

type OverloadController

type OverloadController interface {
	Acquire(ctx context.Context, addr string) (Token, error)
}

OverloadController 自适应限流器接口。

type OverloadStats

type OverloadStats struct {
	Addr              string        `json:"addr"`
	InFlight          int           `json:"in_flight"`
	MinRTT            time.Duration `json:"min_rtt"`
	LastRTT           time.Duration `json:"last_rtt"`
	ConsecutiveErrors uint32        `json:"consecutive_errors"`
}

OverloadStats 单个 addr 的负载画像快照。

type Token

type Token interface {
	OnResponse(ctx context.Context, err error)
}

Token 请求许可,请求结束后必须调用 OnResponse 反馈结果。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL