SlideShare uma empresa Scribd logo
Akka 2.0
Chega de multi-threading na unha

            @jcranky
Paulo "JCranky" Siqueira



● desenvolvedor java e scala
● consultor independente
● instrutor globalcode
● um dos fundadores dos Scaladores
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 com Threads?
● e com locks?
● e em fazer isso direito...
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 !
Actor Model
● entidades independentes
● estado
● comportamento
● mailbox
● como uma classe em OO...
● ... mas mais "pura"
Actor Model

mensagens      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."
● obviamente, em um micro-benchmark...
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 thread para o ator
● sem locks
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
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
}
Imutabilidade


● origem de muitos problemas
● para não precisar de locks
● nunca teremos deadlocks
● desnecessário sincronizar acesso ao estado
Uma mensagem - Scala



case class SendToS3(fileName: String)
Uma mensagem - Java
public class SendToS3 {
  private final String fileName;

    public SendToS3(String fileName) {
      this.fileName = fileName;
    }

    public String getFileName() {
      return fileName;
    }
}
Um ator - Scala


class S3SenderActor extends Actor {
  def receive = {
    case SendToS3(fileName) =>
     // lógica de negócios aqui
  }
}
Um ator - Java

public class S3SenderActor extends UntypedActor {
  public void onReceive(Object message)
         throws Exception {
     if (message instanceof String)
         // lógica de negócios aqui
     else
         unhandled(message);
    }
}
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
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
Criando um ator - Scala
val system = ActorSystem("MyActorSystem")

// ator com construtor default
val ator =
  system.actorOf(Props[S3SenderAtor])

// ator com outro construtor
val ator2 =
  system.actorOf(Props(new Ator(<params>)))
Criando um ator - Java
ActorSystem system =
  ActorSystem.create("MyActorSystem");

// ator com construtor default
ActorRef ator = system.actorOf(
    new Props(S3SenderActor.class));
Criando um ator - Java
// ator com outro construtor
ActorRef ator2 = system.actorOf(
    new Props(new UntypedActorFactory() {
      public UntypedActor create() {
         return new Ator(<params>);
      }
   })
);
Protegendo o estado


val minhaInstancia = new Ator(<params>)

// erro em runtime
val ator2 =
  system.actorOf(Props(minhaInstancia))
Atores relativos ao contexto


● todo ator tem um campo "context"
● esse campo pode criar novos atores
● esses atores serão "filhos" do ator atual


context.actorOf(Props[S3SenderActor])
"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
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 - Scala
override val supervisorStrategy =
 OneForOneStrategy(
  maxNrOfRetries = 10, withinTimeRange = 1 minute) {

    case _: ArithmeticException ⇒ Resume
    case _: NullPointerException ⇒ Restart
    case _: IllegalArgumentException ⇒ Stop
    case _: Exception ⇒ Escalate

}
Config. de tolerância a falhas - Java
private 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();
     }
   }
 });
Config. de tolerância a falhas - Java

@Override
public SupervisorStrategy supervisorStrategy() {
  return strategy;
}




obs: exemplos de configs extraídos da doc.
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
Exemplo roteador - Scala


val s3SenderRouter = system.actorOf(
  Props[S3SenderActor].withRouter(
   SmallestMailboxRouter(2))
)
Exemplo roteador - Java


ActorRef s3SenderRouter = system.actorOf(
  new Props(S3SenderActor.class).withRouter(
   new SmallestMailboxRouter(2))
);
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 Akka:


"Small memory footprint; ~2.7 million actors per
GB of heap."
Atores da Lojinha

                                 Play Akka
                                  System



                                                                  Image
      Master Bid
                                                                  Thumb
        Actor
                                                                  Router
                                S3 Sender
                                 Router




                                                                  Image
       Process
                                                                  Thumb
       Bid Actor
                                S3 Sender                          Actor
                                  Actor
um para cada produto                                  vários, conforme configurado
                       vários, conforme configurado
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://github.
  com/jcranky/lojinha
coming soon...

● curso de Scala na Globalcode
● mais informações nas próximas semanas
● tópicos principais:
   ○ Scala
   ○ Akka
   ○ Play Framework
