colaboração em tempo real com clojure · pdf filecluster? para onde encaminhamos...
Post on 22-Mar-2018
219 Views
Preview:
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