62
Scala na Carjump Como a [Carjump] usa Scala para revolucionar o mercado de compartilhamento de carros Paulo "JCranky" Siqueira Senior Scala Dev @ Carjump

Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Embed Size (px)

Citation preview

Page 1: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Scala na Carjump

Como a [Carjump] usa Scala para revolucionar o mercado de compartilhamento de carros

Paulo "JCranky" SiqueiraSenior Scala Dev @ Carjump

Page 2: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

JCranky

Dev Scala, com passado Java

­> Berlin­> Carjump

Page 3: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

JCranky

Um dos fundadores dos Scaladores

­> scaladores.com.br

­> continua vivo   ­> (Felipe e Onilton)

Page 4: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

JCranky

scaladores.com.br

groups.google.com/group/scaladores

http://scaladores.herokuapp.com/

Page 5: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 6: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 7: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 8: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Típica Startup

Fundada há poucos anos, comprada pelos sócios atuais

Page 9: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Passou por rodadas de investimentos

Atua no ramo de car­sharing

Page 10: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 11: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Mas que diabos é Car­Sharing?

Page 12: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

[Compartilhamento de Carros]

ou

Forma moderna de [Aluguel] de carros

Page 13: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 14: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

[MODERNA]

Page 15: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 16: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

[Stationary]

ou

[Fixa]

Page 17: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

[REALMENTE moderna]

­> Estacione em qualquer lugar

(dentro de uma área pré­definida)

Page 18: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 19: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 20: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 21: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 22: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 23: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Carjump: O que?

Agregação de vários provedores em um único App.

Page 24: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Ao ponto: Backend!

­> Scala­> Startup e desenvolvedor único...­> ... para tudo, inclusive front­end

Page 25: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 26: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Conceito original

"Ache o carro e pule para a App do provedor"

Page 27: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Arquitetura e Componentes

­> Scala Futures­> Java Futures (passado! \o/)­> Akka­> Mongo­> Scalatra­> Heroku

Page 28: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Arquitetura

Page 29: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 30: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 31: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

if (password < 0) login() 

Page 32: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Scala Futures

cities.flatMap { city =>  val carsF = Future(    new CityWorker(city).call)

  Try(Await.result(    carsF, timeout)) match {

    // handle result  }} 

Page 33: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 34: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

val system =  ActorSystem("Fetchers")var attempts = 0

while (  system == null &&  attempts < 5) {

  // whatever ...} 

Page 35: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Akka - CarFetcher

override def receive: Receive = {  case FETCH =>    val cars = safeFetch()

    context.system.scheduler      .scheduleOnce(pollPeriod,                self, FETCH)

    persist(cars)} 

Page 36: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Scalatra

get("/") {  new AsyncResult {    val is =      Future {        // 56734 lines      }  }} 

Page 37: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Novo conceito:

[One App to Rule 'em All]

Page 38: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Evolution

[Mini­Services]

­> uso mais intenso do Scalatra

­> APIs RESTful­> DBs individuais

Page 39: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 40: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Async

Quase tudo Async

­> Scalatra nos queimou!

Page 41: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Future composition

for {  user <­    isEmailValidated(user)  sepaDetails <­    paymentService      .getSepa(user.code)  remote <­   remoteCreditCheck(     user, sepaDetails)} yield remote 

Page 42: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 43: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

usando um login token

val findQ = tokensTable  .filter(_.userId === userId)  .filter(_.sentAt.isDefined)  .filter(_.token.isDefined)  .filter(_.usedAt.isEmpty)  .filter(_.expireAt.isDefined) 

Page 44: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Mas nada aconteceu!

IO Monad, declarando o que vai ser feito no BD

Page 45: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

um pouco mais de lógica

val q = findQ.result  .flatMap { tokens =>

  // verify if token is valid} 

Page 46: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

agora vai!

db.run(q.transactionally) 

Page 47: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Scalatra: nossa triste realidade.

Page 48: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

ScentryStrategy

def authenticate()(  implicit request: HttpServletRequest,  response: HttpServletResponse): Option[HttpUser] 

Page 49: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

ScentryStrategy

def authenticate()(...) {  val f = validate(request)  Await.result(f, 5 second)} 

Page 50: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Heroku

Fator limitante

Arquitetura engessada

Page 51: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

E finalmente...

... nova arquitetura

Page 52: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Nova arquitetura

Grandes mudanças

Parcialmente no Heroku,parcialmente no AWS EC2

Page 53: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

­> Akka cluster

­> (pelo menos) Um provedor por nó

­> EC2 micro para cada máquina / nó

Page 54: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Page 55: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

cluster config

// other akka remote config

akka.cluster {  seed­nodes = [...]  roles = ["provider", "drivenow"]}

Page 56: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

find cluster node

(simplificado)

val cluster = Cluster(context.system)

cluster.state.members  .filter(m =>    m.roles.contains(key) &&    m.status == Status.Up)  .map(_.alongside(_.address)) 

Page 57: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Secret sauce

Ansible!

Provisionamento mega simples de todos os nós no EC2.(ou seria inviável migrar para o EC2)

Page 58: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Install Java

­ apt_repository:    repo=ppa:webupd8team/java    update_cache=yes

­ apt:    name=oracle­java8­installer    state=present

(omitido accept license)

Page 59: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Automatizando tudo!

­ Install Java, Scala, etc­ Build do projetos­ Setup Docker­ etc

Page 60: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Obrigado!

Page 61: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros

Perguntas?!

Page 62: Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros