Colaboração em tempo real
com Clojure
QCon - São Paulo, 2016
Leonardo Borges @leonardo_borges www.atlassian.com
Sobre
‣ Líder de equipe / Desenvolvedor Clojure na Atlassian
‣ Fundador do Grupo de Usuários Clojure de Sydney
‣ Autor do livro Clojure Reactive
Colaboração
co.la.bo.ra.ção1 Ato de colaborar; cooperação; ajuda. 2 Trabalho feito pelos colaboradores. 3 Conjunto dos colaboradores. 4 Inform Reunião de duas ou mais pessoas
Operational Transformation 101
lá QQCon São Paulo!
user server
Operational Transformation 101
user server
(ins 0 “O”)
lá QQCon São Paulo! lá QQCon São Paulo!
Operational Transformation 101
user server
(del 3) (ins 0 “O”)
lá QQCon São Paulo! lá 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
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!
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
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!
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
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
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
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
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
Vert.x
-SockJS
-Clustering
Vert.x
-SockJS
-Clustering
Vert.x
-SockJS
-Clustering
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
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
-Usar Akka desde Clojure é tedioso -Clustering (in Pulsar)
-JVM only -Fairness
user web server state entity
Fairness
user user
web server entity state entity
Fairness
user
user
user
Sumário das opções
Entrega Ordem Fairness End-to-End
Vert.x
Akka / Pulsar
Distributed core.async (custom code)
Multiplexer
Multiplexer
Multiplexer endpoint duplex
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 server state Multiplex
web server state Multiplex
web server state Multiplex
Multiplexer
user load
balancer
web server state Multiplex
web server state Multiplex
web server state Multiplex
Multiplexer
user load
balancer
web server state Multiplex
web server state Multiplex
web server state Multiplex
Multiplexer
user load
balancer
web server state Multiplex
web server state Multiplex
web server state Multiplex
Multiplexer
user load
balancer
web server state Multiplex
web server state Multiplex
web server state Multiplex
Multiplexer
user load
balancer
web server state Multiplex
web server state 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)
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
Aleph cluster + multiplexer
-Distributed, end-to-end core.async channels -Message delivery and ordering guarantees -Fault tolerance
-Fairness
Isso parece bastante trabalho.
Por que não usar Erlang/Akka
Stack
OT
diff, materialise, etc…Networking
multiplexer,Stack
OT
diff, materialise, etc…Networking
multiplexer,aleph, hazelcast, etc…
Clojurescript
-Compila código Clojure para Javascript
(ns hello.core
#?(:clj (:import (org.joda.time DateTime)))) (defn now [] #?(:clj (DateTime/now) :cljs (js/Date.now))) (defn tomorrow [] (+ (now) 86400000))
Clojurescript
Cljc
(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))
Clojurescript
Clj
Cljs
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))]
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
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 algorithmConsistent Hashing Ring CRDTs in Riak akka.io bit.ly/actors-pulsar vertx.io/ aleph.io/ bit.ly/jupiterOT bit.ly/HashingRing bit.ly/CRDTRiak