kratos: github.com/bilibili/kratos/pkg/net/netutil/breaker Index | Examples | Files

package breaker

import "github.com/bilibili/kratos/pkg/net/netutil/breaker"

Index

Examples

Package Files

breaker.go sre_breaker.go

Constants

const (
    // StateOpen when circuit breaker open, request not allowed, after sleep
    // some duration, allow one single request for testing the health, if ok
    // then state reset to closed, if not continue the step.
    StateOpen int32 = iota
    // StateClosed when circuit breaker closed, request allowed, the breaker
    // calc the succeed ratio, if request num greater request setting and
    // ratio lower than the setting ratio, then reset state to open.
    StateClosed
    // StateHalfopen when circuit breaker open, after slepp some duration, allow
    // one request, but not state closed.
    StateHalfopen
)

func Go Uses

func Go(name string, run, fallback func() error) error

Go runs your function while tracking the breaker state of default group.

ExampleGo this example create a default group and show function callback according to the state of breaker.

Code:

run := func() error {
    return nil
}
fallback := func() error {
    return fmt.Errorf("unknown error")
}
if err := breaker.Go("example_go", run, fallback); err != nil {
    fmt.Println(err)
}

func Init Uses

func Init(conf *Config)

Init init global breaker config, also can reload config after first time call.

type Breaker Uses

type Breaker interface {
    Allow() error
    MarkSuccess()
    MarkFailed()
}

Breaker is a CircuitBreaker pattern. FIXME on int32 atomic.LoadInt32(&b.on) == _switchOn

ExampleBreaker show breaker usage.

Code:

// new group,use default breaker config
g := breaker.NewGroup(nil)
brk := g.Get("key")
// mark request success
brk.MarkSuccess()
// mark request failed
brk.MarkFailed()
// check if breaker allow or not
if brk.Allow() == nil {
    fmt.Println("breaker allow")
} else {
    fmt.Println("breaker not allow")
}

type Config Uses

type Config struct {
    SwitchOff bool // breaker switch,default off.

    // Hystrix
    Ratio float32
    Sleep xtime.Duration

    // Google
    K   float64

    Window  xtime.Duration
    Bucket  int
    Request int64
}

Config broker config.

type Group Uses

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

Group represents a class of CircuitBreaker and forms a namespace in which units of CircuitBreaker.

ExampleGroup show group usage.

Code:

c := &breaker.Config{
    Window:  xtime.Duration(3 * time.Second),
    Sleep:   xtime.Duration(100 * time.Millisecond),
    Bucket:  10,
    Ratio:   0.5,
    Request: 100,
}
// init default config
breaker.Init(c)
// new group
g := breaker.NewGroup(c)
// reload group config
c.Bucket = 100
c.Request = 200
g.Reload(c)
// get breaker by key
g.Get("key")

func NewGroup Uses

func NewGroup(conf *Config) *Group

NewGroup new a breaker group container, if conf nil use default conf.

func (*Group) Get Uses

func (g *Group) Get(key string) Breaker

Get get a breaker by a specified key, if breaker not exists then make a new one.

func (*Group) Go Uses

func (g *Group) Go(name string, run, fallback func() error) error

Go runs your function while tracking the breaker state of group.

func (*Group) Reload Uses

func (g *Group) Reload(conf *Config)

Reload reload the group by specified config, this may let all inner breaker reset to a new one.

Package breaker imports 9 packages (graph) and is imported by 4 packages. Updated 2019-07-29. Refresh now. Tools for package owners.