Questions?




             ?
thanks!


 @jcranky

Mais conteúdo relacionado

ODP
Entendendo o Modelo de Atores
PPTX
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
PDF
Programação Orientada a Objetos - 001
PDF
PDF
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
PDF
Threads 09: Paralelismo
PPTX
Curso Java Básico - Aula 01
PDF
Linguagem Java
Entendendo o Modelo de Atores
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - 001
TDC2018SP | Trilha Ruby - Programacao funcional com Ruby, potencialize e simp...
Threads 09: Paralelismo
Curso Java Básico - Aula 01
Linguagem Java

Mais procurados (18)

PPTX
Curso Java Básico - Aula02
PPTX
02 controle de fluxo
PPTX
Objective-C
PDF
Threads 06: Coleções concorrentes
PPTX
Curso Java Básico - Aula 04
PDF
Curso de Java: Threads
PPTX
Interface
PDF
Ficha javacc
PPT
PPTX
Curso Java Básico - Aula 03
PDF
Threads 04 Variáveis atômicas
PPTX
Java e orientação a objetos
PDF
7194099-Manual-de-Java
PDF
Threads 03: Ciclo de vida, aplicações e boas práticas
PDF
Threads 08: Executores e Futures
PPTX
Final e aastract
PDF
Class abstrata java
Curso Java Básico - Aula02
02 controle de fluxo
Objective-C
Threads 06: Coleções concorrentes
Curso Java Básico - Aula 04
Curso de Java: Threads
Interface
Ficha javacc
Curso Java Básico - Aula 03
Threads 04 Variáveis atômicas
Java e orientação a objetos
7194099-Manual-de-Java
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 08: Executores e Futures
Final e aastract
Class abstrata java
Anúncio

Destaque (15)

PDF
Tabaco....
DOCX
ROSEMARY BIANCHINI - Revised 2-16
PDF
Informe para Primer Debate de la Ley de Incentivos Tributarios
DOC
Record zombie
PPTX
تطور فكرة التطور والعرب
PPTX
Presentación1
PPTX
Álcool
PDF
Higiene...
PPT
Apon7
PDF
Álcool....
PPTX
Webiste analysis
PDF
Gyanm General Awareness September 2016 Issue..!!
PDF
HSCG - Módulo 1 - Competências a desenvolver
PPTX
Care of elderly
PPTX
Regional identity
Tabaco....
ROSEMARY BIANCHINI - Revised 2-16
Informe para Primer Debate de la Ley de Incentivos Tributarios
Record zombie
تطور فكرة التطور والعرب
Presentación1
Álcool
Higiene...
Apon7
Álcool....
Webiste analysis
Gyanm General Awareness September 2016 Issue..!!
HSCG - Módulo 1 - Competências a desenvolver
Care of elderly
Regional identity
Anúncio

Semelhante a Akka no Just Java 2012 (20)

PPTX
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
PPT
Regras de Produção: o Motor de Inferência JESS
PDF
Um Mundo Java Sem XML
PPT
Struts2 remote codeexecution
PDF
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
PDF
JavaFX 8, Collections e Lambdas
PDF
GDG POA - Karate DSL - Automatizando testes de api de forma simples
PDF
(A10) LabMM3 - JavaScript - Subalgoritmos
PDF
Como criar Custom Tags
PPT
JPA - Java Persistence API
PDF
Três anos de Scala no NewsMonitor
PPTX
Linguagem de Programação Java
ODP
Novidades do Django 1.2 e o que vem por ai
PPTX
PPT
ASP.Net Módulo 2
PDF
Tag Libraries e JSTL
PDF
Tutorial java swing
PPT
Struts Cap10 DepuraçãO E Log
PDF
TDC2016POA | Trilha Android - Testes no Android
PDF
TDC2016POA | Trilha Android - Testes no Android
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Regras de Produção: o Motor de Inferência JESS
Um Mundo Java Sem XML
Struts2 remote codeexecution
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
JavaFX 8, Collections e Lambdas
GDG POA - Karate DSL - Automatizando testes de api de forma simples
(A10) LabMM3 - JavaScript - Subalgoritmos
Como criar Custom Tags
JPA - Java Persistence API
Três anos de Scala no NewsMonitor
Linguagem de Programação Java
Novidades do Django 1.2 e o que vem por ai
ASP.Net Módulo 2
Tag Libraries e JSTL
Tutorial java swing
Struts Cap10 DepuraçãO E Log
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android

