Files
fission-src/Documentation/Architecture.md
T
2016-08-18 21:37:52 -07:00

108 lines
2.6 KiB
Markdown

A high level view of the internals of Fission.
Components
==========
Language-neutral components:
* Controller
* Container Pool Manager
* Container Specializer
* Router
Language-specific components:
* Language Build Container
* Language Run Container
Controller
----------
Function and Trigger CRUD APIs. APIs to watch for changes are also
included (useful for other components that cache state).
See api/swagger.json for API details.
This is the only stateful component. It needs to be configured with a
URL to an etcd cluster and a path to a persistent volume. The volume
will be used to store the functions' source code.
Etcd is used as the DB.
Container Pool Manager
----------------------
Manage pool of generic containers.
Probably use K8s RCs. Can we Use labels to move pods from one rc to
another? What about jobs?
Container Specializer
---------------------
Inputs: a running generic language run container, a user function,
optionally an http trigger URL.
Calls Language Run Container and sets up Router to point to it.
Router
------
- Cache trigger -> container instance mapping; implement cache miss and expiration.
- Invoke Specializer, setup up k8s API
- Forward requests
The Router is stateless -- it can be scaled or killed at any time.
There's a lot of functionality overlap with K8S Ingress Controllers.
We should clearly use Ingress and Ingress Controllers in some way.
It's not exactly clear at the moment how -- should make a whole new
Ingress Controller perhaps based on the contrib/nginx
Autoscaler
----------
This autoscales the language run containers that are backing a
trigger.
What metrics this is based on is TBD.
- Number of requests/sec
- "Backlog" -- number of outstanding requests not yet started -- how to measure this?
- Change in turn-around time?
Language Build Container
------------------------
* The Language Build Container is a container that is invoked for a
build. It takes one user-created function and outputs something
that can be run by the corresponding Language Run Container.
* The Build Container must implement the Language Build Container
interface.
Language Run Container
----------------------
* The Language Run Container is the container in which user functions
run.
* The Run Container is started without the user function. It must
start as a "Generic Container". It must implement the
"specialization interface". In short, it must implement an HTTP
server that can receive a piece of code, verify its signature, and
map it to an HTTP endpoint. See
Documentation/specs/LanguageRunContainerSpec.md for details.