Skip to content

DB polling method of handling long-living processes, correct observation propagation via context.

Notifications You must be signed in to change notification settings

suessflorian/scalable-process-manager

Repository files navigation

Scalable Process Manager

Suppose your service needs to expose the ability handle the lifecycle of some in-deterministically long living process. Say it needs to spawn, list and stop processes.

The naive solution typically includes some utilisation of context.WithCancel, where a centralised map[processID]context.CancelFunc would host the means to cancel processes running on a detached goroutine*.

The problem here is that this CancelFunc map centralises process state, prohibiting horizontal scaling of the service as each service would own the means of cancelling different process. I personally ran into this problem. So this serves as a playground to explore alternative methods.

Current Solution

Basically pushing the responsibility of tracking process state to the database. For each process, a goroutine is spawned, which concurrently polls for process cancel requests and runs the process. Use of nginx for some simple load balancing.

docker compose up --scale process-manager=12

* see commit 5581706feca5f183198ec148042a5ea061ae9771 as an example

About

DB polling method of handling long-living processes, correct observation propagation via context.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published