Back to godoc.org

Package breaker

v0.3.3
Latest Go to latest

The latest major version is .

Published: Jan 20, 2020 | License: MIT | Module: github.com/bilibili/kratos

Index

Examples

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

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

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

Example

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

Code:

package main

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

func main() {
	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

func Init(conf *Config)

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

type Breaker

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

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

Example

ExampleBreaker show breaker usage.

Code:

package main

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

func main() {
	// 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

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

	// Google
	K float64

	Window  xtime.Duration
	Bucket  int
	Request int64
}

Config broker config.

type Group

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

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

Example

ExampleGroup show group usage.

Code:

package main

import (
	"github.com/bilibili/kratos/pkg/net/netutil/breaker"
	xtime "github.com/bilibili/kratos/pkg/time"
	"time"
)

func main() {
	c := &breaker.Config{
		Window:  xtime.Duration(3 * time.Second),
		K:       1.5,
		Bucket:  10,
		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

func NewGroup(conf *Config) *Group

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

func (*Group) Get

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

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

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 Files

Documentation was rendered with GOOS=linux and GOARCH=amd64.

Jump to identifier

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to identifier