SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
Uma Introdução ao
Actor Model com
Microsoft Orleans
2019 – Trilha .NET
Agenda
Microsoft Orleans e o Actor Model2
Introdução1
Arquitetura stateful3
Código e Demo4
Quem sou eu?
Fabio Gouw
Arquiteto de Soluções @ Itaú
@fabiogouw
fabiogouw
http://www.fabiogouw.com
Introdução
Introdução | Um pouco de estatística...
0
10
20
30
40
50
60
70
80
90
100
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
1 milhão
de logins
29 milhões
de mensagens
188 milhões
de e-mails
3,8 milhões
de buscas
% de usuários de internet / população do mundo
Em um minuto...
Orientado a
Mensagens
Elástico Resiliente
Responsivo
https://www.reactivemanifesto.org/
Introdução | Sistemas Reativos
Introdução | Exemplos de Aplicações
Microsoft Orleans
Orleans | Framework e história
2014
Preview público
2017
Versão 2.0 com suporte a
.NET Core
2010
Projeto iniciado no
Microsoft Research
2015
Open source (MIT)
1973
Actor Model: Artigo de Carl Hewitt,
Peter Bishop e Richard Steiger
Framework para criação de aplicações distribuídas baseado no Actor Model, voltado
para cloud, em cenários stateful e near real-time.
Actor Model | Conceitos
Modelo conceitual de processamento concorrente que trata atores como sua primitiva
de computação.
Atores...
• representam conceitos da vida real
• possuem identidade única
• se comunicam através de
mensagens
Possui uma fila própria
para armazenar
mensagens a processar
(mailbox)
Cada ator possui seu
próprio estado interno
Recebe as mensagens de
forma assíncrona
Envia mensagens para
outros atores
Processamento é feito de
forma single-threaded,
mensagem a mensagem
Actor Model | Conceitos
Thread 2
Thread 1
Shared State (memória)
Tempo
Actor Model | Controle de Concorrência
Tempo
com uso de locks orientado a mensagens
Orleans | Ativação Transparente
Persistido
Ativando Desativando
Ativo na
memória
Virtual Actor → Grains
Host de Grains → Silos
Arquitetura com o Microsoft
Orleans
Orleans | Arquitetura
Frontend StorageStateful middle tier
Orleans | Arquitetura
StorageStateful middle tierFrontend
Location transparency!
Orleans | Arquitetura
StorageStateful middle tierFrontend
Orleans | Arquitetura
StorageStateful middle tierFrontend
Exemplo de Código
Silo Host
Grains
ContractsWeb Api
<<interface>>
IDevice
DeviceGrain DeviceState
Program
Startup
Device
Controller
Exemplo | Componentes e Classes
Microsoft.Orleans.Core.Abstractions
Microsoft.Orleans.OrleansCodeGenerator.Build
Microsoft.Orleans.Client
Microsoft.Orleans.Clustering.AdoNet
Microsoft.Orleans.Server
Microsoft.Orleans.OrleansSQLUtils
OrleansDashboard
Microsoft.Orleans.Core.Abstractions
Microsoft.Orleans.OrleansCodeGenerator.Build
public interface IDevice : IGrainWithIntegerKey
{
Task SetTemperature(double temperature);
Task<double> GetTemperature();
}Silo Host
Grains
ContractsWeb Api
<<interface>>
IDevice
DeviceGrain DeviceState
Program
Startup
Device
Controller
Exemplo | Interface – contrato único
[StorageProvider(ProviderName="Devices")]
public class DeviceGrain : Grain<DeviceState>, IDevice
{
public Task<double> GetTemperature()
{
return Task.FromResult(State.LastTemperature);
}
public async Task SetTemperature(double temperature)
{
State.LastTemperature = temperature;
await WriteStateAsync();
}
}
public class DeviceState
{
public double LastTemperature {get;set;}
}
Silo Host
Grains
ContractsWeb Api
<<interface>>
IDevice
DeviceGrain DeviceState
Program
Startup
Device
Controller
Exemplo | Implementação do ator (grain)
public static int Main(string[] args)
{
...
var builder = new SiloHostBuilder()
.Configure<ClusterOptions>(options => {
options.ClusterId = "dev";
options.ServiceId = "OrleansDemo";
})
.UseAdoNetClustering(options => {
options.Invariant = "System.Data.SqlClient";
options.ConnectionString = ...
})
.AddAdoNetGrainStorage("Devices", options=> {
options.Invariant = "System.Data.SqlClient";
options.ConnectionString = ...
})
.ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000)
.UseDashboard(_ => { })
.ConfigureApplicationParts(parts => parts.AddFromApplicationBaseDirectory())
.ConfigureLogging(logging => logging.AddConsole());
var host = builder.Build();
await host.StartAsync();
}
Silo Host
Grains
ContractsWeb Api
<<interface>>
IDevice
DeviceGrain DeviceState
Program
Startup
Device
Controller
Exemplo | Host dos atores (server)
// Startup.cs
IClusterClient client = new ClientBuilder()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";
options.ServiceId = "OrleansDemo";
})
.UseAdoNetClustering(options =>
{
options.Invariant = "System.Data.SqlClient";
options.ConnectionString = ...
})
.ConfigureLogging(logging => logging.AddConsole())
.Build();
await client.Connect();
...
services.AddSingleton(client);
Silo Host
Grains
ContractsWeb Api
<<interface>>
IDevice
DeviceGrain DeviceState
Program
Startup
Device
Controller
Exemplo | Configuração do client
[Route("api/[controller]")]
[ApiController]
public class DeviceController : ControllerBase {
private readonly IClusterClient _client;
public DeviceController(IClusterClient client) {
_client = client;
}
// GET api/device/5
[HttpGet("{deviceId}")]
public async Task<double> Get(int deviceId) {
var device = _client.GetGrain<IDevice>(deviceId);
return await device.GetTemperature();
}
// PUT api/device/5
[HttpPut("{deviceId}")]
public async Task Put(int deviceId, [FromForm] string value) {
var device = _client.GetGrain<IDevice>(deviceId);
await device.SetTemperature(double.Parse(value));
}
}
Silo Host
Grains
ContractsWeb Api
<<interface>>
IDevice
DeviceGrain DeviceState
Program
Startup
Device
Controller
Exemplo | Web API de consumo
Live Demo
https://youtu.be/Q-JkcgoqjBo
Conclusão | Para saber mais
• Exemplo https://github.com/fabiogouw/OrleansDemo
• Documentação do Microsoft Orleans
https://dotnet.github.io/orleans/
• Vídeo Building the Halo 4 Services with Orleans - Caitie McCaffrey
https://www.infoq.com/presentations/halo-4-orleans/
• Livro Reactive Messaging Patterns with the Actor Model:
Applications and Integration in Scala and Akka - Vaughn Vernon
• Post Design Techniques for Building Stateful, Cloud-Native
Applications – Hugh McKee
https://www.lightbend.com/blog/design-techniques-stateful-
cloud-native-applications-resilience-recoverability-scalability
Obrigado!
@fabiogouwfabiogouw http://www.fabiogouw.com

