colaboração em tempo real com clojure · pdf filecluster? para onde encaminhamos...

Post on 22-Mar-2018

219 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Colaboração em tempo real com Clojure

QCon - São Paulo, 2016

Leonardo Borges @leonardo_borges www.atlassian.com www.leonardoborges.com

Sobre‣ Líder de equipe / Desenvolvedor Clojure na Atlassian ‣ Fundador do Grupo de Usuários Clojure de Sydney ‣ Autor do livro Clojure Reactive Programming

Colaboraçãoco.la.bo.ra.ção 1 Ato de colaborar; cooperação; ajuda. 2 Trabalho feito pelos colaboradores. 3 Conjunto dos colaboradores. 4 Inform Reunião de duas ou mais pessoas

que trabalham juntas para produzir ou utilizar uma aplicação multimídia.

Colaboração em tempo real

Colaboração em tempo real

Operational Transformation 101

lá QQCon São Paulo!

user server

lá QQCon São Paulo!

Operational Transformation 101

user server

(ins 0 “O”)

lá QQCon São Paulo! lá QQCon São Paulo!

Olá QQCon São Paulo!

Operational Transformation 101

user server

(del 3)(ins 0 “O”)

lá QQCon São Paulo! lá QQCon São Paulo!

Olá QQCon São Paulo! lá QCon São Paulo!

Operational Transformation 101

user server

(del 3)(ins 0 “O”)

lá QQCon São Paulo! lá QQCon São Paulo!

Olá QQCon São Paulo! lá QCon São Paulo!

(del 3) (ins 0 “O”)

Operational Transformation 101

user server

OláQQCon São Paulo! Olá QCon São Paulo!

(del 3)(ins 0 “O”)

lá QQCon São Paulo! lá QQCon São Paulo!

Olá QQCon São Paulo! lá QCon São Paulo!

(del 3) (ins 0 “O”)

Operational Transformation 101

user server

(del 3)(ins 0 “O”)

lá QQCon São Paulo! lá QQCon São Paulo!

Olá QQCon São Paulo! lá QCon São Paulo!

(del 4) (ins 0 “O”)

Operational Transformation 101

user server

Olá QCon São Paulo! Olá QCon São Paulo!

(del 3)(ins 0 “O”)

lá QQCon São Paulo! lá QQCon São Paulo!

Olá QQCon São Paulo! lá QCon São Paulo!

(del 4) (ins 0 “O”)

user

user

user

user

user

web server

state

user

user

user

user

user

web server

state

user

user user

user

web server

web server

load balancer

user

user

user

user

user

DB

user

user user

user

web server

load balancer

state web server state web server state

Para onde encaminhamos as requisições?

Para onde encaminhamos as requisições?

Como os servidores falam um com o outro?

Para onde encaminhamos as requisições?

Como os servidores falam um com o outro?

O que acontece quando um dos servidores cai ou entra no

cluster?

Para onde encaminhamos as requisições?

Como os servidores falam um com o outro?

Que tipo de garantias de entrega são necessárias?

O que acontece quando um dos servidores cai ou entra no

cluster?

Para onde encaminhamos as requisições?

Que tipo de garantias de ordenação são necessárias?

Como os servidores falam um com o outro?

Que tipo de garantias de entrega são necessárias?

O que acontece quando um dos servidores cai ou entra no

cluster?

Para onde encaminhamos as requisições?

Que tipo de garantias de ordenação são necessárias?

Como os servidores falam um com o outro?

Que tipo de garantias de entrega são necessárias?

O que acontece quando um dos servidores cai ou entra no

cluster?

Vert.x

Vert.x

-SockJS -Clustering -Distributed Event Bus

Vert.x

-SockJS -Clustering -Distributed Event Bus

Vert.x

-SockJS -Clustering -Distributed Event Bus

Actors

Actors

-State -Location Transparency -“At least once” delivery semantics -Ordering guarantees

Actors

-State -Location Transparency -“At least once” delivery semantics -Ordering guarantees

Actors

-State -Location Transparency -Garantias de entrega “At least once” e garantia de ordem

Akka and Pulsar

-Usar Akka desde Clojure é tedioso -Clustering (in Pulsar) -JVM only -Fairness

Akka and Pulsar (Quasar)

