69
Colaboração em tempo real com Clojure QCon - São Paulo, 2016 Leonardo Borges @leonardo_borges www.atlassian.com www.leonardoborges.com

Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Embed Size (px)

Citation preview

Page 1: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Colaboração em tempo real com Clojure

QCon - São Paulo, 2016

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

Page 2: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 3: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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.

Page 4: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Colaboração em tempo real

Page 5: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Colaboração em tempo real

Page 6: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Operational Transformation 101

lá QQCon São Paulo!

user server

lá QQCon São Paulo!

Page 7: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Operational Transformation 101

user server

(ins 0 “O”)

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

Olá QQCon São Paulo!

Page 8: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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!

Page 9: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 10: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 11: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 12: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 13: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

user

user

user

user

user

web server

state

Page 14: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

user

user

user

user

user

web server

state

user

user user

user

web server

web server

load balancer

Page 15: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

user

user

user

user

user

DB

user

user user

user

web server

load balancer

state web server state web server state

Page 16: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Para onde encaminhamos as requisições?

Page 17: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Para onde encaminhamos as requisições?

Como os servidores falam um com o outro?

Page 18: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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?

Page 19: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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?

Page 20: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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?

Page 21: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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?

Page 22: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Vert.x

Page 23: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Vert.x

-SockJS -Clustering -Distributed Event Bus

Page 24: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Vert.x

-SockJS -Clustering -Distributed Event Bus

Page 25: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Vert.x

-SockJS -Clustering -Distributed Event Bus

Page 26: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Actors

Page 27: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Actors

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

Page 28: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Actors

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

Page 29: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Actors

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

Page 30: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Akka and Pulsar

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

Page 31: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Akka and Pulsar (Quasar)

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

Page 32: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Akka and Pulsar (Quasar)

Page 33: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Akka and Pulsar (Quasar)

Page 34: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

user

web server state entity

Fairness

user

Page 35: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

useruser

web server stateentity entity

Fairness

user

user

useruser

Page 36: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Fairness

Page 37: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Vert.x

Akka / Pulsar

Distributed core.async

(custom code)

Page 38: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Certo. Então o que desenvolvemos?

Page 39: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

Page 40: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

Multiplexer

Page 41: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

Multiplexer

endpoint duplex channel

Page 42: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

Multiplexer

endpoint

web server state

duplex channel

duplex channel

Page 43: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

Multiplexer

endpoint

endpoint

web server state

web server state

duplex channel

duplex channel

duplex channel

duplex channel

Page 44: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

web server state

Multiplexer

Multiplexer

endpoint

endpoint

web server state

web server state

duplex channel

duplex channel

duplex channel

duplex channel

Page 45: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Page 46: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Page 47: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Page 48: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Page 49: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

web serverstate

Multiplex

Page 50: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Multiplexer

user load balancer

web serverstate

Multiplex

web serverstate

Multiplex

Page 51: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Aleph cluster

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

Page 52: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Aleph cluster

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

Page 53: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Aleph cluster

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

Page 54: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Aleph cluster + multiplexer

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

Page 55: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Aleph cluster + multiplexer

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

Page 56: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

mesmo?

Page 57: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Stack

OT diff, materialise,

etc…

Networking multiplexer,

aleph, hazelcast, etc…

Page 58: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Stack

OT diff, materialise,

etc…

Networking multiplexer,

aleph, hazelcast, etc…

Browser Server

Page 59: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Clojurescript

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

Page 60: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

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

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

ClojurescriptCljc

Page 61: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

(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

Page 62: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Async

Page 63: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Async

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

Page 64: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 65: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Programação funcional

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

Page 66: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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)

Page 67: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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?

Page 68: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

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

Page 69: Colaboração em tempo real com Clojure · PDF filecluster? Para onde encaminhamos ... -Hazelcast for group membership. Aleph cluster ... Vert.x Aleph

Obrigado!Perguntas?

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