Akka 2.0Chega de multi-threading na unha            @jcranky
Paulo "JCranky" Siqueira● desenvolvedor java e scala● consultor independente● instrutor globalcode● um dos fundadores dos ...
Concorrência de forma correta?
Tolerância a falhas?
Abstração!● em OO aprendemos a abstrair conceitos● programação concorrente não pode ser  abstraída?● porque nos preocupar ...
Akka 2.0● inspirado em Erlang● abstrai preocupações baixo nível● pensamos mais nos problemas de negócio● API Java e Scala●...
Actor Model● entidades independentes● estado● comportamento● mailbox● como uma classe em OO...● ... mas mais "pura"
Actor Modelmensagens      mailbox              Comportamento              Estado
Actor Model● comunicação com troca de mensagens● "event-driven"● sempre assíncrono
Abstração == Overhead?● overhead do Akka é ínfimo● extraído da página oficial:● "50 million msg/sec on a single machine."●...
Escalabilidade...● horizontal e vertical● nosso foco é a vertical● a horizontal seria fácil com atores remotos
Threads... cadê?● Akka cria as threads necessárias● ator != thread● atores usando threads disponíveis● akka fornece uma th...
Divisão de trabalho● threads usando os "cores" disponíveis● fork-join por padrão● fork-join estará no Java 8...● ... mas j...
config. extraída da documentação:fork-join-executor {    # Min number of threads to cap factor-based parallelism number to...
Imutabilidade● origem de muitos problemas● para não precisar de locks● nunca teremos deadlocks● desnecessário sincronizar ...
Uma mensagem - Scalacase class SendToS3(fileName: String)
Uma mensagem - Javapublic class SendToS3 {  private final String fileName;    public SendToS3(String fileName) {      this...
Um ator - Scalaclass S3SenderActor extends Actor {  def receive = {    case SendToS3(fileName) =>     // lógica de negócio...
Um ator - Javapublic class S3SenderActor extends UntypedActor {  public void onReceive(Object message)         throws Exce...
Lidando com alteração de estado● atores não devem compartilhar estado● um único ator será responsável pelos dados● acesso ...
Criando atores● métodos / classes especiais● atores criados abaixo da raiz do nó principal● ... ou relativos ao contexto a...
Criando um ator - Scalaval system = ActorSystem("MyActorSystem")// ator com construtor defaultval ator =  system.actorOf(P...
Criando um ator - JavaActorSystem system =  ActorSystem.create("MyActorSystem");// ator com construtor defaultActorRef ato...
Criando um ator - Java// ator com outro construtorActorRef ator2 = system.actorOf(    new Props(new UntypedActorFactory() ...
Protegendo o estadoval minhaInstancia = new Ator(<params>)// erro em runtimeval ator2 =  system.actorOf(Props(minhaInstanc...
Atores relativos ao contexto● todo ator tem um campo "context"● esse campo pode criar novos atores● esses atores serão "fi...
"let it crash"● tolerância a falhas● não evitamos que atores quebre● e decidimos o que fazer quando acontecer● todo ator é...
Hierarquia de atores                  A          B            C     D        E            F
Hierarquia de atores                  A          B            C     D        E            F
Hierarquia de atores                 A                       C                           F
Hierarquia de atores                  A          B            C     D        E            F
Config. de tolerância a falhas - Scalaoverride val supervisorStrategy = OneForOneStrategy(  maxNrOfRetries = 10, withinTim...
Config. de tolerância a falhas - Javaprivate static SupervisorStrategy strategy = new OneForOneStrategy(10, Duration.parse...
Config. de tolerância a falhas - Java@Overridepublic SupervisorStrategy supervisorStrategy() {  return strategy;}obs: exem...
Ponto para divisão de tarefas● recomenda-se quebrar as tarefas● roteadores são uma forma de fazer isso● definem grupos de ...
Exemplo roteador - Scalaval s3SenderRouter = system.actorOf(  Props[S3SenderActor].withRouter(   SmallestMailboxRouter(2)))
Exemplo roteador - JavaActorRef s3SenderRouter = system.actorOf(  new Props(S3SenderActor.class).withRouter(   new Smalles...
Projeto Open Source: Lojinha● Scala● Akka 2.0● Play Framework 2.0
Projeto Open Source: Lojinha● um ator para lances de cada produto● aguentaria milhões de produtos● da página oficial do Ak...
Atores da Lojinha                                 Play Akka                                  System                       ...
código!● lojinha no NetBeans...● ... se der tempo● senão, está tudo no github =)
Referências● site oficial: akka.io● meu blog: jcranky.com● meu twitter: twitter.com/jcranky● lojinha, no github: https://g...
coming soon...● curso de Scala na Globalcode● mais informações nas próximas semanas● tópicos principais:   ○ Scala   ○ Akk...
Questions?             ?
thanks! @jcranky
Próximos SlideShares
Carregando em…5
×

Akka no Just Java 2012

1.859 visualizações

Publicada em

Palestra sobre Akka, apresentada no Just Java 2012, em São Paulo.

Publicada em: Saúde e medicina
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.859
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Akka no Just Java 2012

  1. 1. Akka 2.0Chega de multi-threading na unha @jcranky
  2. 2. Paulo "JCranky" Siqueira● desenvolvedor java e scala● consultor independente● instrutor globalcode● um dos fundadores dos Scaladores
  3. 3. Concorrência de forma correta?
  4. 4. Tolerância a falhas?
  5. 5. Abstração!● em OO aprendemos a abstrair conceitos● programação concorrente não pode ser abstraída?● porque nos preocupar com Threads?● e com locks?● e em fazer isso direito...
  6. 6. Akka 2.0● inspirado em Erlang● abstrai preocupações baixo nível● pensamos mais nos problemas de negócio● API Java e Scala● Actor Model !
  7. 7. Actor Model● entidades independentes● estado● comportamento● mailbox● como uma classe em OO...● ... mas mais "pura"
  8. 8. Actor Modelmensagens mailbox Comportamento Estado
  9. 9. Actor Model● comunicação com troca de mensagens● "event-driven"● sempre assíncrono
  10. 10. Abstração == Overhead?● overhead do Akka é ínfimo● extraído da página oficial:● "50 million msg/sec on a single machine."● obviamente, em um micro-benchmark...
  11. 11. Escalabilidade...● horizontal e vertical● nosso foco é a vertical● a horizontal seria fácil com atores remotos
  12. 12. Threads... cadê?● Akka cria as threads necessárias● ator != thread● atores usando threads disponíveis● akka fornece uma thread para o ator● sem locks
  13. 13. Divisão de trabalho● threads usando os "cores" disponíveis● fork-join por padrão● fork-join estará no Java 8...● ... mas já está embutido no Akka● tudo configurável
  14. 14. config. extraída da documentação:fork-join-executor { # Min number of threads to cap factor-based parallelism number to parallelism-min = 8 # Parallelism (threads) ... ceil(available processors * factor) parallelism-factor = 3.0 # Max number of threads to cap factor-based parallelism number to parallelism-max = 64}
  15. 15. Imutabilidade● origem de muitos problemas● para não precisar de locks● nunca teremos deadlocks● desnecessário sincronizar acesso ao estado
  16. 16. Uma mensagem - Scalacase class SendToS3(fileName: String)
  17. 17. Uma mensagem - Javapublic class SendToS3 { private final String fileName; public SendToS3(String fileName) { this.fileName = fileName; } public String getFileName() { return fileName; }}
  18. 18. Um ator - Scalaclass S3SenderActor extends Actor { def receive = { case SendToS3(fileName) => // lógica de negócios aqui }}
  19. 19. Um ator - Javapublic class S3SenderActor extends UntypedActor { public void onReceive(Object message) throws Exception { if (message instanceof String) // lógica de negócios aqui else unhandled(message); }}
  20. 20. Lidando com alteração de estado● atores não devem compartilhar estado● um único ator será responsável pelos dados● acesso a BD pode ser enfileirado● ou atores responsáveis por "fatias" de dados● veremos exemplo disso mais adiante
  21. 21. Criando atores● métodos / classes especiais● atores criados abaixo da raiz do nó principal● ... ou relativos ao contexto atual● todo ator tem um "pai"● veremos mais sobre isso adiante
  22. 22. Criando um ator - Scalaval system = ActorSystem("MyActorSystem")// ator com construtor defaultval ator = system.actorOf(Props[S3SenderAtor])// ator com outro construtorval ator2 = system.actorOf(Props(new Ator(<params>)))
  23. 23. Criando um ator - JavaActorSystem system = ActorSystem.create("MyActorSystem");// ator com construtor defaultActorRef ator = system.actorOf( new Props(S3SenderActor.class));
  24. 24. Criando um ator - Java// ator com outro construtorActorRef ator2 = system.actorOf( new Props(new UntypedActorFactory() { public UntypedActor create() { return new Ator(<params>); } }));
  25. 25. Protegendo o estadoval minhaInstancia = new Ator(<params>)// erro em runtimeval ator2 = system.actorOf(Props(minhaInstancia))
  26. 26. Atores relativos ao contexto● todo ator tem um campo "context"● esse campo pode criar novos atores● esses atores serão "filhos" do ator atualcontext.actorOf(Props[S3SenderActor])
  27. 27. "let it crash"● tolerância a falhas● não evitamos que atores quebre● e decidimos o que fazer quando acontecer● todo ator é supervisionado (2.0+)● o supervisor decide o que fazer
  28. 28. Hierarquia de atores A B C D E F
  29. 29. Hierarquia de atores A B C D E F
  30. 30. Hierarquia de atores A C F
  31. 31. Hierarquia de atores A B C D E F
  32. 32. Config. de tolerância a falhas - Scalaoverride val supervisorStrategy = OneForOneStrategy( maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: ArithmeticException ⇒ Resume case _: NullPointerException ⇒ Restart case _: IllegalArgumentException ⇒ Stop case _: Exception ⇒ Escalate}
  33. 33. Config. de tolerância a falhas - Javaprivate static SupervisorStrategy strategy = new OneForOneStrategy(10, Duration.parse("1 minute"), new Function<Throwable, Directive>() { @Override public Directive apply(Throwable t) { if (t instanceof ArithmeticException) { return resume(); } else if (t instanceof NullPointerException) { return restart(); } else if (t instanceof IllegalArgumentException) { return stop(); } else { return escalate(); } } });
  34. 34. Config. de tolerância a falhas - Java@Overridepublic SupervisorStrategy supervisorStrategy() { return strategy;}obs: exemplos de configs extraídos da doc.
  35. 35. Ponto para divisão de tarefas● recomenda-se quebrar as tarefas● roteadores são uma forma de fazer isso● definem grupos de atores● e o roteador divide as mensagens
  36. 36. Exemplo roteador - Scalaval s3SenderRouter = system.actorOf( Props[S3SenderActor].withRouter( SmallestMailboxRouter(2)))
  37. 37. Exemplo roteador - JavaActorRef s3SenderRouter = system.actorOf( new Props(S3SenderActor.class).withRouter( new SmallestMailboxRouter(2)));
  38. 38. Projeto Open Source: Lojinha● Scala● Akka 2.0● Play Framework 2.0
  39. 39. Projeto Open Source: Lojinha● um ator para lances de cada produto● aguentaria milhões de produtos● da página oficial do Akka:"Small memory footprint; ~2.7 million actors perGB of heap."
  40. 40. Atores da Lojinha Play Akka System Image Master Bid Thumb Actor Router S3 Sender Router Image Process Thumb Bid Actor S3 Sender Actor Actorum para cada produto vários, conforme configurado vários, conforme configurado
  41. 41. código!● lojinha no NetBeans...● ... se der tempo● senão, está tudo no github =)
  42. 42. Referências● site oficial: akka.io● meu blog: jcranky.com● meu twitter: twitter.com/jcranky● lojinha, no github: https://github. com/jcranky/lojinha
  43. 43. coming soon...● curso de Scala na Globalcode● mais informações nas próximas semanas● tópicos principais: ○ Scala ○ Akka ○ Play Framework
  44. 44. Questions? ?
  45. 45. thanks! @jcranky

×