-Usar Akka desde Clojure é tedioso -Clustering (in Pulsar) -JVM only -Fairness

-Usar Akka desde Clojure é tedioso -Clustering (in Pulsar) -JVM only -Fairness

Akka and Pulsar (Quasar)

-Usar Akka desde Clojure é tedioso -Clustering (in Pulsar) -JVM only -Fairness

Akka and Pulsar (Quasar)

user

web server state entity

Fairness

user

useruser

web server stateentity entity

Fairness

user

user

useruser

Fairness

Sumário das opçõesEntrega Ordem Fairness End-to-End

Vert.x

Akka / Pulsar

Distributed core.async

(custom code)

Certo. Então o que desenvolvemos?

Multiplexer

Multiplexer

Multiplexer

Multiplexer

Multiplexer

endpoint duplex channel

Multiplexer

Multiplexer

endpoint

web server state

duplex channel

duplex channel

Multiplexer

Multiplexer

endpoint

endpoint

web server state

web server state

duplex channel

duplex channel

duplex channel

duplex channel

web server state

Multiplexer

Multiplexer

endpoint

endpoint

web server state

web server state

duplex channel

duplex channel

duplex channel

duplex channel

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

Aleph cluster

-Client and Server network programming -Built on Netty and therefore asynchronous -Hazelcast for group membership

Aleph cluster

-Client and Server network programming -Desenvolvido com Netty (async #FTW) -Hazelcast for group membership

Aleph cluster

-Client and Server network programming -Desenvolvido com Netty (async #FTW) -Hazelcast for group membership

Aleph cluster + multiplexer

-Distributed, end-to-end core.async channels -Message delivery and ordering guarantees -Fault tolerance -Fairness -Backpressure

Aleph cluster + multiplexer

-Distributed, end-to-end core.async channels -Message delivery and ordering guarantees -Fault tolerance -Fairness -Backpressure

Isso parece bastante trabalho. Por que não usar Erlang/Akka

mesmo?

Stack

OT diff, materialise,

etc…

Networking multiplexer,

aleph, hazelcast, etc…

Stack

OT diff, materialise,

etc…

Networking multiplexer,

aleph, hazelcast, etc…

Browser Server

Clojurescript

-Compila código Clojure para Javascript -Permite testar as funções apenas uma vez

(ns hello.core #?(:clj (:import (org.joda.time DateTime))))

(defn now [] #?(:clj (DateTime/now) :cljs (js/Date.now)))

(defn tomorrow [] (+ (now) 86400000))

ClojurescriptCljc

(ns hello.core (:import (org.joda.time DateTime)))

(defn now [] (DateTime/now))

(defn tomorrow [] (+ (now) 86400000))

(ns hello.core)

(defn now [] (js/Date.now))

(defn tomorrow [] (+ (now) 86400000))

ClojurescriptClj Cljs

Async

Async

-core.async implementa CSP (Communicating Sequential Processes) -Funciona tanto na JVM como no browser

core.async(defn fetch-person [id] (go (to-person (<! (fetch-resource url)))))

(defn fetch-friends [id] (go (map to-person (<! (fetch-resource url)))))

(defn aggregate-person [id] (go (let [person (<! (fetch-person id)) friends (<! (fetch-friends id))] (merge person {:friends friends}))))

Programação funcional

-Funções puras -First-class e higher-order functions -Programação declarativa

Clojure

-Imutabilidade por padrão -Polimorfismo via records, protocols e multimethods -Extensibilidade via macros -Ciclo de desenvolvimento extremamente curto dada a integração avançada com o REPL (Read Eval Print Loop)

Conclusão

-Clojurescript está mais que pronto para produção -Programação funcional e Clojure oferecem claros benefícios para o desenvolvimento de software concorrente

-core.async é uma ferramenta poderosa e flexível para programação assíncrona

-por que não dar Clojure e programação funcional uma chance no seu próximo projeto?

References

Akka Pulsar Vert.x Aleph Jupiter OT algorithm Consistent Hashing Ring CRDTs in Riak

akka.io bit.ly/actors-pulsar vertx.io/ aleph.io/ bit.ly/jupiterOT bit.ly/HashingRing bit.ly/CRDTRiak

Obrigado!Perguntas?

Leonardo Borges @leonardo_borges www.atlassian.com www.leonardoborges.com

top related