Documentation ¶
Index ¶
Examples ¶
Constants ¶
View Source
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 )
Variables ¶
This section is empty.
Functions ¶
func Go ¶
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.
package main import ( "fmt" "github.com/zhangjinglei/wahaha/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) } }
Output:
Types ¶
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.
package main import ( "fmt" "github.com/zhangjinglei/wahaha/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") } }
Output:
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.
package main import ( "time" "github.com/zhangjinglei/wahaha/pkg/net/netutil/breaker" xtime "github.com/zhangjinglei/wahaha/pkg/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") }
Output:
func (*Group) Get ¶
Get get a breaker by a specified key, if breaker not exists then make a new one.
Click to show internal directories.
Click to hide internal directories.