breaker

package
v1.1.3 Latest Latest
Warning

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

Go to latest
Published: Apr 1, 2024 License: Apache-2.0 Imports: 9 Imported by: 0

README

breaker

import "github.com/ccheers/xpkg/net/netutil/breaker"

Index

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
)

Variables

var ErrServiceUnavailable = fmt.Errorf("service unavailable")

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.

package main

import (
	"fmt"

	"github.com/ccheers/xpkg/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

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

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

ExampleBreaker show breaker usage.

package main

import (
	"fmt"

	"github.com/ccheers/xpkg/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

Config broker config.

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

    // Google
    K   float64

    Window  xtime.Duration
    Bucket  int
    Request int64
}

type Group

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

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

ExampleGroup show group usage.

package main

import (
	"time"

	"github.com/ccheers/xpkg/net/netutil/breaker"
	xtime "github.com/ccheers/xpkg/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.

Generated by gomarkdoc

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

View Source
var ErrServiceUnavailable = fmt.Errorf("service unavailable")

Functions

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.

package main

import (
	"fmt"

	"github.com/ccheers/xpkg/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:

func Init

func Init(conf *Config)

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

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/ccheers/xpkg/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/ccheers/xpkg/net/netutil/breaker"
	xtime "github.com/ccheers/xpkg/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 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.

Jump to

Keyboard shortcuts

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