SlideShare uma empresa Scribd logo
1 de 45
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

Mais procurados (18)

Curso Java Básico - Aula02
Curso Java Básico - Aula02Curso Java Básico - Aula02
Curso Java Básico - Aula02
 
02 controle de fluxo
02   controle de fluxo02   controle de fluxo
02 controle de fluxo
 
Objective-C
Objective-CObjective-C
Objective-C
 
Threads 06: Coleções concorrentes
Threads 06: Coleções concorrentesThreads 06: Coleções concorrentes
Threads 06: Coleções concorrentes
 
Curso Java Básico - Aula 04
Curso Java Básico - Aula 04Curso Java Básico - Aula 04
Curso Java Básico - Aula 04
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Interface
InterfaceInterface
Interface
 
Ficha javacc
Ficha javaccFicha javacc
Ficha javacc
 
JavaCC
JavaCCJavaCC
JavaCC
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
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
 
7194099-Manual-de-Java
7194099-Manual-de-Java7194099-Manual-de-Java
7194099-Manual-de-Java
 
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
 
Threads 08: Executores e Futures
Threads 08: Executores e FuturesThreads 08: Executores e Futures
Threads 08: Executores e Futures
 
Final e aastract
Final e aastractFinal e aastract
Final e aastract
 
Class abstrata java
Class abstrata javaClass abstrata java
Class abstrata java
 
Java 13
Java 13Java 13
Java 13
 

Destaque

ROSEMARY BIANCHINI - Revised 2-16
ROSEMARY BIANCHINI - Revised 2-16ROSEMARY BIANCHINI - Revised 2-16
ROSEMARY BIANCHINI - Revised 2-16Rosemary Bianchini
 
Informe para Primer Debate de la Ley de Incentivos Tributarios
Informe para Primer Debate de la Ley de Incentivos Tributarios Informe para Primer Debate de la Ley de Incentivos Tributarios
Informe para Primer Debate de la Ley de Incentivos Tributarios Ela Zambrano
 
تطور فكرة التطور والعرب
تطور فكرة التطور والعربتطور فكرة التطور والعرب
تطور فكرة التطور والعربHatem Refaat El-Sheemy
 
Gyanm General Awareness September 2016 Issue..!!
Gyanm General Awareness September 2016 Issue..!! Gyanm General Awareness September 2016 Issue..!!
Gyanm General Awareness September 2016 Issue..!! Grover's Gyanm
 
HSCG - Módulo 1 - Competências a desenvolver
HSCG - Módulo 1 - Competências a desenvolverHSCG - Módulo 1 - Competências a desenvolver
HSCG - Módulo 1 - Competências a desenvolverGabriela Bruno
 
Regional identity
Regional identityRegional identity
Regional identityjphibbert
 

Destaque (15)

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

Semelhante a Akka 2.0 - Abstraindo concorrência com atores

Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...
Akka - Uma plataforma para o desenvolvimento de sistemas concorrentes e distr...Daniel Sobral
 
Regras de Produção: o Motor de Inferência JESS
Regras de Produção:o Motor de Inferência JESSRegras de Produção:o Motor de Inferência JESS
Regras de Produção: o Motor de Inferência JESSelliando dias
 
Um Mundo Java Sem XML
Um Mundo Java Sem XMLUm Mundo Java Sem XML
Um Mundo Java Sem XMLiMasters
 
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)
Ruby on Rails (VERSAO COM LAYOUT CONSERTADO)Julio Betta
 
JavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasJavaFX 8, Collections e Lambdas
JavaFX 8, Collections e LambdasjesuinoPower
 
GDG POA - Karate DSL - Automatizando testes de api de forma simples
GDG POA - Karate DSL - Automatizando testes de api de forma simplesGDG POA - Karate DSL - Automatizando testes de api de forma simples
GDG POA - Karate DSL - Automatizando testes de api de forma simplesSamuel Lucas
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
Três anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorTrês anos de Scala no NewsMonitor
Três anos de Scala no NewsMonitorFelipe Hummel
 
