Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

448 views

Published on

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.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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?!

×