akka: arquitetura orientada a atores...2018/12/14  · ano 2009 –akka jonas bonér é um java...

43
Akka: Arquitetura Orientada a Atores Fabiano Guizellini Modos Arquiteto de Software - HBSIS @fmodos

Upload: others

Post on 22-May-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Akka: Arquitetura

Orientada a Atores

Fabiano Guizellini ModosArquiteto de Software - HBSIS

@fmodos

Page 2: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

ACTOR Model = Modelo de Atores

Page 3: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Agenda

➢ Conceito de Atores

➢ Non Blocking / Blocking

➢ Comunicação Assíncrona

➢ Supervisor

➢ Router

➢ Cluster

“If you can’t explain it simply, you don’t understand it well enough“

Albert Einstein

Page 4: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Quem Usa Akka?

“1. Scalable, both horizontally to hundreds of nodes and vertically to very many processors, handling billions of requests per day

2. Low latency, controllable at a very fine grain

3. Resilient to failure

4. Flexibility in adjusting the service boundaries

5. A programming model AND culture encouraging scalability and simplicity, including clean failure and error handling”

"How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs"

http://highscalability.com/blog/2016/8/15/how-paypal-scaled-to-billions-of-

transactions-daily-using-ju.html

"A New, Reactive Way for PayPal to Build Applications"

https://www.paypal-engineering.com/2016/05/11/squbs-a-new-reactive-way-for-

paypal-to-build-applications/

Page 5: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Quem Usa Akka?

"How does one display them in real time for roughly 500 million members on a social network like LinkedIn?"

"Now You See Me, Now You Don’t: LinkedIn’s Real-Time Presence Platform"

https://engineering.linkedin.com/blog/2018/01/now-you-see-me--now-you-dont--

linkedins-real-time-presence-platf

Page 6: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Ano 1973 - A Universal Modular ACTOR

Formalism for Artificial Intelligence

“Current developments in hardware technology are making it economically attractive to run many physical processors in parallel.... The actor formalism provides a

coherent method for organizing and controlling all these processors.” by Carl Hewitt

Page 7: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Ano 1986 – ERLANG

A Ericsson desenvolveu essa linguagem baseada no conceito de atores com o objetivo de melhorar o desenvolvimento de aplicações de telefonia.

"when you build a system in Erlang, you can see

the system as a serious of very small programs"

Greg Young

https://vimeo.com/108441214

QUEM USA?

Page 8: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Ano 2009 – Akka

Jonas Bonér é um Java Champion. Ele criou o Akka em Java inspirado no conceito de ACTOR e da linguagem Erlang.

Page 9: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Ano 2015 – Quando eu conheci Akka

Utilizado no produto Unidocs da HBSIS

✘ Responsável pela emissão de documentos de transporte

✘ ~30 milhões de documentos

✘ ~1000 atores dividos em 8 microservices

✘ Processa ~80k eventos por hora

Page 10: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

https://www.youtube.com/watch?v=7erJ1DV_Tlo

ACTOR é um agente com as seguinte responsabilidades:➢ Processing➢ Storage ➢ Communication

ACTOR by Carl Hewitt

Page 11: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Hands On

Otimizar as filas do Subway

Page 12: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Projeto Subway

✘ FIFO – Fila✘ Exception - Cliente Desmaiou✘ Load – Garçom Sobrecarregado✘ Pergunta do Milhão

Page 13: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

FIFO – First In First Out

Problema: Um Cliente Lento Afeta Toda a Fila

Waiter waiter = new Waiter();int delayToChoose = 10000;waiter.receiveOrder(new NewSandwich("Slow Client", delayToChoose));waiter.receiveOrder(new NewSandwich("Fast Client", 0));

BLOCKING

Page 14: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Fila Blocking

Page 15: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Varias Filas Blocking

Page 16: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

FIFO – Blocking

FOFO – Faster Order Faster Out

Non Blocking

Page 17: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Comunicação

Waiter Customer

nextOrder()

Waiter

Actor

“NextOrder”

Customer

Actor

Waiter

Actor

“MyOrder”

Customer

Actor

BlockingNon Blocking

“MyOrder”

Page 18: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Comunicação

BlockingNon Blocking

Page 19: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

FOFO – Faster Order Faster Out

“MyOrder”

Customer

Actor

Waiter

Actor

“NextOrder”

Customer

Actor

“FINISH”

Customer

Actor

Page 20: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang
Page 21: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Concorrência com ACTOR

Actor

Ref

Waiter

Actor

MailBox

Actor

Ref

Customer

Actor

MailBox

Acesso a

atores somente

via REF

ThreadSafe:

{activeCustomer++}

MailBox envia

uma Mensagem

por vez para o

Actor

Page 22: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

ACTOR toma decisão a partir do “Estado”

Waiter

Actor

“NextOrder”

Customer

Actor

Waiter

Actor

“MyOrder”

Customer

Actor

Waiter

Actor

“NextOrder”

Customer

Actor

Waiter

Actor

“FINISH”

Customer

Actor

totalOrder: 2

{totalOrder++}

totalOrder: 3

{if(totalOrder==3) “FINISH”}

Page 23: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

ActorSystem system= ActorSystem.create("SubwaySystem");

ActorRef waiter =system.actorOf(Props.create(WaiterActor.class), "waiter");

int delayToChoose = 10000;

waiter.tell(new NewSandwich("Slow Client", delayToChoose), ActorRef.noSender());

