Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sony/gobreaker
Circuit Breaker implemented in Go
https://github.com/sony/gobreaker
circuit-breaker golang microservice
Last synced: 6 days ago
JSON representation
Circuit Breaker implemented in Go
- Host: GitHub
- URL: https://github.com/sony/gobreaker
- Owner: sony
- License: mit
- Created: 2015-05-29T04:46:15.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-10-13T09:32:10.000Z (22 days ago)
- Last Synced: 2024-10-18T15:18:17.197Z (16 days ago)
- Topics: circuit-breaker, golang, microservice
- Language: Go
- Homepage:
- Size: 31.3 KB
- Stars: 2,910
- Watchers: 34
- Forks: 184
- Open Issues: 23
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- my-awesome - sony/gobreaker - breaker,golang,microservice pushed_at:2024-10 star:2.9k fork:0.2k Circuit Breaker implemented in Go (Go)
- awesome-ccamel - sony/gobreaker - Circuit Breaker implemented in Go (Go)
- awesome - sony/gobreaker - Circuit Breaker implemented in Go (Go)
- go-awesome - gobreaker - breaker (Open source library / Current Limiter)
README
gobreaker
=========[![GoDoc](https://godoc.org/github.com/sony/gobreaker?status.svg)](https://godoc.org/github.com/sony/gobreaker)
[gobreaker][repo-url] implements the [Circuit Breaker pattern](https://msdn.microsoft.com/en-us/library/dn589784.aspx) in Go.
Installation
------------```
go get github.com/sony/gobreaker/v2
```Usage
-----The struct `CircuitBreaker` is a state machine to prevent sending requests that are likely to fail.
The function `NewCircuitBreaker` creates a new `CircuitBreaker`.
The type parameter `T` specifies the return type of requests.```go
func NewCircuitBreaker[T any](st Settings) *CircuitBreaker[T]
```You can configure `CircuitBreaker` by the struct `Settings`:
```go
type Settings struct {
Name string
MaxRequests uint32
Interval time.Duration
Timeout time.Duration
ReadyToTrip func(counts Counts) bool
OnStateChange func(name string, from State, to State)
IsSuccessful func(err error) bool
}
```- `Name` is the name of the `CircuitBreaker`.
- `MaxRequests` is the maximum number of requests allowed to pass through
when the `CircuitBreaker` is half-open.
If `MaxRequests` is 0, `CircuitBreaker` allows only 1 request.- `Interval` is the cyclic period of the closed state
for `CircuitBreaker` to clear the internal `Counts`, described later in this section.
If `Interval` is 0, `CircuitBreaker` doesn't clear the internal `Counts` during the closed state.- `Timeout` is the period of the open state,
after which the state of `CircuitBreaker` becomes half-open.
If `Timeout` is 0, the timeout value of `CircuitBreaker` is set to 60 seconds.- `ReadyToTrip` is called with a copy of `Counts` whenever a request fails in the closed state.
If `ReadyToTrip` returns true, `CircuitBreaker` will be placed into the open state.
If `ReadyToTrip` is `nil`, default `ReadyToTrip` is used.
Default `ReadyToTrip` returns true when the number of consecutive failures is more than 5.- `OnStateChange` is called whenever the state of `CircuitBreaker` changes.
- `IsSuccessful` is called with the error returned from a request.
If `IsSuccessful` returns true, the error is counted as a success.
Otherwise the error is counted as a failure.
If `IsSuccessful` is nil, default `IsSuccessful` is used, which returns false for all non-nil errors.The struct `Counts` holds the numbers of requests and their successes/failures:
```go
type Counts struct {
Requests uint32
TotalSuccesses uint32
TotalFailures uint32
ConsecutiveSuccesses uint32
ConsecutiveFailures uint32
}
````CircuitBreaker` clears the internal `Counts` either
on the change of the state or at the closed-state intervals.
`Counts` ignores the results of the requests sent before clearing.`CircuitBreaker` can wrap any function to send a request:
```go
func (cb *CircuitBreaker[T]) Execute(req func() (T, error)) (T, error)
```The method `Execute` runs the given request if `CircuitBreaker` accepts it.
`Execute` returns an error instantly if `CircuitBreaker` rejects the request.
Otherwise, `Execute` returns the result of the request.
If a panic occurs in the request, `CircuitBreaker` handles it as an error
and causes the same panic again.Example
-------```go
var cb *gobreaker.CircuitBreaker[[]byte]func Get(url string) ([]byte, error) {
body, err := cb.Execute(func() ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}return body, nil
})
if err != nil {
return nil, err
}return body, nil
}
```See [example](https://github.com/sony/gobreaker/blob/master/v2/example) for details.
License
-------The MIT License (MIT)
See [LICENSE](https://github.com/sony/gobreaker/blob/master/LICENSE) for details.
[repo-url]: https://github.com/sony/gobreaker