Skip to content

lab259/go-rscsrv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-rscsrv

CircleCI codecov GoDoc Go Report Card Release

Resource/Service pattern for Go applications.

serviceStarter := rscsrv.NewServiceStarter(
	&rscsrv.ColorServiceReporter{},  // First, the reporter
	&Service1, &Service2, &Service3, // Here all services that should be started.
)

err := serviceStarter.Start()
if err != nil {
	serviceStarter.Stop(true)
}

// ... Service1, Service2 and Service3 were started

See /examples for more usage examples.

Service basics

The Service is a interface that only provides:

  • Name(): string;

But, it is the base of this library. Along side Service you must implement Startable, StartableWithContext and/or Stoppable.

Startable

Startable represent services that its start process cannot be cancelled.

  • Start(): error

StartableWithContext

StartableWithContext provides the functionality for services that can have its start process aborted.

  • StartWithContext(context.Context) error;

Retrier

The StartRetrier is a mechanism that retries starting a Service when it fails. No special Service implementation is required. The StartRetrier is a proxy that wraps the real Service.

The NewStartRetrier wraps the Service providing the desired repeatability.

Example:

serviceStarter := rscsrv.NewServiceStarter(
	&rscsrv.ColorServiceReporter{},  // First, the reporter
	rscsrv.NewStartRetrier(&Service1, rscsrv.StartRetrierOptions{
		MaxTries:          5,
		DelayBetweenTries: time.Second * 5,
		Timeout:           time.Second * 60,
	}), &Service2, &Service3, // Here all services that should be started.
)

err := serviceStarter.Start()
if err != nil {
	serviceStarter.Stop(true)
}

In this example, the Service1 is wrapped by a StartRetrier. The retrier will keep trying to start Service1 until it reaches 5 failures. Between each try, the retrier will wait 5 seconds before try again.

Retrier helpers

The way StartRetrier was designed is for opt-in, so when the library gets updated, the behaviour do not change. So a helper was designed to

Retriers will apply the StartRetrier to many services at once:

retriers := rscsrv.Retriers(rscsrv.StartRetrierOptions{
	MaxTries:          5,
	DelayBetweenTries: time.Second,
	Timeout:           time.Second * 60,
})

serviceStarter := rscsrv.NewServiceStarter(
	&rscsrv.ColorServiceReporter{},  // First, the reporter
	retriers(&Service1, &Service2, &Service3)...,
)

err := serviceStarter.Start()
if err != nil {
	serviceStarter.Stop(true)
}

About

Resource/Service for Go applications

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 3

  •  
  •  
  •