waiter.tell(new NewSandwich("Fast Client", 0), ActorRef.noSender());

HANDS ON - ActorSystem

Page 24: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

HANDS ON - Comunicação entre Atores

public class CustomerActor extends AbstractActor {

@Overridepublic Receive createReceive() {

return receiveBuilder().// matchEquals(EnumOrder.NEXT_ORDER, order -> {

doOrder();}).build();

}

public class WaiterActor extends AbstractActor {

@Overridepublic Receive createReceive() {return receiveBuilder()//

.match(Order.class, order -> {totalOrders++;log("Processando pedido "+order.getSalad());getSender().tell(EnumOrder.NEXT_ORDER, getSelf());

Page 25: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Projeto Subway

✘ FIFO – Fila Blocking✘ Exception - Cliente Desmaiou✘ Load – Garçom Sobrecarregado✘ Pergunta do Milhão

Page 26: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Catch Exception de outra Thread?

Try {New Thread(new Runnable(){

Public void run(){Throw new RuntimeException(“HEY”);

}}).start();

}catch(Exception e){System.out.println(“HEY EXCEPTION?”)

}

Page 27: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Actor cria e supervisiona outros Actor

Waiter

Actor

newActor()

Actor

Context

“NewCustomer”

watch(actor)

“NextOrder”

Customer

Actor

Error

Exception

Page 28: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

if (totalOrders == 1 && sandwich.isFaint()) {throw new RuntimeException("Problem here");

}

@Overridepublic SupervisorStrategy supervisorStrategy() {return new OneForOneStrategy(10, Duration.create("1 minute"),DeciderBuilder.match(RuntimeException.class, e -> restart())//.matchAny(o -> escalate()).build());}

WaiterActor:

CustomerActor:

HANDS ON - SupervisorStrategy

Page 29: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Projeto Subway

✘ FIFO – Fila Blocking✘ Exception - Cliente Desmaiou✘ Load – Garçom Sobrecarregado✘ Pergunta do Milhão

Page 30: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Router

Hosts

Actor

“NewSandwich”

Waiter

Router

Waiter

Actor

Waiter

Actor

Page 31: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Implementações Router

o RoundRobinPoolo RandomPoolo SmallestMailBoxPoolo ConsistentHashingPool

Page 32: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

HostessActor:

private ActorRef waiters = getContext().actorOf(new RoundRobinPool(2).props(Props.create(WaiterActor.class)), "waiter");

@Overridepublic Receive createReceive() {

return receiveBuilder().match(NewSandwich.class, s -> {

waiters.tell(s, getSelf());}).build();

}

HANDS ON - Router

Page 33: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Projeto Subway

✘ FIFO – Fila Blocking✘ Exception - Cliente Desmaiou✘ Load – Garçom Sobrecarregado✘ Pergunta do Milhão

Page 34: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Perguntas hipsters na TI

2004 - aplicação Web ou Desktop?2008 - você usa Ajax?2012 - você desenvolve Mobile?2016 – tem quantos Microservices?2017 – usa NoSQL?2018 - como você escala a Aplicação?

Page 35: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Scaling

Hosts

Actor

Waiter

Actor

Waiter

Actor

MQ

MQ

Page 36: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Clustering

Hosts

Actor

“NewSandwich”

Waiter

Router

Waiter

Actor

Waiter

Actor

Customer

Actor

Customer

Actor

JVM Hosts

JVM Waiter

JVM Waiter

Page 37: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

int totalInstances = 2;int maxInstancesPerNode = 1;boolean allowLocalRoutees = false;Set<String> useRoles = new HashSet<>(Arrays.asList("compute"));ActorRef waiters = getContext().actorOf(new ClusterRouterPool(new RoundRobinPool(2), newClusterRouterPoolSettings(totalInstances,maxInstancesPerNode, allowLocalRoutees, useRoles)).props(Props.create(WaiterActor.class)),"waiterRouter");

HANDS ON - Cluster

Page 38: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Projeto Subway

✘ FIFO – Fila Blocking✘ Exception - Cliente Desmaiou✘ Load – Garçom Sobrecarregado✘ Pergunta do Milhão

Page 39: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Recapitulando

✘ Comunicação -> Non Blocking e Thread Safe

✘ Supervisor -> Tratativa de exception em threads diferentes

✘ Router -> Load Balancing do lado do cliente

✘ Cluster -> Todos os ítens acima de forma transparente em um ambiente distribuído

Page 40: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Actors são baseados em comportamento

Carga

ActorCarga

ActorCarga

Actor

CTeActor/Cnpj1

CTeActor/CnpjX

NFeActor/Cnpj1

Carga

ActorCarga

ActorEmail

Actor

Cte + Cnpj1

Cte + CnpjX

Nfe + Cnpj1

Request

Email

Email

Email

Cte + Cnpj1

Email

Page 41: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

“A good architecture will allow a system to be born as

a monolith, deployed in a single file, but then to grow

into a set of independently… microservices”

by Uncle Bob – Clean Architecture

Page 42: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Agradecimento

Obrigado Akka por me ensinar a arquitetar sistemas baseado em comportamento.

Page 43: Akka: Arquitetura Orientada a Atores...2018/12/14  · Ano 2009 –Akka Jonas Bonér é um Java Champion. Ee criou o Aa em Java inspirado no conceito de ACTOR e da linguagem Erlang

Muito Obrigado!

@fmodos