Help us shape the future of Go! Take the 2026 Go Developer Survey

breaker

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Oct 18, 2026 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

Package breaker 熔断器(closed → open → half-open → closed/reopen)。 零外部依赖,纯并发安全的状态机。

Index

Constants

View Source
const (
	DefaultTripThreshold = 3
	DefaultCooldown      = 5 * time.Minute
	// DefaultProbeTimeout 半开探测的缺省时限:探测方"失联"(Allow 放行后未配对
	// Success/Failure,如调用方在探测期间 ctx 取消提前返回)超过此时限后,
	// Allow 放行新的探测,避免熔断器被陈旧探测永久卡死在半开。
	DefaultProbeTimeout = time.Minute
)

默认参数。

Variables

This section is empty.

Functions

This section is empty.

Types

type Breaker

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

Breaker 单 key 熔断器。

func New

func New(trip int, cooldown time.Duration) *Breaker

New 创建熔断器。trip=连续失败阈值,cooldown=冷却期。

func (*Breaker) Abandon

func (b *Breaker) Abandon()

Abandon 放弃在途的半开探测:Allow==true 但调用方在取得结果前终止(任务级 取消/优雅停机)——结果未知,既非成功也非失败,不计入统计。半开态回到 "可立即放行新探测"(不必等 probeTimeout 失联超时);closed 态无副作用。 与 Success/Failure 共同构成 Allow 的配对契约(v0.10.4)。

func (*Breaker) AbandonGen

func (b *Breaker) AbandonGen(gen uint64)

AbandonGen Abandon 的世代形态:gen 不匹配时忽略(旧探测已失联,无占位可解)。

func (*Breaker) Allow

func (b *Breaker) Allow(now time.Time) bool

Allow 返回是否放行;半开时仅放行一个探测请求。 调用契约:返回 true 后必须恰好配对一次 Success、Failure 或 Abandon(探测 失联超过 DefaultProbeTimeout 后本方法会放行新探测,不再无限等待旧探测)。

func (*Breaker) AllowGen

func (b *Breaker) AllowGen(now time.Time) (bool, uint64)

AllowGen Allow 的世代形态:放行探测时返回递增 gen,供 SuccessGen/FailureGen/ AbandonGen 携带上报——陈旧 gen(超时兜底已放行新探测后旧探测迟到上报)被 显式忽略,不再依赖时间窗甄别(v0.12.4 世代化;gen==0 表示 closed 态直行, 旧三方法仍可用)。

func (*Breaker) Failure

func (b *Breaker) Failure(now time.Time)

Failure 记录一次真实发起且失败的调用;达阈值开熔断,半开探测失败重新熔断。 配对契约:仅对 Allow==true 放行过的调用上报(被拒调用从未发起,上报 Failure 会被当作探测失败而重新熔断);结果未知(取消/放弃)上报 Abandon。 熔断 open 期间被拒请求记录的 Failure 不续期冷却(否则高流量下 openUntil 被 无限顺延,永远进不了半开)。

func (*Breaker) FailureGen

func (b *Breaker) FailureGen(now time.Time, gen uint64)

FailureGen Failure 的世代形态:gen 与当前探测不匹配(陈旧迟到上报)时 **完全忽略**——旧探测已被失联宣告,其结果对新窗口无意义(重熔会振荡, 计数会污染;迟到甄别的结构性解,替代时间窗缓冲启发)。

func (*Breaker) Opened

func (b *Breaker) Opened(now time.Time) bool

Opened 是否处于熔断中。

func (*Breaker) Success

func (b *Breaker) Success()

Success 关闭熔断(配对 Allow==true 的成功结果)。

func (*Breaker) SuccessGen

func (b *Breaker) SuccessGen(gen uint64)

SuccessGen Success 的世代形态:gen 与当前探测不匹配(陈旧迟到上报)时忽略。

func (*Breaker) WithProbeTimeout

func (b *Breaker) WithProbeTimeout(d time.Duration) *Breaker

WithProbeTimeout 构建期配置半开探测时限(链式;与 Breakers.WithProbeTimeout 对齐——独立使用 Breaker 的调用方不再被钉死在 DefaultProbeTimeout)。

type Breakers

type Breakers struct {

	// Now 时钟源(测试注入用;仅启动期可写,运行期并发改写有数据竞争)。
	Now func() time.Time
	// contains filtered or unexported fields
}

Breakers 按 key 索引的熔断板(并发安全)。

func NewBreakers

func NewBreakers(trip int, cooldown time.Duration, opts ...Option) *Breakers

NewBreakers 创建熔断板。opts 可选(零值 = 全部采用缺省,既有调用方不受影响)。

func (*Breakers) Abandon

func (bs *Breakers) Abandon(name string)

Abandon 按 key 放弃在途半开探测(取消/终止语义,不计失败)。

func (*Breakers) AbandonGen

func (bs *Breakers) AbandonGen(name string, gen uint64)

func (*Breakers) Allow

func (bs *Breakers) Allow(name string) bool

Allow 按 key 判定是否放行。

func (*Breakers) AllowGen

func (bs *Breakers) AllowGen(name string) (bool, uint64)

AllowGen/SuccessGen/FailureGen/AbandonGen 世代形态(Breaker 同名方法的 多路转发——调用方持有 gen 跨请求上报)。

func (*Breakers) Failure

func (bs *Breakers) Failure(name string)

Failure 按 key 记录失败。

func (*Breakers) FailureGen

func (bs *Breakers) FailureGen(name string, gen uint64)

func (*Breakers) Opened

func (bs *Breakers) Opened(name string) bool

Opened 按 key 判定是否熔断中。只读——未登记的 key 返回 false,不为查询 创建状态条目(监控轮询不该撑大内部 map;Allow/Success/Failure 才是登记时机)。

func (*Breakers) Success

func (bs *Breakers) Success(name string)

Success 按 key 记录成功。

func (*Breakers) SuccessGen

func (bs *Breakers) SuccessGen(name string, gen uint64)

type Option

type Option func(*Breakers)

Option 熔断板可选参数。

func WithProbeTimeout

func WithProbeTimeout(d time.Duration) Option

WithProbeTimeout 覆盖半开探测时限(<=0 回退 DefaultProbeTimeout)。 典型场景:被保护操作带长超时(如 LLM agent 600s),探测时限须 >= 最长正常耗时。

Jump to

Keyboard shortcuts

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