SlideShare uma empresa Scribd logo
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

PDF
Ecosistema spring a_plataforma_enterprise_jav
PDF
Kotlin first
PPTX
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
PDF
Desenvolvimento Moderno de aplicativos Android
PPT
Android Palestra
PPTX
Windows 8: Desenvolvimento de Metro Style Apps
PPTX
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
PPT
Mock Objects
Ecosistema spring a_plataforma_enterprise_jav
Kotlin first
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Moderno de aplicativos Android
Android Palestra
Windows 8: Desenvolvimento de Metro Style Apps
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Mock Objects

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

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

Último (12)

PDF
Manejo integrado de pragas na cultura do algodão
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPT
Conceitos básicos de Redes Neurais Artificiais
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PPTX
Utilizando code blockes por andre backes
PPTX
Analise Estatica de Compiladores para criar uma nova LP
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PDF
Jira Software projetos completos com scrum
PPTX
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
PPTX
Tipos de servidor em redes de computador.pptx
PDF
Processos no SAP Extended Warehouse Management, EWM100 Col26
Manejo integrado de pragas na cultura do algodão
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Conceitos básicos de Redes Neurais Artificiais
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Utilizando code blockes por andre backes
Analise Estatica de Compiladores para criar uma nova LP
Viasol Energia Solar -Soluções para geração e economia de energia
Jira Software projetos completos com scrum
Aula 9 - Funções em Python (Introdução à Ciência da Computação)
Tipos de servidor em redes de computador.pptx
Processos no SAP Extended Warehouse Management, EWM100 Col26
Anúncio

TDC - 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