Mais conteúdo relacionado

Semelhante a Introdução ao Actor Model com Microsoft Orleans

Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2rodrigoareis
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Curso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoCurso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoLuiz Carvalho
 
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...Adriel Café
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Aplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightAplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightEric Cavalcanti
 
Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Rogério Moraes de Carvalho
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaGiovanni Bassi
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Evolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações WebEvolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações WebBreno Vitorino
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeAlessandro Binhara
 
RedGate .NET Reflector no dia-a-dia de um programador
RedGate .NET Reflector no dia-a-dia de um programadorRedGate .NET Reflector no dia-a-dia de um programador
RedGate .NET Reflector no dia-a-dia de um programadorComunidade NetPonto
 
Construindo sua primeira aplicação android
Construindo sua primeira aplicação androidConstruindo sua primeira aplicação android
Construindo sua primeira aplicação android666Insanity
 

Semelhante a Introdução ao Actor Model com Microsoft Orleans (20)

Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2Construindo portlets para IBM WebSphere Portal – Parte 2
Construindo portlets para IBM WebSphere Portal – Parte 2
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Curso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoCurso de Introdução ao Android Básico
Curso de Introdução ao Android Básico
 
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
FLISOL 2012 - Palestra "Introdução ao Desenvolvimento de Aplicações para o Si...
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Conhecendo o Android Wear
Conhecendo o Android WearConhecendo o Android Wear
Conhecendo o Android Wear
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Aplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightAplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek Night
 