Mais de Paulo Siqueira (6)

PDF
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
PDF
Desvendando o sistema de tipos do scala
ODP
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
ODP
Minecraft Modding e Scala
ODP
Minecraft Modding: Um Jogo que vira Muitos!
ODP
Atendendo Milhares de Requisições com o Play Framework 2 - v2
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de c...
Desvendando o sistema de tipos do scala
Minecraft and Scala: Creating a DSL to enable kids to create Minecraft Mods
Minecraft Modding e Scala
Minecraft Modding: Um Jogo que vira Muitos!
Atendendo Milhares de Requisições com o Play Framework 2 - v2

Último (20)

PDF
Particularidades das raças 3 slides pb_compressed.pdf
PDF
Relatório de atividades do Instituto Oncoguia 2024
PPTX
FEBRE ENTÉRICA OU TIFÓIDE.pptxjjhgfdfghjhgfd
PPTX
funcoes tsbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
PPTX
AMSCOPLICA - texto sobre as funções mentais
PPT
hidro em geriatria - aula E ATIVIDADE DE CLASSE.ppt
PPTX
Determinantes sociais de saúde_ tsb.pptx
PDF
gestacao-contracepcao-e-prevencao-de-ists.pdf
PDF
Liderança de Enfermagem e Trabalho em Equipe.pdf
PPTX
MODELO DE APRESENTAÇÃO - QUALITOTAL.pptx
PDF
PROJETO DE PESQUISA PRONTO GERONTOLOGIA 2025 ABNT.pdf
PDF
Fundamentos e Políticas de Biossegurança.pdf
PPTX
Encontro 4 da Disciplina UTI Aspectos Históricos e Sociais.pptx
PDF
Projeto de Extensão- Mobilização Comunitária para Apoio a Entidades Assistenc...
PPTX
1 aula de Doenças transmissíveis Introdução Tema 1 e 2.Pós FDM (1).pptx
PPTX
Aula_Processo_de_Enfermagem_Completa.pptx
PDF
EVOLUÇÃO-DE-ENFERMAGEM voltado a saúde(1)_cópia.pdf
PDF
Parasitologia_Nematódeos_Ascaris e Enteróbios
PPTX
Norma de segurança, Norma de segurança e IRAS,
PDF
716494387-SLIDE-AULA-03.pdf ortese assistiva
Particularidades das raças 3 slides pb_compressed.pdf
Relatório de atividades do Instituto Oncoguia 2024
FEBRE ENTÉRICA OU TIFÓIDE.pptxjjhgfdfghjhgfd
funcoes tsbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
AMSCOPLICA - texto sobre as funções mentais
hidro em geriatria - aula E ATIVIDADE DE CLASSE.ppt
Determinantes sociais de saúde_ tsb.pptx
gestacao-contracepcao-e-prevencao-de-ists.pdf
Liderança de Enfermagem e Trabalho em Equipe.pdf
MODELO DE APRESENTAÇÃO - QUALITOTAL.pptx
PROJETO DE PESQUISA PRONTO GERONTOLOGIA 2025 ABNT.pdf
Fundamentos e Políticas de Biossegurança.pdf
Encontro 4 da Disciplina UTI Aspectos Históricos e Sociais.pptx
Projeto de Extensão- Mobilização Comunitária para Apoio a Entidades Assistenc...
1 aula de Doenças transmissíveis Introdução Tema 1 e 2.Pós FDM (1).pptx
Aula_Processo_de_Enfermagem_Completa.pptx
EVOLUÇÃO-DE-ENFERMAGEM voltado a saúde(1)_cópia.pdf
Parasitologia_Nematódeos_Ascaris e Enteróbios
Norma de segurança, Norma de segurança e IRAS,
716494387-SLIDE-AULA-03.pdf ortese assistiva

