SlideShare uma empresa Scribd logo
1 de 51
Uma plataforma para o desenvolvimento de sistemas
concorrentes e distribuídos para a JVM
Akka
Uma plataforma para o desenvolvimento de sistemas
concorrentes e distribuídos para a JVM
 • Daniel Capó Sobral
   • Consultor pela Tecnisys
   • Programador e Sysadmin
   • Ex-committer FreeBSD
   • Aficionado por Scala
Akka
Uma plataforma para o desenvolvimento de sistemas
concorrentes e distribuídos para a JVM

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.
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
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 middleware Akka.
• O Typesafe Stack contém Scala, Akka e ferramentas de
  desenvolvimento, tudo open source.
• A Typesafe Subscription provê suporte comercial.
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 Cluster

  Tolerância à Falhas
Uma solução de:
  Concorrência


  Escalabilidade


  Tolerância à Falhas

  • Supervisão de Atores
    • Todos Por Um
    • Cada Um Por Si
  • “Deixe falhar”
Concorrência

               Agentes

    STM                  Dataflow


               Atores
Atores
  Erlang

  • Popularizou o conceito
  • 9 9s de disponibilidade

  Scala

  • Atores como prova de conceito

  Akka

  • Novo design
  • Solução completa
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 eventos
Objetos vs Atores
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
Definindo um Ator - Java
public class SampleUntypedActor extends UntypedActor {
  public void onReceive(Object message) throws Exception {
    if (message instanceof String)
      EventHandler.info(this, String.format("Received String
message: %s", message));
    else
      throw new IllegalArgumentException("Unknown
message: " + message);
  }
}
Criando um Ator - Java

import static akka.actor.Actors.*;
ActorRef myActor = actorOf(SampleUntypedActor.class);
myActor.start();

// Construtor com parâmetros
ActorRef actor = actorOf(new UntypedActorFactory() {
  public UntypedActor create() {
    return new MyUntypedActor("service:name", 5);
  }
}).start();
ActorRef vs Actor
  Portabilidade

  • Serializável
  • Remote-aware

  Opacidade

  • Actor é membro privado de ActorRef

  this vs self

  • Actor this
  • ActorRef self
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
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);
Futuros
interface Future<T> {
  void await();
  boolean isCompleted();
  boolean isExpired();
  long timeoutInNanos();
  Option<T> result();
  Option<Throwable> exception();
  Future<T> onComplete(Procedure<Future<T>> procedure);
}
Usando Futuros - Java
Future future = actorRef.sendRequestReplyFuture("Hello",
getContext(), 1000);
future.await();
if (future.isCompleted()) {
  Option resultOption = future.result();
  if (resultOption.isDefined()) {
    Object result = resultOption.get();
    ...
  }
  ... // whatever
}
Respondendo ao Remetente - Java
public 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());
    }
  }
}
Respondendo Mensagem - Java
public 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
    }
  }
}
Parando um Ator - Java

actor.stop();
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!
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
Typed Actors
  POJO -> TypedActors

  • Requer Interface + Implementation

  AOP

  • AspectWerkz Proxy

  Objetos -> Atores

  • Métodos viram mensagens assíncronas!
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
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
STM
 Mutabilidade Controlada

 • Estado compartilhado
 • Transações multi-atores (transactors)

 Modelo Clojure de Referências


 Multiverse STM
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();
 }
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
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 ... }
Escalabilidade

  Vertical

  • Atores
  • Dataflow

  Horizontal

  • Atores Remotos
  • Gestão de Cluster
