Code Monkey home page Code Monkey logo

breaker's Introduction

breaker

documentation

Dr. Frederick Frankenstein: Throw... the third switch!

Igor: [shocked] Not the third switch!

The breaker package provides a very simple implementation of the Circuit Breaker design pattern. Circuit Breakers are a classic pattern used in backend systems, and I just made this out of necessity at work one day. There's a few other implementations out there, but I figured I'd put mine up on github.

features

This implementation is relatively barebones; it's intended to be tripped and reset manually, but it also has the ability to "wrap" a function call with a timeout if that's your sort of thing.

example

package main

import (
       "github.com/kellydunn/breaker"
       "time"
)

func main() {

     // Lets make a breaker that will trip after 5
     // consecutive errors are counted
     b := breaker.NewBreaker(5)

     // We will now try trigger The breaker
     // once a second to simulate an error.
     // This will exit in about 5 seconds.
     for {
         sleep(time.Second)

         // Lets simulate an error here
         if true {
            b.Trip()
         }
     }
     
     fmt.Printf("Error!: %v", err)

     // This breaker is a bit more forgiving;
     // it'll be thrown after 10 consecutive errors
     b2 := breaker.NewBreaker(10)

     // Here, we'll set up a function that sleeps for
     // 2 seconds, but set a timeout of 1 second.
     // Since it will take 1 second to trip the breaker,
     // This fucntion should exit in about 10 seconds.
     err := b2.Do(func() error {
     
         sleep(2 * time.Second)
         
     }, time.Second)      

     fmt.Printf("Error!: %v", err)
}    

Enjoy!

related work

breaker's People

Contributors

kellydunn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

breaker's Issues

Use atomics for improved performance

context: i was curious how much faster it would be to use atomics instead of locks to handle mutating the failures member.

(looks like it's about 45ns/op to use locks, 8ns/op to use atomics, if you were curious)

// Trip increments the failure count of the current Breaker.
func (b *Breaker) Trip() {
   atomic.AddInt64(&b.failures, 1)
}

// Reset resets the current Breaker's failure count to zero.
func (b *Breaker) Reset() {
    atomic.StoreInt64(&b.failures, 0)
}
```​

Acceptance Criteria:

  • Add atomic operations to Trip() and Reset()
  • Improve tests by adding benchmarks to operations (optional)

Investigate race condition issues with `Trip()`, improve testing to add resiliency

yo! i was poking around that breaker lib ... there's some raciness afoot (try running the tests on master with ​-race​ on, or write a benchmark that calls ​Trip()​ repeatedly)

  • Investigate race issue
  • Improve tests by adding -race
  • Improve tests by calling Trip() repeatedly
  • Improve tests by calling Trip() in a multi-goroutine context

Reset is unreachable in `Do` Call

Reset() is currently unreachable here: https://github.com/kellydunn/breaker/blob/master/breaker.go#L109-L110

The intent of Do is to get either a signal from the timeout channel or the err channel, or succeed with its call. We could also have a successchan that could poll on success of the event, which would be observing the absence of an error on the function that's being called.

Acceptance Critieria:

  • Ensure Do() exits
  • Improve coverage by adding a sufficient test.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.