Akka no Just Java 2012

  • 1. Akka 2.0 Chega de multi-threading na unha @jcranky
  • 2. Paulo "JCranky" Siqueira ● desenvolvedor java e scala ● consultor independente ● instrutor globalcode ● um dos fundadores dos Scaladores
  • 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. 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. Actor Model ● entidades independentes ● estado ● comportamento ● mailbox ● como uma classe em OO... ● ... mas mais "pura"
  • 8. Actor Model mensagens mailbox Comportamento Estado
  • 9. Actor Model ● comunicação com troca de mensagens ● "event-driven" ● sempre assíncrono
  • 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. Escalabilidade... ● horizontal e vertical ● nosso foco é a vertical ● a horizontal seria fácil com atores remotos
  • 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. 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. 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. Imutabilidade ● origem de muitos problemas ● para não precisar de locks ● nunca teremos deadlocks ● desnecessário sincronizar acesso ao estado
  • 16. Uma mensagem - Scala case class SendToS3(fileName: String)
  • 17. Uma mensagem - Java public class SendToS3 { private final String fileName; public SendToS3(String fileName) { this.fileName = fileName; } public String getFileName() { return fileName; } }
  • 18. Um ator - Scala class S3SenderActor extends Actor { def receive = { case SendToS3(fileName) => // lógica de negócios aqui } }
  • 19. Um ator - Java public 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. 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. 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. Criando um ator - Scala val system = ActorSystem("MyActorSystem") // ator com construtor default val ator = system.actorOf(Props[S3SenderAtor]) // ator com outro construtor val ator2 = system.actorOf(Props(new Ator(<params>)))
  • 23. Criando um ator - Java ActorSystem system = ActorSystem.create("MyActorSystem"); // ator com construtor default ActorRef ator = system.actorOf( new Props(S3SenderActor.class));
  • 24. Criando um ator - Java // ator com outro construtor ActorRef ator2 = system.actorOf( new Props(new UntypedActorFactory() { public UntypedActor create() { return new Ator(<params>); } }) );
  • 25. Protegendo o estado val minhaInstancia = new Ator(<params>) // erro em runtime val ator2 = system.actorOf(Props(minhaInstancia))
  • 26. Atores relativos ao contexto ● todo ator tem um campo "context" ● esse campo pode criar novos atores ● esses atores serão "filhos" do ator atual context.actorOf(Props[S3SenderActor])
  • 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. Hierarquia de atores A B C D E F
  • 29. Hierarquia de atores A B C D E F
  • 31. Hierarquia de atores A B C D E F
  • 32. Config. de tolerância a falhas - Scala override val supervisorStrategy = OneForOneStrategy( maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: ArithmeticException ⇒ Resume case _: NullPointerException ⇒ Restart case _: IllegalArgumentException ⇒ Stop case _: Exception ⇒ Escalate }
  • 33. Config. de tolerância a falhas - Java private 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. Config. de tolerância a falhas - Java @Override public SupervisorStrategy supervisorStrategy() { return strategy; } obs: exemplos de configs extraídos da doc.
  • 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. Exemplo roteador - Scala val s3SenderRouter = system.actorOf( Props[S3SenderActor].withRouter( SmallestMailboxRouter(2)) )
  • 37. Exemplo roteador - Java ActorRef s3SenderRouter = system.actorOf( new Props(S3SenderActor.class).withRouter( new SmallestMailboxRouter(2)) );
  • 38. Projeto Open Source: Lojinha ● Scala ● Akka 2.0 ● Play Framework 2.0
  • 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 per GB of heap."
  • 40. Atores da Lojinha Play Akka System Image Master Bid Thumb Actor Router S3 Sender Router Image Process Thumb Bid Actor S3 Sender Actor Actor um para cada produto vários, conforme configurado vários, conforme configurado
  • 41. código! ● lojinha no NetBeans... ● ... se der tempo ● senão, está tudo no github =)
  • 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. coming soon... ● curso de Scala na Globalcode ● mais informações nas próximas semanas ● tópicos principais: ○ Scala ○ Akka ○ Play Framework