44

Akka.net versus microsoft orleans

Embed Size (px)

Citation preview

Page 1: Akka.net versus microsoft orleans
Page 2: Akka.net versus microsoft orleans

Actor Model in .NET:Akka.NET vs Microsoft Orleans

for the curious

William TullochLead Consultant – Readify@wtulloch

Page 3: Akka.net versus microsoft orleans

PreambleConcurrency and distributed applications

Page 4: Akka.net versus microsoft orleans

What is the Actor Model?

Page 5: Akka.net versus microsoft orleans

The Model of Actor Model

A way of reasoning about concurrent computation

Page 6: Akka.net versus microsoft orleans

What is the Actor Model

A way of reasoning about concurrent computationIs inherently concurrent

Page 7: Akka.net versus microsoft orleans

The Model of Actor Model

Is a conceptual model for reasoning about concurrent computationIs inherently concurrentManages concurrency through message passing

Page 8: Akka.net versus microsoft orleans

The Model of Actor Model

Is a conceptual model for reasoning about concurrent computation

Adopts the philosophy that everything is an actor

Is inherently concurrentManages concurrency through message passing

Page 9: Akka.net versus microsoft orleans

What is an Actor? Lightweight

Never shares state

Communicates through asynchronous messagesHas a mailbox to buffer messages

Processes one message at a time

Is a single-thread object

Page 10: Akka.net versus microsoft orleans

An Actor Can not exist on its own

Page 11: Akka.net versus microsoft orleans

Microsoft Orleans&

Akka.NET

Page 12: Akka.net versus microsoft orleans

The overview

Akka.NET

• A port of Java/Scala Akka

• Open source

• Task Parallel Library

• Reactive methodology• Can be run within an

application, on-prem or in the cloud(?)

Page 13: Akka.net versus microsoft orleans

The overview

Orleans

• Started by Microsoft Research

• Open source

• Task Parallel Library

• Reactive methodology

• Cloud-native

Akka.NET

• A port of Java/Scala Akka

• Open source

• Task Parallel Library

• Reactive methodology• Can be run within an

application, on-prem or in the cloud(?)

Page 14: Akka.net versus microsoft orleans

Orleans versus Akka.NET

Page 15: Akka.net versus microsoft orleans

Hosting Actors

Image from Halo Orleans at build 2104

Orleans - Silo Akka - ActorSystem

Page 16: Akka.net versus microsoft orleans

Hosting Actors

Image from Halo Orleans at build 2104

Orleans - Silo Akka - ActorSystem

Page 17: Akka.net versus microsoft orleans

Actors versus Grains

Page 18: Akka.net versus microsoft orleans

Orleans: An Actor is Grain

Grain instances always exist virtually

Page 19: Akka.net versus microsoft orleans

Orleans: An Actor is Grain

Grain instances always exist virtuallyAre created on demand

Page 20: Akka.net versus microsoft orleans

Orleans: An Actor is Grain

Grain instances always exist virtuallyAre created on demand

Are location transparent

Page 21: Akka.net versus microsoft orleans

Orleans: An Actor is Grain

Grain instances always exist virtuallyAre created on demand

Are location transparent

Every grain must have an Id

Page 22: Akka.net versus microsoft orleans

Akka.NET: An Actor is Actor

Must be explicitly created and stopped

Page 23: Akka.net versus microsoft orleans

Akka.NET: An Actor is Actor

Must be explicitly created and stoppedAre created in the context of their parent

Page 24: Akka.net versus microsoft orleans

Akka.NET: An Actor is Actor

Must be explicitly created and stoppedAre created in the context of their parentExposes a set of life-cycle hooks

Page 25: Akka.net versus microsoft orleans

Akka.NET: An Actor is Actor

Must be explicitly created and stoppedAre created in the context of their parentExposes a set of life-cycle hooks Are location transparentakka.tcp://[email protected]:12345/user/HelloWorld/$c

Page 26: Akka.net versus microsoft orleans

Creating grains and actors

Page 27: Akka.net versus microsoft orleans

Creating a grain