Atores Remotos - Java
// server code
class HelloWorldActor extends UntypedActor {
  public void onReceive(Object msg) {
    getContext().replySafe(msg + " World");
  }
}
remote().start("localhost", 9999).register( "hello-
service", actorOf(HelloWorldActor.class));

// client code
ActorRef actor = remote().actorFor( "hello-
service", "localhost", 9999);
Object res = actor.sendRequestReply("Hello");
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

  • Erlang OTP
  • Proteção em Profundidade

  Estratégias de Supervisão

  • OneForOne
  • AllForOne
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
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") })
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
Só isso?




Crédito:
Palestra Above the
Clouds: Introducing Akka

Jonas 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
  • @dcsobral

Mais conteúdo relacionado

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

Path to the future #2 - Internet das coisas com AWS IoT
Path to the future #2 - Internet das coisas com AWS IoTPath to the future #2 - Internet das coisas com AWS IoT
Path to the future #2 - Internet das coisas com AWS IoTAmazon Web Services LATAM
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoNando Vieira
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicasHelder da Rocha
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaFelipe Hummel
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
Buscas Poderosas Com Solr
Buscas Poderosas Com SolrBuscas Poderosas Com Solr
Buscas Poderosas Com Solralmeidaricardo
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordtchandy
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptJean Carlo Emer
 
Modelo de atores com Microsoft Orleans
Modelo de atores com Microsoft OrleansModelo de atores com Microsoft Orleans
Modelo de atores com Microsoft OrleansAndré Minelli
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Introdução ao JS1.pptx
Introdução ao JS1.pptxIntrodução ao JS1.pptx
Introdução ao JS1.pptxLuanDev1
 
Testes Automatizados e o iOS
Testes Automatizados e o iOSTestes Automatizados e o iOS
Testes Automatizados e o iOSRicardo Valeriano
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesCI&T
 

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

Linguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação JavaLinguagem Java- Iniciação à programação Java
Linguagem Java- Iniciação à programação Java
 
Path to the future #2 - Internet das coisas com AWS IoT
Path to the future #2 - Internet das coisas com AWS IoTPath to the future #2 - Internet das coisas com AWS IoT
Path to the future #2 - Internet das coisas com AWS IoT
 
A explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo pretoA explosão do Node.js: JavaScript é o novo preto
A explosão do Node.js: JavaScript é o novo preto
 
As novidades da nova versão do Java 9
As novidades da nova versão do Java 9As novidades da nova versão do Java 9
As novidades da nova versão do Java 9
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Threads 04 Variáveis atômicas
Threads 04 Variáveis atômicasThreads 04 Variáveis atômicas
Threads 04 Variáveis atômicas
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
JADE+JENA
JADE+JENAJADE+JENA
JADE+JENA
 
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeçaTrês anos de Scala em Produção: desafios, aprendizados e dores de cabeça
Três anos de Scala em Produção: desafios, aprendizados e dores de cabeça
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
Buscas Poderosas Com Solr
Buscas Poderosas Com SolrBuscas Poderosas Com Solr
Buscas Poderosas Com Solr
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecord
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScript
 
Modelo de atores com Microsoft Orleans
Modelo de atores com Microsoft OrleansModelo de atores com Microsoft Orleans
Modelo de atores com Microsoft Orleans
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Introdução ao JS1.pptx
Introdução ao JS1.pptxIntrodução ao JS1.pptx
Introdução ao JS1.pptx
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Testes Automatizados e o iOS
Testes Automatizados e o iOSTestes Automatizados e o iOS
Testes Automatizados e o iOS
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
 
Introdução ao Java 5
Introdução ao Java 5Introdução ao Java 5
Introdução ao Java 5
 

Mais de Daniel Sobral

What can scala puzzlers teach us
What can scala puzzlers teach usWhat can scala puzzlers teach us
What can scala puzzlers teach usDaniel Sobral
 
Injecting Clock in Java
Injecting Clock in JavaInjecting Clock in Java
Injecting Clock in JavaDaniel Sobral
 
A JSR-310 Date: Beyond JODA Time
A JSR-310 Date: Beyond JODA TimeA JSR-310 Date: Beyond JODA Time
A JSR-310 Date: Beyond JODA TimeDaniel Sobral
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppetDaniel Sobral
 
Scala 2.10.0 (english version)
Scala 2.10.0 (english version)Scala 2.10.0 (english version)
Scala 2.10.0 (english version)Daniel Sobral
 
Palestra ganeti puppet
Palestra ganeti puppetPalestra ganeti puppet
Palestra ganeti puppetDaniel Sobral
 

Mais de Daniel Sobral (10)

What can scala puzzlers teach us
What can scala puzzlers teach usWhat can scala puzzlers teach us
What can scala puzzlers teach us
 
Injecting Clock in Java
Injecting Clock in JavaInjecting Clock in Java
Injecting Clock in Java
 
A JSR-310 Date: Beyond JODA Time
A JSR-310 Date: Beyond JODA TimeA JSR-310 Date: Beyond JODA Time
A JSR-310 Date: Beyond JODA Time
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppet
 
Scala 2.10.0 (english version)
Scala 2.10.0 (english version)Scala 2.10.0 (english version)
Scala 2.10.0 (english version)
 
Scala 2.10.0
Scala 2.10.0Scala 2.10.0
Scala 2.10.0
 
Palestra ganeti puppet
Palestra ganeti puppetPalestra ganeti puppet
Palestra ganeti puppet
 
Tutorial Puppet
Tutorial PuppetTutorial Puppet
Tutorial Puppet
 
Regex
RegexRegex
Regex
 
Introdução a TDD
Introdução a TDDIntrodução a TDD
Introdução a TDD
 

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

  • 1. Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM
  • 2. Akka Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM • Daniel Capó Sobral • Consultor pela Tecnisys • Programador e Sysadmin • Ex-committer FreeBSD • Aficionado por Scala
  • 3. Akka Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM 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.
  • 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. O QUE É AKKA?
  • 6. Uma cadeia de montanhas?
  • 7. Uma cadeia de montanhas? • “Akka” é uma cadeia de montanhas na Suécia
  • 8. Um componente do Typesafe Stack?
  • 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. Uma solução de: Concorrência Escalabilidade Tolerância à Falhas
  • 11. Uma solução de: Concorrência • Atores • STM • Agentes • Dataflow Escalabilidade Tolerância à Falhas
  • 12. Uma solução de: Concorrência Escalabilidade • Vertical • Atores • Horizontal • Atores Remotos • Gestão de Cluster Tolerância à Falhas
  • 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. Concorrência Agentes STM Dataflow Atores
  • 15. Atores Erlang • Popularizou o conceito • 9 9s de disponibilidade Scala • Atores como prova de conceito Akka • Novo design • Solução completa
  • 16. Objetos vs Atores Métodos • Públicos • Privados Estado • Rascunho • Estático • Dinâmico
  • 20. Objetos vs Atores Métodos • Públicos • Privados Estado • Rascunho • Estático • Dinâmico Thread • Orientado a eventos
  • 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. Definindo um Ator - Java public class SampleUntypedActor extends UntypedActor { public void onReceive(Object message) throws Exception { if (message instanceof String) EventHandler.info(this, String.format("Received String message: %s", message)); else throw new IllegalArgumentException("Unknown message: " + message); } }
  • 24. Criando um Ator - Java import static akka.actor.Actors.*; ActorRef myActor = actorOf(SampleUntypedActor.class); myActor.start(); // Construtor com parâmetros ActorRef actor = actorOf(new UntypedActorFactory() { public UntypedActor create() { return new MyUntypedActor("service:name", 5); } }).start();
  • 25. ActorRef vs Actor Portabilidade • Serializável • Remote-aware Opacidade • Actor é membro privado de ActorRef this vs self • Actor this • ActorRef self
  • 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. 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. Futuros interface Future<T> { void await(); boolean isCompleted(); boolean isExpired(); long timeoutInNanos(); Option<T> result(); Option<Throwable> exception(); Future<T> onComplete(Procedure<Future<T>> procedure); }
  • 29. Usando Futuros - Java Future future = actorRef.sendRequestReplyFuture("Hello", getContext(), 1000); future.await(); if (future.isCompleted()) { Option resultOption = future.result(); if (resultOption.isDefined()) { Object result = resultOption.get(); ... } ... // whatever }
  • 30. Respondendo ao Remetente - Java public 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. Respondendo Mensagem - Java public 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. Parando um Ator - Java actor.stop();
  • 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. 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. Typed Actors POJO -> TypedActors • Requer Interface + Implementation AOP • AspectWerkz Proxy Objetos -> Atores • Métodos viram mensagens assíncronas!
  • 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. 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. STM Mutabilidade Controlada • Estado compartilhado • Transações multi-atores (transactors) Modelo Clojure de Referências Multiverse STM
  • 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. 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. 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. Escalabilidade Vertical • Atores • Dataflow Horizontal • Atores Remotos • Gestão de Cluster
  • 43. Atores Remotos - Java // server code class HelloWorldActor extends UntypedActor { public void onReceive(Object msg) { getContext().replySafe(msg + " World"); } } remote().start("localhost", 9999).register( "hello- service", actorOf(HelloWorldActor.class)); // client code ActorRef actor = remote().actorFor( "hello- service", "localhost", 9999); Object res = actor.sendRequestReply("Hello");
  • 44. Atores Remotos Um por tipo Um por sessão Um por requisição
  • 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. 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. 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. 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. Só isso? Crédito: Palestra Above the Clouds: Introducing Akka Jonas Bonér
  • 50. Mais informações... http://akka.io http://typesafe.com
  • 51. Contato Daniel Capó Sobral • dcsobral@gmail.com • http://dcsobral.blogspot.com/ • http://github.com/dcsobral • @dcsobral