From c25ab1db86ba06bfb2ea91574162b9891370e45e Mon Sep 17 00:00:00 2001 From: Alex Unger Date: Fri, 28 Jan 2022 21:22:29 +0100 Subject: [PATCH] diagrams and clarifications --- docs/ocis/adr/0014-microservices-runtime.md | 11 ++++++++--- docs/ocis/static/runtime.drawio.svg | 4 ++++ 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 docs/ocis/static/runtime.drawio.svg diff --git a/docs/ocis/adr/0014-microservices-runtime.md b/docs/ocis/adr/0014-microservices-runtime.md index 11dce88be..b06202701 100644 --- a/docs/ocis/adr/0014-microservices-runtime.md +++ b/docs/ocis/adr/0014-microservices-runtime.md @@ -13,12 +13,14 @@ geekdocFilePath: 0014-microservices-runtime.md ## Context and Problem Statement -In an environment where shipping a single binary beats the deployment wars, framing a whole family of microservices within a package and running it using Go language mechanisms has plenty of value. In such environment, a runtime is necessary to orchestrate the services that run within it. +In an environment where shipping a single binary makes it easier for the end user to use oCIS, embedding a whole family of microservices within a package and running it leveraging the use of the Go language has plenty of value. In such environment, a runtime is necessary to orchestrate the services that run within it. Other solutions are hot right now, such as Kubernetes, but for a single deployment this entails orbital measures. ## Decision Drivers -- Start oCIS microservices with a single command (`ocis server`) -- Clear separation of concerns +- Start oCIS microservices with a single command (`ocis server`). +- Clear separation of concerns between services. +- Control the lifecycle of the running services. +- Services can be distributed across multiple machines and still be controllable somehow. ## Considered Options @@ -46,6 +48,7 @@ Pros - Implementation based in swappable interfaces. - Multiple implementations, either in-memory or through external services - Production ready +- Good compromise between high and low level code. ## Decision Outcome @@ -53,6 +56,8 @@ Number 3: A hybrid solution between framework and in-house. ### Design +{{< svg src="extensions/storage/static/runtime.drawio.svg" >}} + First of, every ocis service IS a go-micro service, and because go-micro makes use of urfave/cli, a service can be conveniently wrapped inside a subcommand. Writing a supervisor is then a choice. We do use a supervisor to ensure long-running processes and embrace the "let it crash" mentality. The piece we use for this end is called [Suture](https://github.com/thejerf/suture). The code regarding the runtime can be found pretty isolated [here](https://github.com/owncloud/ocis/blob/d6adb7bee83b58aa3524951ed55872a5f3105568/ocis/pkg/runtime/service/service.go). The runtime itself runs as a service. This is done so messages can be sent to it using the oCIS single binary to control the lifecycle of its services. diff --git a/docs/ocis/static/runtime.drawio.svg b/docs/ocis/static/runtime.drawio.svg new file mode 100644 index 000000000..bbaa9ba62 --- /dev/null +++ b/docs/ocis/static/runtime.drawio.svg @@ -0,0 +1,4 @@ + + + +
Runtime
Runtime
ocs
ocs
graph
graph
glauth
glauth
accounts
accounts
storage
storage
proxy
proxy
idp
idp
thumbnails
thumbnails
webdav
webdav
suture
suture
$ ocis server
$ ocis kill proxy
$ ocis start proxy
$ ocis list
$ ocis server...
the runtime component starts services
and suture then takes over, keeping
track of every started service, restarting
it when needed if an error occurred.
the runtime component starts services...
each service is implemented as a sub-command. The binary essentially calls itself with the right arguments and the side effect is that a
service is started. The service will then be monitored by Suture.
each service is implemented as a sub-command. The binary essentially calls itself with the right arguments and the side e...
the runtime is a service in itself. Starting an
oCIS instance will start a runtime service.
the runtime is a service in itself. Star...
Text is not SVG - cannot display
\ No newline at end of file