Scala na Carjump
Como a [Carjump] usa Scala para 
revolucionar o mercado de 
compartilhamento de carros
Paulo "JCranky" Si...
JCranky
Dev Scala, com passado Java
­> Berlin
­> Carjump
JCranky
Um dos fundadores dos 
Scaladores
­> scaladores.com.br
­> continua vivo
   ­> (Felipe e Onilton)
JCranky
scaladores.com.br
groups.google.com/group/scalado
res
http://scaladores.herokuapp.com
/
Típica Startup
Fundada há poucos anos, 
comprada pelos sócios atuais
Passou por rodadas de 
investimentos
Atua no ramo de car­sharing
Mas que diabos é Car­Sharing?
[Compartilhamento de Carros]
ou
Forma moderna de [Aluguel] de 
carros
[MODERNA]
[Stationary]
ou
[Fixa]
[REALMENTE moderna]
­> Estacione em qualquer lugar
(dentro de uma área pré­
definida)
Carjump: O que?
Agregação de vários provedores 
em um único App.
Ao ponto: Backend!
­> Scala
­> Startup e desenvolvedor 
único...
­> ... para tudo, inclusive 
front­end
Conceito original
"Ache o carro e pule para a App 
do provedor"
Arquitetura e Componentes
­> Scala Futures
­> Java Futures (passado! o/)
­> Akka
­> Mongo
­> Scalatra
­> Heroku
Arquitetura
if (password < 0) login() 
Scala Futures
cities.flatMap { city =>
  val carsF = Future(
    new CityWorker(city).call)
  Try(Await.result(
    carsF,...
val system =
  ActorSystem("Fetchers")
var attempts = 0
while (
  system == null &&
  attempts < 5) {
  // whatever ...
} 
Akka - CarFetcher
override def receive: Receive = {
  case FETCH =>
    val cars = safeFetch()
    context.system.schedule...
Scalatra
get("/") {
  new AsyncResult {
    val is =
      Future {
        // 56734 lines
      }
  }
} 
Novo conceito:
[One App to Rule 'em All]
Evolution
[Mini­Services]
­> uso mais intenso do Scalatra
­> APIs RESTful
­> DBs individuais
Async
Quase tudo Async
­> Scalatra nos queimou!
Future composition
for {
  user <­
    isEmailValidated(user)
  sepaDetails <­
    paymentService
      .getSepa(user.code...
usando um login token
val findQ = tokensTable
  .filter(_.userId === userId)
  .filter(_.sentAt.isDefined)
  .filter(_.tok...
Mas nada aconteceu!
IO Monad, declarando o que vai 
ser feito no BD
um pouco mais de lógica
val q = findQ.result
  .flatMap { tokens =>
  // verify if token is valid
} 
agora vai!
db.run(q.transactionally) 
Scalatra: nossa triste 
realidade.
ScentryStrategy
def authenticate()(
  implicit request: HttpServletRequest,
  response: HttpServletResponse
): Option[Http...
ScentryStrategy
def authenticate()(...) {
  val f = validate(request)
  Await.result(f, 5 second)
} 
Heroku
Fator limitante
Arquitetura engessada
E finalmente...
... nova arquitetura
Nova arquitetura
Grandes mudanças
Parcialmente no Heroku,
parcialmente no AWS EC2
­> Akka cluster
­> (pelo menos) Um provedor por 
nó
­> EC2 micro para cada 
máquina / nó
cluster config
// other akka remote config
akka.cluster {
  seed­nodes = [...]
  roles = ["provider", "drivenow"]
}
find cluster node
(simplificado)
val cluster = 
Cluster(context.system)
cluster.state.members
  .filter(m =>
    m.roles.c...
Secret sauce
Ansible!
Provisionamento mega simples de 
todos os nós no EC2.
(ou seria inviável migrar para 
o EC2)
Install Java
­ apt_repository:
    repo=ppa:webupd8team/java
    update_cache=yes
­ apt:
    name=oracle­java8­installer
 ...
Automatizando tudo!
­ Install Java, Scala, etc
­ Build do projetos
­ Setup Docker
­ etc
Obrigado!
Perguntas?!
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Como a Carjump usa Scala para revolucionar o mercado de Compartilhamento de carros
Próximos SlideShares
Carregando em…5
×

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

365 visualizações

Publicada em

Com Akka, Slick, e muito Future e Future composition, Carjump agrega dados de múltiplos provedores de carros para compartilhamento e serve para seus usuários, incluindo grandes provedores como Car2Go e DriveNow. Vamos ver o que está por traz deste sistema.

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
365
No SlideShare
0
A partir de incorporações
0
Número de incorporações
9
Ações
Compartilhamentos
0
Downloads
16
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

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

  1. 1. Scala na Carjump Como a [Carjump] usa Scala para  revolucionar o mercado de  compartilhamento de carros Paulo "JCranky" Siqueira Senior Scala Dev @ Carjump
  2. 2. JCranky Dev Scala, com passado Java ­> Berlin ­> Carjump
  3. 3. JCranky Um dos fundadores dos  Scaladores ­> scaladores.com.br ­> continua vivo    ­> (Felipe e Onilton)
  4. 4. JCranky scaladores.com.br groups.google.com/group/scalado res http://scaladores.herokuapp.com /
  5. 5. Típica Startup Fundada há poucos anos,  comprada pelos sócios atuais
  6. 6. Passou por rodadas de  investimentos Atua no ramo de car­sharing
  7. 7. Mas que diabos é Car­Sharing?
  8. 8. [Compartilhamento de Carros] ou Forma moderna de [Aluguel] de  carros
  9. 9. [MODERNA]
  10. 10. [Stationary] ou [Fixa]
  11. 11. [REALMENTE moderna] ­> Estacione em qualquer lugar (dentro de uma área pré­ definida)
  12. 12. Carjump: O que? Agregação de vários provedores  em um único App.
  13. 13. Ao ponto: Backend! ­> Scala ­> Startup e desenvolvedor  único... ­> ... para tudo, inclusive  front­end
  14. 14. Conceito original "Ache o carro e pule para a App  do provedor"
  15. 15. Arquitetura e Componentes ­> Scala Futures ­> Java Futures (passado! o/) ­> Akka ­> Mongo ­> Scalatra ­> Heroku
  16. 16. Arquitetura
  17. 17. if (password < 0) login() 
  18. 18. Scala Futures cities.flatMap { city =>   val carsF = Future(     new CityWorker(city).call)   Try(Await.result(     carsF, timeout)) match {     // handle result   } } 
  19. 19. val system =   ActorSystem("Fetchers") var attempts = 0 while (   system == null &&   attempts < 5) {   // whatever ... } 
  20. 20. Akka - CarFetcher override def receive: Receive = {   case FETCH =>     val cars = safeFetch()     context.system.scheduler       .scheduleOnce(pollPeriod,                 self, FETCH)     persist(cars) } 
  21. 21. Scalatra get("/") {   new AsyncResult {     val is =       Future {         // 56734 lines       }   } } 
  22. 22. Novo conceito: [One App to Rule 'em All]
  23. 23. Evolution [Mini­Services] ­> uso mais intenso do Scalatra ­> APIs RESTful ­> DBs individuais
  24. 24. Async Quase tudo Async ­> Scalatra nos queimou!
  25. 25. Future composition for {   user <­     isEmailValidated(user)   sepaDetails <­     paymentService       .getSepa(user.code)   remote <­    remoteCreditCheck(      user, sepaDetails) } yield remote 
  26. 26. usando um login token val findQ = tokensTable   .filter(_.userId === userId)   .filter(_.sentAt.isDefined)   .filter(_.token.isDefined)   .filter(_.usedAt.isEmpty)   .filter(_.expireAt.isDefined) 
  27. 27. Mas nada aconteceu! IO Monad, declarando o que vai  ser feito no BD
  28. 28. um pouco mais de lógica val q = findQ.result   .flatMap { tokens =>   // verify if token is valid } 
  29. 29. agora vai! db.run(q.transactionally) 
  30. 30. Scalatra: nossa triste  realidade.
  31. 31. ScentryStrategy def authenticate()(   implicit request: HttpServletRequest,   response: HttpServletResponse ): Option[HttpUser] 
  32. 32. ScentryStrategy def authenticate()(...) {   val f = validate(request)   Await.result(f, 5 second) } 
  33. 33. Heroku Fator limitante Arquitetura engessada
  34. 34. E finalmente... ... nova arquitetura
  35. 35. Nova arquitetura Grandes mudanças Parcialmente no Heroku, parcialmente no AWS EC2
  36. 36. ­> Akka cluster ­> (pelo menos) Um provedor por  nó ­> EC2 micro para cada  máquina / nó
  37. 37. cluster config // other akka remote config akka.cluster {   seed­nodes = [...]   roles = ["provider", "drivenow"] }
  38. 38. 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)) 
  39. 39. Secret sauce Ansible! Provisionamento mega simples de  todos os nós no EC2. (ou seria inviável migrar para  o EC2)
  40. 40. Install Java ­ apt_repository:     repo=ppa:webupd8team/java     update_cache=yes ­ apt:     name=oracle­java8­installer     state=present (omitido accept license)
  41. 41. Automatizando tudo! ­ Install Java, Scala, etc ­ Build do projetos ­ Setup Docker ­ etc
  42. 42. Obrigado!
  43. 43. Perguntas?!

×