Uma plataforma para o desenvolvimento de sistemasconcorrentes e distribuídos para a JVM
AkkaUma plataforma para o desenvolvimento de sistemasconcorrentes e distribuídos para a JVM • Daniel Capó Sobral   • Consu...
AkkaUma plataforma para o desenvolvimento de sistemasconcorrentes e distribuídos para a JVMConheça Akka, uma plataforma pa...
Conteúdo  Objetivos Principais  • O que é Akka?  • Para que serve?  • O que são atores?  Não é tema  • Ensinar Akka  • Ens...
O QUE É AKKA?
Uma cadeia de montanhas?
Uma cadeia de montanhas?• “Akka” é uma cadeia de montanhas na Suécia
Um componente do Typesafe Stack?
Um componente do Typesafe Stack?• A Typesafe foi fundada em 2011 pelos criadores da  linguagem de programação Scala e do m...
Uma solução de:  Concorrência  Escalabilidade  Tolerância à Falhas
Uma solução de:  Concorrência  •   Atores  •   STM  •   Agentes  •   Dataflow  Escalabilidade  Tolerância à Falhas
Uma solução de:  Concorrência  Escalabilidade  • Vertical    • Atores  • Horizontal    • Atores Remotos    • Gestão de Clu...
Uma solução de:  Concorrência  Escalabilidade  Tolerância à Falhas  • Supervisão de Atores    • Todos Por Um    • Cada Um ...
Concorrência               Agentes    STM                  Dataflow               Atores
Atores  Erlang  • Popularizou o conceito  • 9 9s de disponibilidade  Scala  • Atores como prova de conceito  Akka  • Novo ...
Objetos vs Atores  Métodos  • Públicos  • Privados  Estado  • Rascunho  • Estático  • Dinâmico
Objetos vs Atores
Objetos vs Atores
Objetos vs Atores
Objetos vs Atores  Métodos  • Públicos  • Privados  Estado  • Rascunho  • Estático  • Dinâmico  Thread  • Orientado a even...
Objetos vs Atores
Fatos sobre Atores  Orientados à eventos  • Assíncronos  • Threads próprios  Comunicação via mensagens  • Caixa de mensage...
Definindo um Ator - Javapublic class SampleUntypedActor extends UntypedActor {  public void onReceive(Object message) thro...
Criando um Ator - Javaimport static akka.actor.Actors.*;ActorRef myActor = actorOf(SampleUntypedActor.class);myActor.start...
ActorRef vs Actor  Portabilidade  • Serializável  • Remote-aware  Opacidade  • Actor é membro privado de ActorRef  this vs...
Ciclo de Vida           • Não processa mensagens  New           • Iniciado com “start” Started   • Processa mensagens     ...
Enviando uma mensagem  Envie e esqueça  • actor.sendOneWay("Hello");  Envie, com remetente  • actor.sendOneWay("Hello", ge...
Futurosinterface Future<T> {  void await();  boolean isCompleted();  boolean isExpired();  long timeoutInNanos();  Option<...
Usando Futuros - JavaFuture future = actorRef.sendRequestReplyFuture("Hello",getContext(), 1000);future.await();if (future...
Respondendo ao Remetente - Javapublic void onReceive(Object message) throws Exception {  if (message instanceof String) { ...
Respondendo Mensagem - Javapublic void onReceive(Object message) throws Exception {  if (message instanceof String) {    S...
Parando um Ator - Javaactor.stop();
Akka em Scala  Concisão  • router.tell(new Work(arg, nrOfElements),    getContext());  • router ! Work(arg, nrOfElements) ...
Akka em Scala  Melhor suporte a imutabilidade  • case class Work(arg: Int,    nrOfElements: Int)  • Coleções imutáveis por...
Typed Actors  POJO -> TypedActors  • Requer Interface + Implementation  AOP  • AspectWerkz Proxy  Objetos -> Atores  • Mét...
Agentes  Inspirado nos Agentes de Clojure  Modificações Assíncronas  • Uma modificação de cada vez  • Modificações de cada...
Agentes - Scala  Criando e Parando  • val agent = Agent(5)  • agent.close()  Alterando  • agent send 7  • agent send (_ + ...
STM Mutabilidade Controlada • Estado compartilhado • Transações multi-atores (transactors) Modelo Clojure de Referências M...
STM - Java final Ref<Integer> ref = new Ref<Integer>(0); public int counter() {   return new Atomic<Integer>() {     publi...
Dataflow  Concorrência Determinística  • Mesmo resultado todas as vezes  • Baseado em futuros  • Scala Delimited Continuat...
Dataflow - Scala  Declarar variável dataflow  • val x = Promise[Int]()  Usar valor  • flow { ... x() ... }  Assinalar valo...
Escalabilidade  Vertical  • Atores  • Dataflow  Horizontal  • Atores Remotos  • Gestão de Cluster
Atores Remotos - Java// server codeclass HelloWorldActor extends UntypedActor {  public void onReceive(Object msg) {    ge...
Atores Remotos  Um por tipo  Um por sessão  Um por requisição
Tolerância à Falhas  Deixe falhar...  • Não se proteja de exceções  • Deixe outro lidar com o problema  Supervisores  • Er...
Tolerância à Falhas  Estado  • Recuperável  • Não-recuperável  Ganchos de reinicialização  • Antes da reinicialização  • D...
Só isso?  Encaminhando mensagens  para outro Ator  • getContext().forward(message,    getContext());  Alterando o comporta...
Só isso?  Dispatcher  •   Por eventos  •   Por thread  •   Eventos priorizados  •   Eventos com work-stealing  Routing  • ...
Só isso?Crédito:Palestra Above theClouds: Introducing AkkaJonas Bonér
Mais informações...  http://akka.io  http://typesafe.com
Contato  Daniel Capó Sobral  • dcsobral@gmail.com  • http://dcsobral.blogspot.com/  • http://github.com/dcsobral  • @dcsob...
Upcoming SlideShare
Loading in...5
×

Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM

1,437

Published on

Apresentação sobre programação de sistemas concorrentes usando Akka, em Java e Scala, apresentada na QConSP 2011.

Ementa:


Conheça Akka, uma plataforma para o JVM para desenvolvimento de sistemas concorrentes e/ou distribuídos através do paradigma de Atores.

Descreveremos o paradigma de atores, suas vantagens e desvantagens, e mostraremos exemplos da API em Java e em Scala, com execução local e distribuída, memória transacional e tolerância a falhas.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,437
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM

  1. 1. Uma plataforma para o desenvolvimento de sistemasconcorrentes e distribuídos para a JVM
  2. 2. AkkaUma plataforma para o desenvolvimento de sistemasconcorrentes e distribuídos para a JVM • Daniel Capó Sobral • Consultor pela Tecnisys • Programador e Sysadmin • Ex-committer FreeBSD • Aficionado por Scala
  3. 3. AkkaUma plataforma para o desenvolvimento de sistemasconcorrentes e distribuídos para a JVMConheça Akka, uma plataforma para o JVM paradesenvolvimento de sistemas concorrentes e/oudistribuídos através do paradigma de Atores.Descreveremos o paradigma de atores, suasvantagens e desvantagens, e mostraremosexemplos da API em Java e em Scala, comexecução local e distribuída, memória transacionale tolerância a falhas.
  4. 4. Conteúdo Objetivos Principais • O que é Akka? • Para que serve? • O que são atores? Não é tema • Ensinar Akka • Ensinar programação com atores • Mostrar todos os módulos de Akka
  5. 5. O QUE É AKKA?
  6. 6. Uma cadeia de montanhas?
  7. 7. Uma cadeia de montanhas?• “Akka” é uma cadeia de montanhas na Suécia
  8. 8. Um componente do Typesafe Stack?
  9. 9. Um componente do Typesafe Stack?• A Typesafe foi fundada em 2011 pelos criadores da linguagem de programação Scala e do middleware Akka.• O Typesafe Stack contém Scala, Akka e ferramentas de desenvolvimento, tudo open source.• A Typesafe Subscription provê suporte comercial.
  10. 10. Uma solução de: Concorrência Escalabilidade Tolerância à Falhas
  11. 11. Uma solução de: Concorrência • Atores • STM • Agentes • Dataflow Escalabilidade Tolerância à Falhas
  12. 12. Uma solução de: Concorrência Escalabilidade • Vertical • Atores • Horizontal • Atores Remotos • Gestão de Cluster Tolerância à Falhas
  13. 13. Uma solução de: Concorrência Escalabilidade Tolerância à Falhas • Supervisão de Atores • Todos Por Um • Cada Um Por Si • “Deixe falhar”
  14. 14. Concorrência Agentes STM Dataflow Atores
  15. 15. Atores Erlang • Popularizou o conceito • 9 9s de disponibilidade Scala • Atores como prova de conceito Akka • Novo design • Solução completa
  16. 16. Objetos vs Atores Métodos • Públicos • Privados Estado • Rascunho • Estático • Dinâmico
  17. 17. Objetos vs Atores
  18. 18. Objetos vs Atores
  19. 19. Objetos vs Atores
  20. 20. Objetos vs Atores Métodos • Públicos • Privados Estado • Rascunho • Estático • Dinâmico Thread • Orientado a eventos
  21. 21. Objetos vs Atores
  22. 22. Fatos sobre Atores Orientados à eventos • Assíncronos • Threads próprios Comunicação via mensagens • Caixa de mensagens • Não compartilham estado! Baratos • Atores não são threads • Aproximadamente 600 bytes
  23. 23. Definindo um Ator - Javapublic class SampleUntypedActor extends UntypedActor { public void onReceive(Object message) throws Exception { if (message instanceof String) EventHandler.info(this, String.format("Received Stringmessage: %s", message)); else throw new IllegalArgumentException("Unknownmessage: " + message); }}
  24. 24. Criando um Ator - Javaimport static akka.actor.Actors.*;ActorRef myActor = actorOf(SampleUntypedActor.class);myActor.start();// Construtor com parâmetrosActorRef actor = actorOf(new UntypedActorFactory() { public UntypedActor create() { return new MyUntypedActor("service:name", 5); }}).start();
  25. 25. ActorRef vs Actor Portabilidade • Serializável • Remote-aware Opacidade • Actor é membro privado de ActorRef this vs self • Actor this • ActorRef self
  26. 26. Ciclo de Vida • Não processa mensagens New • Iniciado com “start” Started • Processa mensagens • Iniciado com “exit” ou “stop”Shutdown • Não pode fazer nada
  27. 27. Enviando uma mensagem Envie e esqueça • actor.sendOneWay("Hello"); Envie, com remetente • actor.sendOneWay("Hello", getContext()); Envie, talvez receba resposta (ou exceção) • Object result = actorRef.sendRequestReply("Hello", getContext(), 1000); Envie, receba futuro • Future future = actorRef.sendRequestReplyFuture("Hello", getContext(), 1000);
  28. 28. Futurosinterface Future<T> { void await(); boolean isCompleted(); boolean isExpired(); long timeoutInNanos(); Option<T> result(); Option<Throwable> exception(); Future<T> onComplete(Procedure<Future<T>> procedure);}
  29. 29. Usando Futuros - JavaFuture future = actorRef.sendRequestReplyFuture("Hello",getContext(), 1000);future.await();if (future.isCompleted()) { Option resultOption = future.result(); if (resultOption.isDefined()) { Object result = resultOption.get(); ... } ... // whatever}
  30. 30. Respondendo ao Remetente - Javapublic void onReceive(Object message) throws Exception { if (message instanceof String) { String msg = (String)message; if (msg.equals("Hello") &&getContext().getSenderFuture().isDefined()) { // Reply to original sender of message using the channel getContext().channel().sendOneWay(msg + " from " +getContext().getUuid()); } }}
  31. 31. Respondendo Mensagem - Javapublic void onReceive(Object message) throws Exception { if (message instanceof String) { String msg = (String)message; if (msg.equals("Hello")) { if (getContext().replySafe(msg + " from " +getContext().getUuid())) ... // success else ... // handle failure } }}
  32. 32. Parando um Ator - Javaactor.stop();
  33. 33. Akka em Scala Concisão • router.tell(new Work(arg, nrOfElements), getContext()); • router ! Work(arg, nrOfElements) Parâmetros “by-name” • val a = actorOf(new MyActor(..)).start() Parâmetros implícitos • Ver exemplo de concisão acima!
  34. 34. Akka em Scala Melhor suporte a imutabilidade • case class Work(arg: Int, nrOfElements: Int) • Coleções imutáveis por default • Estruturas de dados persistentes Pattern matching • case Work(arg, n) => // do stuff
  35. 35. Typed Actors POJO -> TypedActors • Requer Interface + Implementation AOP • AspectWerkz Proxy Objetos -> Atores • Métodos viram mensagens assíncronas!
  36. 36. Agentes Inspirado nos Agentes de Clojure Modificações Assíncronas • Uma modificação de cada vez • Modificações de cada origem processadas em ordem Integrado ao STM • Toma parte em transações Futuros • Valor “atual” após todas modificações enfileiradas
  37. 37. Agentes - Scala Criando e Parando • val agent = Agent(5) • agent.close() Alterando • agent send 7 • agent send (_ + 1) Lendo • val result = agent() • val result = agent.future.await.result.get
  38. 38. STM Mutabilidade Controlada • Estado compartilhado • Transações multi-atores (transactors) Modelo Clojure de Referências Multiverse STM
  39. 39. STM - Java final Ref<Integer> ref = new Ref<Integer>(0); public int counter() { return new Atomic<Integer>() { public Integer atomically() { int inc = ref.get() + 1; ref.set(inc); return inc; } }.execute(); }
  40. 40. Dataflow Concorrência Determinística • Mesmo resultado todas as vezes • Baseado em futuros • Scala Delimited Continuations Derivado da linguagem Oz Nada de efeitos colaterais! • Exceções, data/hora, números aleatórios, etc
  41. 41. Dataflow - Scala Declarar variável dataflow • val x = Promise[Int]() Usar valor • flow { ... x() ... } Assinalar valor • flow { ... x << 5 ... } Assinalar a uma outra variável • flow { ... x << y ... }
  42. 42. Escalabilidade Vertical • Atores • Dataflow Horizontal • Atores Remotos • Gestão de Cluster
  43. 43. Atores Remotos - Java// server codeclass HelloWorldActor extends UntypedActor { public void onReceive(Object msg) { getContext().replySafe(msg + " World"); }}remote().start("localhost", 9999).register( "hello-service", actorOf(HelloWorldActor.class));// client codeActorRef actor = remote().actorFor( "hello-service", "localhost", 9999);Object res = actor.sendRequestReply("Hello");
  44. 44. Atores Remotos Um por tipo Um por sessão Um por requisição
  45. 45. Tolerância à Falhas Deixe falhar... • Não se proteja de exceções • Deixe outro lidar com o problema Supervisores • Erlang OTP • Proteção em Profundidade Estratégias de Supervisão • OneForOne • AllForOne
  46. 46. Tolerância à Falhas Estado • Recuperável • Não-recuperável Ganchos de reinicialização • Antes da reinicialização • Depois da reinicialização Ciclo de vida • Permanente • Temporário
  47. 47. Só isso? Encaminhando mensagens para outro Ator • getContext().forward(message, getContext()); Alterando o comportamento de um ator • become(scatter); • actor ! HotSwap( self => { case message => self.reply("hotswapped body") })
  48. 48. Só isso? Dispatcher • Por eventos • Por thread • Eventos priorizados • Eventos com work-stealing Routing • Dispatcher (roteador, não módulo) • Load balance • Actor pool Futuros • Usados por atores, agentes, dataflow e outros componentes
  49. 49. Só isso?Crédito:Palestra Above theClouds: Introducing AkkaJonas Bonér
  50. 50. Mais informações... http://akka.io http://typesafe.com
  51. 51. Contato Daniel Capó Sobral • dcsobral@gmail.com • http://dcsobral.blogspot.com/ • http://github.com/dcsobral • @dcsobral
  1. Gostou de algum slide específico?

    Recortar slides é uma maneira fácil de colecionar informações para acessar mais tarde.

×