Robust Distributed Programming Made Easy and Efficient
Перейти к файлу
Darren 8e07d12e7e Removed debug comments in VerifyTestEnv 2018-12-12 08:36:45 -08:00
AKS-scripts Major improvements in runAmbrosiaService.sh script. Add health monitoring and fix logging redirection bugs. 2018-12-08 10:36:02 -08:00
Ambrosia Initial state for moving over to github.com 2018-12-05 16:15:09 -08:00
AmbrosiaTest Removed debug comments in VerifyTestEnv 2018-12-12 08:36:45 -08:00
CONTRIBUTING net protocol edits 2018-12-11 09:13:21 -08:00
Clients Native: cleanup and refactor: add upport/downport args to connect_sockets 2018-12-11 11:40:10 -08:00
DevTools Trying to make all used versions of dlls the same 2018-12-09 14:16:15 -08:00
DustBin Several things: 2018-12-09 10:46:35 -08:00
ImmortalCoordinator Initial state for moving over to github.com 2018-12-05 16:15:09 -08:00
InternalImmortals Fixed bug where using AMBVARIANT and was clashing with Generate-Assemblies. Made separate env var (AMBVARIANTCORE) to fix it 2018-12-11 16:37:40 -08:00
Samples Merge branch 'master' of https://github.com/Microsoft/AMBROSIA 2018-12-09 13:48:57 -08:00
Scripts Fix small runAmbrosia script bug. 2018-12-11 15:21:50 -08:00
docs Create SecuringComms.md 2018-12-10 15:39:03 -08:00
.dockerignore Script changes: set OS, and use squish mode on macos for now (needs realpath). Change runAmbrosiaService so that the immortal coordinator lines can be tagged differently 2018-12-09 00:48:25 -08:00
.gitattributes Initial state for moving over to github.com 2018-12-05 16:15:09 -08:00
.gitignore Script changes: set OS, and use squish mode on macos for now (needs realpath). Change runAmbrosiaService so that the immortal coordinator lines can be tagged differently 2018-12-09 00:48:25 -08:00
.set_env.sh Several things: 2018-12-09 01:31:39 -05:00
.travis.yml squash/merge wip/travis 2018-12-11 15:22:24 -08:00
Ambrosia.nuspec Experiment over 2018-12-10 15:27:41 -08:00
Architecture.svg Add files via upload 2018-12-11 16:30:13 -08:00
BuildCore.cmd Several things: 2018-12-09 01:31:39 -05:00
CONTRIBUTING.md Create CONTRIBUTING.md 2018-12-11 16:24:27 -08:00
Dockerfile Several things: 2018-12-09 10:46:35 -08:00
Dockerfile.release Install the rest of the dotnet runtime prereqs on ubuntu for Dockerfile.release 2018-12-06 23:04:57 -08:00
LICENSE License 2018-12-06 12:04:28 -08:00
README.md updating docs 2018-12-11 16:11:23 -08:00
build_docker_images.sh Native: cleanup and refactor: add upport/downport args to connect_sockets 2018-12-11 11:40:10 -08:00
build_dotnetcore_bindist.sh Allow Mac OS to use symlink-based dedup. Hack to use python to emulate gnu coreutils realpath on Mac OS. 2018-12-10 15:29:53 -08:00

README.md

Ambrosia: Highly Robust Distributed Programming Made Easy and Efficient

  • Windows Build (net46/netcore) Windows Build Status

  • Linux Build (netcore) Linux Build Status

  • Linux Docker Build: Linux Docker Build status

Ambrosia is a programming language independent approach for authoring and deploying highly robust distributed applications. Ambrosia dramatically lowers development and deployment costs and time to market by automatically providing recovery and high availability.

Today's datacenter oriented applications, which include most popular services running in the cloud today, are composed of highly complex, distributed software stacks. For instance, they typically incorporate Event Hub or Kafka to robustly journal input and interactions for recoverability, log important information to stores like Azure blobs for debuggability, and use extremely expensive mechanisms like distributed transactions, and stateless functions with distributed persistent back-ends, in order to ensure exactly once execution of service code.

In contrast, Ambrosia automatically gives programmers recoverability, high availability, debuggability, upgradability, and exactly once execution, without requiring developers to weave together such complex systems, or use overly expensive mechanisms.

To learn more about Ambrosia's implementation and performance you can read our whitepaper.

Table of Contents

AMBROSIA Concepts

Virtual Resiliency

Virtual Resiliency is a mechanism in a (possibly distributed) programming and execution environment, typically employing a log, which exploits the replayably deterministic nature and serializability of an application to automatically mask failure.

We use the term virtual resiliency to describe the mechanism in AMBROSIA that allows programmers to write their applications in a failure oblivious way, removing the need for application writers to write logic for recovery or state protection. Data processing systems, which typically express their queries in SQL variants, have provided their query writers virtual resiliency for decades. Map-reduce systems, which dont necessarily use SQL, also provide this capability. Note that in all these cases, this feature leverages the ability to deterministically replay, like AMBROSIA.

Deterministic Replayability

In order to achieve virtual resiliency through AMBROSIA, applications but uphold the following contract: from some initial state, any execution of the same requests in the same order results in both the same final state, as well as the same outgoing requests in the same order.

Immortals

The basic building blocks of AMBROSIA are Immortals, reliable distributed objects that communicate through RPCs. An Immortal defines a set of persistent state and a set of RPC handlers that operate on that state. An instance of an Immortal is a named entity that maintains state and executes RPC handlers according to the Immortal's definition. An AMBROSIA application often has multiple instances of the same Immortal; for example, an application may define a single "job" Immortal for running a data-processing job and run multiple instances of that job operating on different data sets.

How it works

The figure below outlines the basic architecture of an AMBROSIA application, showing two communicating AMBROSIA services, called Immortals. Each inner box in the figure represents a separate process running as part of the Immortal. Each instance of an Immortal exists as a software object and thread of control running inside of an application process. An Immortal instance communicates with other Immortal instances through an Immortal Coordinator process, which durably logs the instance's RPCs and encapsulates the low-level networking required to send RPCs. The position of requests in the log determines the order in which they are submitted to the application process for execution and then re-execution upon recovery.

FINISHME - Add architecture diagram of immortal and immortal coordinator

In addition, the language specific AMBROSIA binding provides a state serializer. To avoid replaying from the start of the service during recovery, the Immortal Coordinator occasionally checkpoints the state of the Immortal, which includes the application state. The way this serialization is provided can vary from language to language, or even amongst bindings for the same language.

Features

Here is a list of features that AMBROSIA provides to application developers:

FINISHME - feature list

Quick Start: Fetch a binary distribution

FINISHME -

Quick Start: Build from Source

Build the Ambrosia Immortal coordinator and C# client code generator with this Bash script:

./build_dotnetcore_bindist.sh

Given a .NET Core SDK, this will work on Windows, Mac OS, or Linux. After that, you have an AMBROSIA binary distribution built inside the ./bin directory within your working copy.

Running a Sample

FINISHME - AmbrosiaDocs.md content will move here!!