Git Product home page Git Product logo

deps's Introduction

deps

Go Reference coverage

Manage lifecycle of the application's dependencies and shutdown gracefully, with minimalistic API.

How to use

Create application entrypoint using deps.New() and describe dependencies with Dependent().

func main() {
	root := deps.New()

	// Worker #1 (Web server)
	go func(dep *deps.Dependency) {
		var (
			svr http.Server
			err error
			e   = make(chan error, 1)
		)
		defer dep.Stop(&err) // request abort if err!=nil

		go func() {
			e <- svr.ListenAndServe()
		}()
		select {
		case err = <-e:
			log.Println("server stopped unexpectedly: ", err)
		case <-dep.Aborted():
			log.Println("start shutdown server")
			// do not pass shutdown error to dep.Stop()
			if shutdownErr := svr.Shutdown(dep.AbortContext()); shutdownErr != nil { // timeout=1m
				log.Println("failed to shutdown server gracefully: ", shutdownErr)
			}
		}
	}(root.Dependent())

	// Worker #2 (Periodic task runner or something)
	go func(dep *deps.Dependency) {
		defer dep.Stop(nil)

		// Start worker and describe shutdown flow as same as Worker #1...
	}(root.Dependent())

	sig := make(chan os.Signal, 1)
	signal.Notify(sig, os.Interrupt)

	select {
	case <-root.AbortRequested():
		log.Println("abort: server error")
	case s := <-sig:
		log.Printf("abort: signal received (%s)", s.String())
	}
	ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
	defer cancel()
	err := root.Abort(ctx)
	if err != nil {
		log.Fatal(err)
	}
}

deps's People

Contributors

daichitakahashi avatar github-actions[bot] avatar

Watchers

 avatar

deps's Issues

Dependent起点でのAbortをどう実現するか

Dependentでエラーが発生した場合に、Root.Abortを発火させたいとする。
その場合、どのようにRootの操作を誘発させるか。

Dependent.Abortを実装する場合

Dependentのメソッドを経由してRoot.Abortをコールさせる場合。

  • AbortContextDependent.Abortに渡さなければならないため、Graceful Shutdownのタイムアウトを明示したい場合、Dependentが時間制限を知っていなければならない
  • Dependentが開始したAbortをRootが待機できなければならないため、Root.Abortの停止完了を待つ処理をRoot.Waitに分離しなければならない
    • その場合、停止完了をRoot.Waitによって待機することとなりAbortは発火してすぐにreturnしなければならず、AbortContextがどう作用するのか分かりにくくなる

主に1つめの問題から、やはりAbortを発火させる主体をRootに限定した方が良いように思える。
ではDependentからAbortを誘発させたい場合、どのような手順を踏ませることができるのか。

  • ライブラリとしてこれをサポートする実装は行わず、ベストプラクティスを提供する
  • Dependent -> RootへAbort発火を促す仕組みを実装する

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.