• Nenhum resultado encontrado

Akka: Arquitetura Orientada a Atores

N/A
N/A
Protected

Academic year: 2021

Share "Akka: Arquitetura Orientada a Atores"

Copied!
43
0
0

Texto

(1)

Akka: Arquitetura

Orientada a Atores

Fabiano Guizellini Modos

Arquiteto de Software - HBSIS @fmodos

(2)
(3)

Agenda

Conceito de Atores

➢ Non Blocking / Blocking ➢ Comunicação Assíncrona ➢ Supervisor

RouterCluster

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

(4)

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/

(5)

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

(6)

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

(7)

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

(8)

Ano 2009 – Akka

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

(9)

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

(10)

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

ACTOR é um agente com as seguinte responsabilidades: ➢ Processing

➢ Storage

➢ Communication

(11)

Hands On

(12)

Projeto Subway

✘ FIFO – Fila

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

(13)

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));

(14)
(15)
(16)

FIFO – Blocking

FOFO – Faster Order Faster Out

Non Blocking

(17)

Comunicação

Waiter Customer nextOrder() Waiter Actor “NextOrder” Customer Actor Waiter Actor “MyOrder” Customer Actor

Blocking Non Blocking

(18)

Comunicação

(19)

FOFO – Faster Order Faster Out

“MyOrder” Customer Actor Waiter Actor “NextOrder” Customer Actor “FINISH” Customer Actor

(20)
(21)

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

(22)

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”}

(23)

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

(24)

HANDS ON - Comunicação entre Atores

public class CustomerActor extends AbstractActor { @Override

public Receive createReceive() { return receiveBuilder().//

matchEquals(EnumOrder.NEXT_ORDER, order -> {

doOrder(); }).build();

}

public class WaiterActor extends AbstractActor { @Override

public Receive createReceive() { return receiveBuilder()//

.match(Order.class, order -> {

totalOrders++;

log("Processando pedido "+order.getSalad());

(25)

Projeto Subway

✘ FIFO – Fila Blocking

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

(26)

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?”) }

(27)

Actor cria e supervisiona outros Actor

Waiter Actor newActor() Actor Context “NewCustomer” watch(actor) “NextOrder” Customer Actor Error Exception

(28)

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

}

@Override

public SupervisorStrategy supervisorStrategy() {

return new OneForOneStrategy(10, Duration.create("1 minute"),

DeciderBuilder.match(RuntimeException.class, e -> restart())//

.matchAny(o -> escalate()).build()); }

WaiterActor:

CustomerActor:

(29)

Projeto Subway

✘ FIFO – Fila Blocking

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

(30)

Router

Hosts Actor “NewSandwich” Waiter Router Waiter Actor Waiter Actor

(31)

Implementações Router

o RoundRobinPool o RandomPool

o SmallestMailBoxPool o ConsistentHashingPool

(32)

HostessActor:

private ActorRef waiters = getContext().actorOf(

new RoundRobinPool(2).props(Props.create(WaiterActor.class)) , "waiter");

@Override

public Receive createReceive() { return receiveBuilder()

.match(NewSandwich.class, s -> {

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

}

(33)

Projeto Subway

✘ FIFO – Fila Blocking

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

(34)

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?

(35)

Scaling

Hosts Actor Waiter Actor Waiter Actor MQ MQ

(36)

Clustering

Hosts Actor “NewSandwich” Waiter Router Waiter Actor Waiter Actor Customer Actor Customer Actor JVM Hosts JVM Waiter JVM Waiter

(37)

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), new ClusterRouterPoolSettings(totalInstances,

maxInstancesPerNode, allowLocalRoutees,

useRoles)).props(Props.create(WaiterActor.class)), "waiterRouter");

(38)

Projeto Subway

✘ FIFO – Fila Blocking

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

(39)

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

(40)

Actors são baseados em comportamento

Carga Actor Carga Actor Carga Actor CTeActor/Cnpj1 CTeActor/CnpjX NFeActor/Cnpj1 Carga Actor Carga Actor Email Actor Cte + Cnpj1 Cte + CnpjX Nfe + Cnpj1 Request Email Email Email Cte + Cnpj1 Email

(41)

“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

(42)

Agradecimento

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

(43)

Muito Obrigado!

@fmodos

Referências

Documentos relacionados

A matéria orgânica presente na maioria das amostras da Formação Vúzi é classificada como querogénio de tipo IV com baixos valores de HI, indicando que esta unidade

Além disso, o aumento das cadências de pedalada mostra-se determinante para a elevação tanto dos valores de FC quanto de PSE, sendo que a cadência preferida pelos ciclistas, em

Assim, esta pesquisa almejava analisar a mandiocultura como cadeia “cadeia base”, no intuito de evidenciar o papel histórico, atual e futuro da mandioca no quilombo Pau

“Não existe reinserção social para o recluso (…) não tenho mais nada para dizer (…) se houves- se, a juíza não me negava a precária, eu aqui dentro tenho um trabalho, um

We use weekly real returns for Ibovespa (the stock market index), the Brazil 5-year CDS, the Bloomberg Ibovespa target for the next 12 months, Ibovespa earn- ings per share

E-Civitas - Revista Científica dos Cursos de Direito e Relações Internacionais do UNIBH - Belo Horizonte, volume VII, número 2, dezembro de 14 - ISSN: 1984-2716.. Disponível

Quanto aos factores geradores de mudança do papel dos Controllers, especificamente e através das respostas aos inquéritos, concluímos que as empresas do Reino Unido atribuem