mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-28 22:46:03 +03:00
[WIP] RequestBreaker
This commit is contained in:
parent
78ae8f6954
commit
298ae270eb
@ -27,5 +27,6 @@ Circuit Breaker Pattern 也叫断路器模式,断路器设计模式是故障
|
|||||||
上下文用于传递参数.
|
上下文用于传递参数.
|
||||||
|
|
||||||
参考:
|
参考:
|
||||||
|
|
||||||
<https://msdn.microsoft.com/en-us/library/dn589784.aspx>
|
<https://msdn.microsoft.com/en-us/library/dn589784.aspx>
|
||||||
<https://blog.csdn.net/jeffrey11223/article/details/85541923>
|
<https://blog.csdn.net/jeffrey11223/article/details/85541923>
|
||||||
|
@ -70,13 +70,13 @@ func NewRequestBreaker(opts ...Option) *RequestBreaker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do runs the given request if the RequestBreaker accepts it.
|
// Do the given requested work if the RequestBreaker accepts it.
|
||||||
// Do returns an error instantly if the RequestBreaker rejects the request.
|
// Do returns an error instantly if the RequestBreaker rejects the request.
|
||||||
// Otherwise, Execute returns the result of the request.
|
// Otherwise, Execute returns the result of the request.
|
||||||
// If a panic occurs in the request, the RequestBreaker handles it as an error and causes the same panic again.
|
// If a panic occurs in the request, the RequestBreaker handles it as an error and causes the same panic again.
|
||||||
func (rb *RequestBreaker) Do(req func() (interface{}, error)) (interface{}, error) {
|
func (rb *RequestBreaker) Do(work func() (interface{}, error)) (interface{}, error) {
|
||||||
|
//do work from requested user
|
||||||
result, err := req()
|
result, err := work()
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +119,7 @@ func (c *counters) Reset() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Count the failure and success
|
||||||
func (c *counters) Count(statue State) {
|
func (c *counters) Count(statue State) {
|
||||||
|
|
||||||
switch statue {
|
switch statue {
|
||||||
@ -132,9 +133,10 @@ func (c *counters) Count(statue State) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Breaker of circuit
|
//WrapperBreaker return a Wrapper to hold request
|
||||||
func Breaker(c Circuit, failureThreshold uint32) Circuit {
|
func WrapperBreaker(c Circuit, failureThreshold uint32) Circuit {
|
||||||
|
|
||||||
|
//内部计数器
|
||||||
cnt := counters{}
|
cnt := counters{}
|
||||||
|
|
||||||
return func(ctx context.Context) error {
|
return func(ctx context.Context) error {
|
||||||
|
@ -37,7 +37,7 @@ func TestBasicBreaker(t *testing.T) {
|
|||||||
|
|
||||||
// Get wraps http.Get in CircuitBreaker.
|
// Get wraps http.Get in CircuitBreaker.
|
||||||
func Get(url string) ([]byte, error) {
|
func Get(url string) ([]byte, error) {
|
||||||
body, err := breaker.Execute(func() (interface{}, error) {
|
body, err := breaker.Do(func() (interface{}, error) {
|
||||||
resp, err := http.Get(url)
|
resp, err := http.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
Reference in New Issue
Block a user