Android
AndroidAndroid
Android
 
Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Evolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações WebEvolução das arquiteturas para aplicações Web
Evolução das arquiteturas para aplicações Web
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
 
RedGate .NET Reflector no dia-a-dia de um programador
RedGate .NET Reflector no dia-a-dia de um programadorRedGate .NET Reflector no dia-a-dia de um programador
RedGate .NET Reflector no dia-a-dia de um programador
 
Minicurso Java
Minicurso JavaMinicurso Java
Minicurso Java
 
Entity framework 7
Entity framework 7Entity framework 7
Entity framework 7
 
Construindo sua primeira aplicação android
Construindo sua primeira aplicação androidConstruindo sua primeira aplicação android
Construindo sua primeira aplicação android
 

Introdução ao Actor Model com Microsoft Orleans

  • 1. Uma Introdução ao Actor Model com Microsoft Orleans 2019 – Trilha .NET
  • 2. Agenda Microsoft Orleans e o Actor Model2 Introdução1 Arquitetura stateful3 Código e Demo4
  • 3. Quem sou eu? Fabio Gouw Arquiteto de Soluções @ Itaú @fabiogouw fabiogouw http://www.fabiogouw.com
  • 5. Introdução | Um pouco de estatística... 0 10 20 30 40 50 60 70 80 90 100 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 1 milhão de logins 29 milhões de mensagens 188 milhões de e-mails 3,8 milhões de buscas % de usuários de internet / população do mundo Em um minuto...
  • 7. Introdução | Exemplos de Aplicações
  • 9. Orleans | Framework e história 2014 Preview público 2017 Versão 2.0 com suporte a .NET Core 2010 Projeto iniciado no Microsoft Research 2015 Open source (MIT) 1973 Actor Model: Artigo de Carl Hewitt, Peter Bishop e Richard Steiger Framework para criação de aplicações distribuídas baseado no Actor Model, voltado para cloud, em cenários stateful e near real-time.
  • 10. Actor Model | Conceitos Modelo conceitual de processamento concorrente que trata atores como sua primitiva de computação. Atores... • representam conceitos da vida real • possuem identidade única • se comunicam através de mensagens
  • 11. Possui uma fila própria para armazenar mensagens a processar (mailbox) Cada ator possui seu próprio estado interno Recebe as mensagens de forma assíncrona Envia mensagens para outros atores Processamento é feito de forma single-threaded, mensagem a mensagem Actor Model | Conceitos
  • 12. Thread 2 Thread 1 Shared State (memória) Tempo Actor Model | Controle de Concorrência Tempo com uso de locks orientado a mensagens
  • 13. Orleans | Ativação Transparente Persistido Ativando Desativando Ativo na memória Virtual Actor → Grains Host de Grains → Silos
  • 14. Arquitetura com o Microsoft Orleans
  • 15. Orleans | Arquitetura Frontend StorageStateful middle tier
  • 16. Orleans | Arquitetura StorageStateful middle tierFrontend Location transparency!
  • 20. Silo Host Grains ContractsWeb Api <<interface>> IDevice DeviceGrain DeviceState Program Startup Device Controller Exemplo | Componentes e Classes Microsoft.Orleans.Core.Abstractions Microsoft.Orleans.OrleansCodeGenerator.Build Microsoft.Orleans.Client Microsoft.Orleans.Clustering.AdoNet Microsoft.Orleans.Server Microsoft.Orleans.OrleansSQLUtils OrleansDashboard Microsoft.Orleans.Core.Abstractions Microsoft.Orleans.OrleansCodeGenerator.Build
  • 21. public interface IDevice : IGrainWithIntegerKey { Task SetTemperature(double temperature); Task<double> GetTemperature(); }Silo Host Grains ContractsWeb Api <<interface>> IDevice DeviceGrain DeviceState Program Startup Device Controller Exemplo | Interface – contrato único
  • 22. [StorageProvider(ProviderName="Devices")] public class DeviceGrain : Grain<DeviceState>, IDevice { public Task<double> GetTemperature() { return Task.FromResult(State.LastTemperature); } public async Task SetTemperature(double temperature) { State.LastTemperature = temperature; await WriteStateAsync(); } } public class DeviceState { public double LastTemperature {get;set;} } Silo Host Grains ContractsWeb Api <<interface>> IDevice DeviceGrain DeviceState Program Startup Device Controller Exemplo | Implementação do ator (grain)
  • 23. public static int Main(string[] args) { ... var builder = new SiloHostBuilder() .Configure<ClusterOptions>(options => { options.ClusterId = "dev"; options.ServiceId = "OrleansDemo"; }) .UseAdoNetClustering(options => { options.Invariant = "System.Data.SqlClient"; options.ConnectionString = ... }) .AddAdoNetGrainStorage("Devices", options=> { options.Invariant = "System.Data.SqlClient"; options.ConnectionString = ... }) .ConfigureEndpoints(siloPort: 11111, gatewayPort: 30000) .UseDashboard(_ => { }) .ConfigureApplicationParts(parts => parts.AddFromApplicationBaseDirectory()) .ConfigureLogging(logging => logging.AddConsole()); var host = builder.Build(); await host.StartAsync(); } Silo Host Grains ContractsWeb Api <<interface>> IDevice DeviceGrain DeviceState Program Startup Device Controller Exemplo | Host dos atores (server)
  • 24. // Startup.cs IClusterClient client = new ClientBuilder() .Configure<ClusterOptions>(options => { options.ClusterId = "dev"; options.ServiceId = "OrleansDemo"; }) .UseAdoNetClustering(options => { options.Invariant = "System.Data.SqlClient"; options.ConnectionString = ... }) .ConfigureLogging(logging => logging.AddConsole()) .Build(); await client.Connect(); ... services.AddSingleton(client); Silo Host Grains ContractsWeb Api <<interface>> IDevice DeviceGrain DeviceState Program Startup Device Controller Exemplo | Configuração do client
  • 25. [Route("api/[controller]")] [ApiController] public class DeviceController : ControllerBase { private readonly IClusterClient _client; public DeviceController(IClusterClient client) { _client = client; } // GET api/device/5 [HttpGet("{deviceId}")] public async Task<double> Get(int deviceId) { var device = _client.GetGrain<IDevice>(deviceId); return await device.GetTemperature(); } // PUT api/device/5 [HttpPut("{deviceId}")] public async Task Put(int deviceId, [FromForm] string value) { var device = _client.GetGrain<IDevice>(deviceId); await device.SetTemperature(double.Parse(value)); } } Silo Host Grains ContractsWeb Api <<interface>> IDevice DeviceGrain DeviceState Program Startup Device Controller Exemplo | Web API de consumo
  • 28. Conclusão | Para saber mais • Exemplo https://github.com/fabiogouw/OrleansDemo • Documentação do Microsoft Orleans https://dotnet.github.io/orleans/ • Vídeo Building the Halo 4 Services with Orleans - Caitie McCaffrey https://www.infoq.com/presentations/halo-4-orleans/ • Livro Reactive Messaging Patterns with the Actor Model: Applications and Integration in Scala and Akka - Vaughn Vernon • Post Design Techniques for Building Stateful, Cloud-Native Applications – Hugh McKee https://www.lightbend.com/blog/design-techniques-stateful- cloud-native-applications-resilience-recoverability-scalability