Staged event driven single machine embedded micro-framework.
- Garbage Free (core runtime)
- Lock Free
- Block Free
- Small memory footprint
- Smart thread scheduling
Garbage free message passing design eliminates garbage collector stalls providing predictable data rates.
Lock free non-blocking message passing enables cores to make continuous progress at all times.
Staged pipeline scheduler enables optimization of the workload across cores.
#Simple stage examples
- https://github.com/oci-pronghorn/PronghornExampleInputStages
- https://github.com/oci-pronghorn/PronghornExampleOutputStages
#Why Pronghorn
- Broad compatibility
Android (Java 7 subset) no Lambdas used
Java profile compact1
No use of Unsafe, Java 9 module compatibility - Simple concurrency model
quickly write correct code with actors
easily leverage hundreds or more cores
all pipes are defined as produced from one actor and consumed by one other - Separation of design concerns
* Business aware scheduling Actors who do not have work are not scheduled
Schedulers can be custom designed or existing solutions applied
* Strong types generated externally
Types between actors are externally defined
New fields can be added and mapped to new business specific usages - Multiple APIs
Embedded friendly use of wrapping arrays
Integrate with a wide variety of existing interfaces
Visitors for reading and writing
Object proxies for reading and writing
Zero copy direct access to input and output fields
Replay of messages until they are released - Simple debug and refactoring
Messages have full provenance and actor chain upon exception
Test framework supports automated regression test construction for refactor
Fuzz testing based on message pipes definitions
Generative contract testing based on behavior definitions for stages - Static memory allocations
No need to release memory and no GC
Simplify memory usage analysis of the application
Minimize runtime failures, including out of memory - Copy preferred over lock usage
No stalled cores, block free, wait free, continuous progress
Efficient power usage
Leverages new fast memory subsystems
Enables efficient NUMA usage - Sequential memory usage
Leverages CPU pre-fetch and caches for fastest possible throughput
Persistence and immediate start up for free with non-volatile memory
All media is sequential, mechanical sympathy
Maximum use of hardware bandwidth - Software sketches
Extensive requirements gathering put into a graph
Involve non-technical people in the early stages
Refine the design before making any commitments, or beginning iterations - Minimized deployed application
For embedded systems, only the needed applications and interfaces are deployed
Configuration is done at compile time
Ultra-small attack surface
Scales well in docker and cloud deployments
Targests absolute minimum resources consumed
#Expected usage plan
Most projects using this framework will follow these steps.
- Define your data flow graph.
- Define the contracts between each stage.
- Test first development by using generative testing as the graph is implemented.
NOTE: this is being proved out in the PronghornGateway project.
#Usage
To use this in your maven project add the following dependency.
<dependency>
<groupId>com.ociweb</groupId>
<artifactId>Pronghorn</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Also add this public repository to your pom or settings.
<repository>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
<id>repository-pronghorn.forge.cloudbees.com</id>
<name>Active Repo for PronghornPipes</name>
<url>http://repository-pronghorn.forge.cloudbees.com/snapshot/</url>
<layout>default</layout>
</repository>
Looking for the release jar? This project is under active development.
Please consider getting involved and sponsoring the completion of Pronghorn
Nathan Tippy, Principal Software Engineer OCI
Twitter: @NathanTippy