Linguagem de Programação Java
Linguagem de Programação JavaLinguagem de Programação Java
Linguagem de Programação Javathomasdacosta
 
Novidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiNovidades do Django 1.2 e o que vem por ai
Novidades do Django 1.2 e o que vem por aiMarcos Petry
 
ASP.Net Módulo 2
ASP.Net   Módulo 2ASP.Net   Módulo 2
ASP.Net Módulo 2michellobo
 
Struts Cap10 DepuraçãO E Log
Struts Cap10 DepuraçãO E LogStruts Cap10 DepuraçãO E Log
Struts Cap10 DepuraçãO E LogWaldir R. Pires Jr
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 

Semelhante a Akka 2.0 - Abstraindo concorrência com atores (20)

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

Mais de Paulo Siqueira

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

Mais de Paulo Siqueira (6)

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

Último

AULA SOBRE SAMU, CONCEITOS E CARACTERICAS
AULA SOBRE SAMU, CONCEITOS E CARACTERICASAULA SOBRE SAMU, CONCEITOS E CARACTERICAS
AULA SOBRE SAMU, CONCEITOS E CARACTERICASArtthurPereira2
 
TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.
TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.
TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.ColorNet
 
Plantas-medicinais-nativas-do-Bioma-Pampa.pdf
Plantas-medicinais-nativas-do-Bioma-Pampa.pdfPlantas-medicinais-nativas-do-Bioma-Pampa.pdf
Plantas-medicinais-nativas-do-Bioma-Pampa.pdfDaianaBittencourt
 
INTRODUÇÃO A DTM/DOF-DRLucasValente.pptx
INTRODUÇÃO A DTM/DOF-DRLucasValente.pptxINTRODUÇÃO A DTM/DOF-DRLucasValente.pptx
INTRODUÇÃO A DTM/DOF-DRLucasValente.pptxssuser4ba5b7
 
Modelo de apresentação de TCC em power point
Modelo de apresentação de TCC em power pointModelo de apresentação de TCC em power point
Modelo de apresentação de TCC em power pointwylliamthe
 
Sistema endocrino anatomia humana slide.pdf
Sistema endocrino anatomia humana slide.pdfSistema endocrino anatomia humana slide.pdf
Sistema endocrino anatomia humana slide.pdfGustavoWallaceAlvesd
 

Último (7)

AULA SOBRE SAMU, CONCEITOS E CARACTERICAS
AULA SOBRE SAMU, CONCEITOS E CARACTERICASAULA SOBRE SAMU, CONCEITOS E CARACTERICAS
AULA SOBRE SAMU, CONCEITOS E CARACTERICAS
 
TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.
TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.
TRABALHO SOBRE A ERISIPELA BOLHOSA.pptx.
 
Aplicativo aleitamento: apoio na palma das mãos
Aplicativo aleitamento: apoio na palma das mãosAplicativo aleitamento: apoio na palma das mãos
Aplicativo aleitamento: apoio na palma das mãos
 
Plantas-medicinais-nativas-do-Bioma-Pampa.pdf
Plantas-medicinais-nativas-do-Bioma-Pampa.pdfPlantas-medicinais-nativas-do-Bioma-Pampa.pdf
Plantas-medicinais-nativas-do-Bioma-Pampa.pdf
 
INTRODUÇÃO A DTM/DOF-DRLucasValente.pptx
INTRODUÇÃO A DTM/DOF-DRLucasValente.pptxINTRODUÇÃO A DTM/DOF-DRLucasValente.pptx
INTRODUÇÃO A DTM/DOF-DRLucasValente.pptx
 
Modelo de apresentação de TCC em power point
Modelo de apresentação de TCC em power pointModelo de apresentação de TCC em power point
Modelo de apresentação de TCC em power point
 
Sistema endocrino anatomia humana slide.pdf
Sistema endocrino anatomia humana slide.pdfSistema endocrino anatomia humana slide.pdf
Sistema endocrino anatomia humana slide.pdf
 

Akka 2.0 - Abstraindo concorrência com atores

  • 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