Problem:
- Multiple processes are slow:
- full process switches (not just green thread or native thread switch)
- and have to communicate via kernel = ring switch and syscall ... super slow
- but need better way to allow separate development of components and extensibility and the source-level built-in compilation is not the solution
- also leads to LGPL license to apply to components
- and thus to the custom-made and per-project components
- not desired
Evaluate:
- microVMs:
- unikraft / kraftkit is fastest according to microVM benchmarks:
- Rust examples: https://github.com/unikraft/catalog/tree/main/examples
- and they say "just communicate via TCP, it is so fast"
- probably because of virtio or vmnet, which is basically shared memory between host and guest
- Running in UEFI
- loading of rlib's which can be found in the target/ directory in every Rust project using Cargo.
Connections:
- TCP (?)
- named pipes: flowd-go uses that
- shared memory: rtrb ringbuffer, currently in use
- file-based like in NiFi
Plugin system:
Building blocks of an FBP runtime:
- For a good List, see fractalide
- GUI for network design, debugging, status, tracing etc.
- Networked API and message format for accepting commands from GUI:
- frontend/external one, for example noflo's FBP JSON protocol
- internal
- Graph/Network state - nodes, edges etc.
- Runtime network state with processes - and signaling to processes
- Watchdog thread
- Component API definition - how instantiated, handover of connections, signaling connection, uplink into executor
- Connection and Queueing API
- Executor, which defines a profile of:
- Component API implementation = how components are loaded, run and stopped
- Connection, transfer and queueing mechanism
- Ideally, distribution of components
Problem:
Evaluate:
Connections:
Plugin system:
Building blocks of an FBP runtime: