akka - uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a jvm
DESCRIPTION
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.TRANSCRIPT
![Page 1: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/1.jpg)
Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM
![Page 2: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/2.jpg)
AkkaUma 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
![Page 3: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/3.jpg)
AkkaUma 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.
![Page 4: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/4.jpg)
Conteúdo
• O que é Akka?• Para que serve?• O que são atores?
Objetivos Principais
• Ensinar Akka• Ensinar programação com atores• Mostrar todos os módulos de Akka
Não é tema
![Page 5: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/5.jpg)
O QUE É AKKA?
![Page 6: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/6.jpg)
Uma cadeia de montanhas?
![Page 7: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/7.jpg)
Uma cadeia de montanhas?• “Akka” é uma cadeia de montanhas na Suécia
![Page 8: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/8.jpg)
Um componente do Typesafe Stack?
![Page 9: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/9.jpg)
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.
![Page 10: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/10.jpg)
Uma solução de:
Concorrência
Escalabilidade
Tolerância à Falhas
![Page 11: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/11.jpg)
Uma solução de:
• Atores• STM• Agentes• Dataflow
Concorrência
Escalabilidade
Tolerância à Falhas
![Page 12: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/12.jpg)
Uma solução de:
Concorrência
• Vertical• Atores
• Horizontal• Atores Remotos• Gestão de Cluster
Escalabilidade
Tolerância à Falhas
![Page 13: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/13.jpg)
Uma solução de:
Concorrência
Escalabilidade
• Supervisão de Atores• Todos Por Um• Cada Um Por Si
• “Deixe falhar”
Tolerância à Falhas
![Page 14: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/14.jpg)
Concorrência
Atores
STM
Agentes
Dataflow
![Page 15: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/15.jpg)
Atores
• Popularizou o conceito• 9 9s de disponibilidade
Erlang
• Atores como prova de conceito
Scala
• Novo design• Solução completa
Akka
![Page 16: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/16.jpg)
Objetos vs Atores
• Públicos• Privados
Métodos
• Rascunho• Estático• Dinâmico
Estado
![Page 17: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/17.jpg)
Objetos vs Atores
![Page 18: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/18.jpg)
Objetos vs Atores
![Page 19: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/19.jpg)
Objetos vs Atores
![Page 20: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/20.jpg)
Objetos vs Atores
• Públicos• Privados
Métodos
• Rascunho• Estático• Dinâmico
Estado
• Orientado a eventos
Thread
![Page 21: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/21.jpg)
Objetos vs Atores
![Page 22: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/22.jpg)
Fatos sobre Atores
• Assíncronos• Threads próprios
Orientados à eventos
• Caixa de mensagens• Não compartilham estado!
Comunicação via mensagens
• Atores não são threads• Aproximadamente 600 bytes
Baratos
![Page 23: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/23.jpg)
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); }}
![Page 24: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/24.jpg)
Criando um Ator - Java
import 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();
![Page 25: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/25.jpg)
ActorRef vs Actor
• Serializável• Remote-aware
Portabilidade
• Actor é membro privado de ActorRef
Opacidade
• Actor this• ActorRef self
this vs self
![Page 26: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/26.jpg)
Ciclo de Vida
New
• Não processa mensagens
Started
• Iniciado com “start”• Processa mensagens
Shutdown
• Iniciado com “exit” ou “stop”• Não pode fazer nada
![Page 27: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/27.jpg)
Enviando uma mensagem
• actor.sendOneWay("Hello");
Envie e esqueça
• actor.sendOneWay("Hello", getContext());
Envie, com remetente
• Object result = actorRef.sendRequestReply("Hello", getContext(), 1000);
Envie, talvez receba resposta (ou exceção)
• Future future = actorRef.sendRequestReplyFuture("Hello", getContext(), 1000);
Envie, receba futuro
![Page 28: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/28.jpg)
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);}
![Page 29: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/29.jpg)
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}
![Page 30: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/30.jpg)
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()); } }}
![Page 31: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/31.jpg)
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 } }}
![Page 32: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/32.jpg)
Parando um Ator - Java
actor.stop();
![Page 33: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/33.jpg)
Akka em Scala
• router.tell(new Work(arg, nrOfElements), getContext());
• router ! Work(arg, nrOfElements)
Concisão
• val a = actorOf(new MyActor(..)).start()
Parâmetros “by-name”
• Ver exemplo de concisão acima!
Parâmetros implícitos
![Page 34: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/34.jpg)
Akka em Scala
• case class Work(arg: Int, nrOfElements: Int)
• Coleções imutáveis por default• Estruturas de dados persistentes
Melhor suporte a imutabilidade
• case Work(arg, n) => // do stuff
Pattern matching
![Page 35: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/35.jpg)
Typed Actors
• Requer Interface + Implementation
POJO -> TypedActors
• AspectWerkz Proxy
AOP
• Métodos viram mensagens assíncronas!
Objetos -> Atores
![Page 36: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/36.jpg)
Agentes
Inspirado nos Agentes de Clojure
• Uma modificação de cada vez• Modificações de cada origem processadas em ordem
Modificações Assíncronas
• Toma parte em transações
Integrado ao STM
• Valor “atual” após todas modificações enfileiradas
Futuros
![Page 37: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/37.jpg)
Agentes - Scala
• val agent = Agent(5)• agent.close()
Criando e Parando
• agent send 7• agent send (_ + 1)
Alterando
• val result = agent()• val result = agent.future.await.result.get
Lendo
![Page 38: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/38.jpg)
STM
• Estado compartilhado• Transações multi-atores (transactors)
Mutabilidade Controlada
Modelo Clojure de Referências
Multiverse STM
![Page 39: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/39.jpg)
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();}
![Page 40: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/40.jpg)
Dataflow
• Mesmo resultado todas as vezes• Baseado em futuros• Scala Delimited Continuations
Concorrência Determinística
Derivado da linguagem Oz
• Exceções, data/hora, números aleatórios, etc
Nada de efeitos colaterais!
![Page 41: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/41.jpg)
Dataflow - Scala
• val x = Promise[Int]()
Declarar variável dataflow
• flow { ... x() ... }
Usar valor
• flow { ... x << 5 ... }
Assinalar valor
• flow { ... x << y ... }
Assinalar a uma outra variável
![Page 42: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/42.jpg)
Escalabilidade
• Atores• Dataflow
Vertical
• Atores Remotos• Gestão de Cluster
Horizontal
![Page 43: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/43.jpg)
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");
![Page 44: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/44.jpg)
Atores Remotos
Um por tipo
Um por sessão
Um por requisição
![Page 45: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/45.jpg)
Tolerância à Falhas
• Não se proteja de exceções• Deixe outro lidar com o problema
Deixe falhar...
• Erlang OTP• Proteção em Profundidade
Supervisores
• OneForOne• AllForOne
Estratégias de Supervisão
![Page 46: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/46.jpg)
Tolerância à Falhas
• Recuperável• Não-recuperável
Estado
• Antes da reinicialização• Depois da reinicialização
Ganchos de reinicialização
• Permanente• Temporário
Ciclo de vida
![Page 47: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/47.jpg)
Só isso?
• getContext().forward(message, getContext());
Encaminhando mensagens para outro Ator
• become(scatter);• actor ! HotSwap( self => { case
message => self.reply("hotswapped body") })
Alterando o comportamento de um ator
![Page 48: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/48.jpg)
Só isso?
• Por eventos• Por thread• Eventos priorizados• Eventos com work-stealing
Dispatcher
• Dispatcher (roteador, não módulo)• Load balance• Actor pool
Routing
• Usados por atores, agentes, dataflow e outros componentes
Futuros
![Page 49: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/49.jpg)
Só isso?
Crédito:Palestra Above the Clouds: Introducing Akka
Jonas Bonér
![Page 51: Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distribuídos para a JVM](https://reader034.vdocuments.site/reader034/viewer/2022050808/54b550c44a7959c22c8b45d2/html5/thumbnails/51.jpg)
Contato
• [email protected]• http://dcsobral.blogspot.com/• http://github.com/dcsobral• @dcsobral
Daniel Capó Sobral