Page 28: Akka.net versus microsoft orleans

Orleans – creating a grain

• In Visual Studio create two projects•One for your grain interfaces•One for your grain implementations

• In both projects install the NuGet package Microsoft.Orleans.OrleansCodeGenerator.build

Page 29: Akka.net versus microsoft orleans

Create a Grain interface

public interface IHelloWorld : IGrainWithIntegerKey{ Task Greeting(string name);

Task<string> ReturnGreeting(string name);}

Must implement one of the following:• IGrainWithIntegerKey• IGrainWithGuidKey• IGrainWithStringKey• IGrainWithIntegerCompou

ndKey• IGrainWithGuidCompound

Key

Page 30: Akka.net versus microsoft orleans

Create an implementation of the interface

public class HelloWorldGrain : Grain, IHelloWorld{ public Task Greeting(string name) { Console.WriteLine($"Hi {name} from Orleans"); return TaskDone.Done; } public Task<string> ReturnGreeting(string name) { return Task.FromResult($"Hi {name} from Orleans"); }}

Page 31: Akka.net versus microsoft orleans

Interacting with Grains

static async Task SendMessage(User user ){ var helloWorld = GrainClient.GrainFactory.GetGrain<IHelloWorld>(0); var response = await helloWorld.Greeting(user); WriteLine(response);}

Page 32: Akka.net versus microsoft orleans

Creating an Actor

Page 33: Akka.net versus microsoft orleans

Akka.Net – creating an actor

• In Visual Studio:• Create a new class library • Create a console application

• Import the core Akka.NET Nuget package: Akka

Page 34: Akka.net versus microsoft orleans

Create message

public class HelloUserMessage{ public User User { get; } public HelloUserMessage(User user) { User = user; }}

Page 35: Akka.net versus microsoft orleans

Create an actorpublic class HelloWorldActor : ReceiveActor{ private TimeSpan _waitPeriod; public HelloWorldActor(TimeSpan waitPeriod) { _waitPeriod = waitPeriod;

Receive<HelloUserMessage>(m => { var user = m.User; Thread.Sleep(_waitPeriod); WriteLine($"Hi {user.Id} {user.FirstName} nice to meet you [on thread "); }); Receive<DataCompleted>(m => WriteLine("Data is completed"));}

Page 36: Akka.net versus microsoft orleans

Using the actor

var system = ActorSystem.Create("demo")

var helloWorld = system.ActorOf(Props.Create(() => new HelloWorldActor()));

helloWorld.Tell(new HelloUserMessage(new User());

await system.Terminate();

Page 37: Akka.net versus microsoft orleans

Demo Hello World

Page 38: Akka.net versus microsoft orleans

Messages and Serialisation

Page 39: Akka.net versus microsoft orleans

Messages and Serialisation

public class UserMessage { public string FirstName { get;} public string LastName { get;} public UserMessage(string firstName, string lastName) { FirstName = firstName; LastName = lastName; }}

Page 40: Akka.net versus microsoft orleans

Messages and serialisation

Task<string> Greeting(string firstName, string lastName);

Task<Immutable<byte[]>> ProcessRequest(Immutable<byte[]> request);

Page 41: Akka.net versus microsoft orleans

Messages and Serialisation

[Immutable] public class User { public string FirstName { get;} public string LastName { get;}}

Page 42: Akka.net versus microsoft orleans

Bits and Pieces

“let it crash” and exception handlingPersisting stateChanging behaviourGrains for everyoneRouting in Akka.NETClustering in Akka.NET

Page 43: Akka.net versus microsoft orleans

Summing up

Page 44: Akka.net versus microsoft orleans

Resources

Akka.NETAkka.NET home: http://getakka.net/Bootcamp: https://github.com/petabridge/akka-bootcamp

OrleansOrleans Home: http://dotnet.github.io/orleans/Halo-Orleans: https://channel9.msdn.com/Events/Build/2014/3-

641

Comparing Akka.NET and Orleans: https://github.com/akka/akka-meta/blob/master/ComparisonWithOrleans.md