"walk in a distributed systems park with orleans" Евгений Бобров
TRANSCRIPT
Walk in a distributed systems park with Orleans
Yevhen Bobrovyevhen
YouScan.io@
Orleans is …
… runtime and programming model for building distributed systems based on actor model
Built by eXtreme Computing Group at Microsoft Research
Has been used internally (during last few years)
Open-sourced in 2015(available on GitHub and Nuget)
ScalabilityAvailabilityReliablity
built for *
HALO4
Orleanspowered by
11+ million players1.5 billion games270 million hours
Why do we need it?
Stateless Services
Service
Stateless Services
Service
Stateless Services
ServiceService
Stateless Services
ServiceService
Stateless Services
ServiceService
Stateless Services
ServiceService Service
Stateless Services
ServiceService Service
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Service
Service
Service
Data Shipping Paradigm
Stateless Services (a.k.a 3-tier)scales very badly
In a Cloudlatency will kill you
Stateful Services
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Service
Service
Service
Function Shipping Paradigm
Stateful Services
Stateful Services
shared state
Stateful Services
shared stateconcurrency, locks, and all that jazz
Stateful Services
shared stateconcurrency, locks, and all that jazz
PAIN
Actor Model
Single-threaded execution (no need to use locks)
Data locality and consistency (due to encapsulation)
Objects on steroids
Stateful Services
Actors make it simple
How to distribute?
Akka / Erlang
10.0.0.1
10.0.0.2
var game = activate(“game”, “tcp://10.0.0.1”)game.invoke(“foo()”)
var user = activate(“user”, “tcp://10.0.0.2”)user.invoke(“bar()”)
Routing Problems
10.0.0.1
10.0.0.2
10.0.0.5
10.0.0.8
Routing Problems
10.0.0.1
10.0.0.2
10.0.0.5
10.0.0.8
Routing Problems
Cluster Membership
Routing Problems
Cluster Membership Workload Distribution
Routing Problems
Cluster Membership Workload Distribution
Static
Routing Problems
Cluster Membership Workload Distribution
StaticDynamic
Routing Problems
Cluster Membership Workload Distribution
StaticDynamic Distributed Consensus
Routing Problems
Cluster Membership Workload Distribution
StaticDynamic Distributed Consensus
Timeouts
Routing Problems
Cluster Membership Workload Distribution
StaticDynamic Distributed Consensus
TimeoutsLifecycle
Routing Problems
Cluster Membership Workload Distribution
StaticDynamic Distributed Consensus
TimeoutsLifecycle
PAIN
Orleans is …
… runtime and programming model for building distributed systems based on actor model
ScalabilityAvailabilityReliablity
How?
Virtual Actors
Location Transparency
var game = activate(“game”, “tcp://10.0.0.1”)game.invoke(“foo()”)
Akka / Erlang
Orleansvar game = activate(“game”) “tcp://10.0.0.1”)game.invoke(“foo()”)
Perpetual Existence
var game = activate(“game”, “tcp://10.0.0.1”)game.invoke(“foo()”)
Akka / Erlang
Orleansvar game = activate(“game”, “tcp://10.0.0.1”)game.invoke(“foo()”)
inversion of control
• Placement• Lifecycle
Runtime takes care of
New node joined the
cluster
Unavailable (crashed)
node
New Activation New actor activations
courtesy of @johnazariah
Cooperative multitasking
Threads ~= Cores
Core 1
Core 2
Core N
Mechanical sympathy
Scheduler(turns)
Thread 1
Thread N
Non-blocking IOPromises (TPL, Task, Combinators)
Multiplexed TCPMillions of actors with low OS overhead
Automatic backpressure by designSynchronous, request-response messaging
Tour De Orleans
Grain(a.k.a. Actor)
Silo(a.k.a. Node)
Cluster(a.k.a. Cluster)
Major Concepts
Define interface:
public interface IInventoryItemGrain : IGrain { Task Increment(int qty); Task Decrement(int qty); Task<int> Total(); }
Define implementation:class InventoryItemGrain : Grain, IInventoryItemGrain{ int total;
public Task Increment(int qty) { total++; return TaskDone.Done; }
public Task Decrement(int qty) { total--; return TaskDone.Done; }
public Task<int> Total() => Task.FromResult(total);}
Invoke:
var item = GrainFactory .GetGrain<IInventoryItemGrain>("iPhone");
await item.Increment(100);await item.Decrement(100);
Console.WriteLine(await item.Total());
More Orleans
Placement hints
• Random (default)
• Prefer-local (clustering actors)
• Distribute evenly (# of activations)
Automatic deactivation(garbage collection)
• Global timeout (idle time)
• Per-actor type
• Imperative deactivation
Timers/Reminders
• Async timers (single-threaded guarantee)
• Durable recurrent reminders
retries, recurrent tasks
Streams
• Direct TCP / Azure Queues
• Durable Pub-Sub (WATS/SQL)
• Declarative subscriptions
• Cluster-wide
When to use?
Scaling 3-tier architecture(stateless services)
IoT1. GPS Tracker (RFID, inventory, cars)2. Counters (running total)3. Sensor data
Data stream processing1. Fraud detection2. Aggregation
Ultra-scalable & reliable web crawling
END