SlideShare uma empresa Scribd logo
1 de 83
@flaviowbrasil 
Aficionado por open 
source 
Expert em 
escalabilidade 
Mestre Jedi Scala 
Prefere + uma sessão 
de profiling do que 
uma tarde na praia
@herval 
Fundador de Startups 
Dois Easter Eggs 
publicados 
Padawan Scala 
Tem um cachorro com 
nome de sorvete
A Nuvem de Som 
12 horas de novo conteúdo/ minuto 
350 milhões de usuários/mês 
12 milhões de horas ouvidas/mês 
1 usuário no espaço
Era uma vez uma startup... 
Uma base de código 
Um punhado de construtores
Um milhão de features 
Base de código gigante
Move fast 
and break 
things
Quebrando os muros
Muitos vilarejos, muitos idiomas 
Microserviços → "tudo é http" 
Culturas de código 
Infraestrutura 
Monitoramento 
"production ready"
A Torre de Babel 
Mais pessoas → mais linguagens 
N+1 linguagens 
N = número de linguagens de programação existentes
Move fast 
without breaking everything, bitte.
Java 
Serviços de base 
Bibliotecas compartilhadas 
Monitoria 
Autenticação/segurança 
(cross-cutting concerns) 
INFRAESTRUTURA BÁSICA
JVM-Kit
Estudo de caso 
O novo Stream
Reescrever pra quê? 
Novas features 
Latência 
Vazão 
Microserviços
API 
Timeline
API 
Timeline 
Roshi
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc.
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc.
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc. 
Playlists 
Tracks 
Usuários
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc. 
Playlists 
Tracks 
Usuários 
Likes 
Coment. 
Promoted 
Stats
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc. 
Playlists 
Tracks 
Usuários 
Likes 
Coment. 
Promoted 
Stats 
...
Buscar 
API 
Agregar 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc. 
Playlists 
Tracks 
Usuários 
Likes 
Coment. 
Promoted 
Stats 
...
Buscar 
Latência
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc. 
Playlists 
Tracks 
Usuários 
Likes 
Coment. 
Promoted 
Stats 
...
Agregar 
Complexidade
API 
Timeline 
Roshi 
Autentic. 
Autoriz. 
Geo loc. 
Playlists 
Tracks 
Usuários 
Likes 
Coment. 
Promoted 
Stats 
...
Scala 
yay!
Buscar 
Paralelizar
Futuros
Futuros 
Referência para um 
valor que será 
disponibilizado no 
futuro.
Futuros 
val response: Future[Int] = … 
// Não compila 
response + 1
Futuros 
val response: Future[Int] = … 
// Adiciona um callback 
response.onSuccess { int => 
println(int) 
}
Futuros 
val response: Future[Int] = … 
// Compõe um novo futuro 
val count: Future[Int] = 
response.map { int => 
int + 1 
}
Futuros 
for { 
user <- authenticate(request) 
} yield { 
}
Futuros 
for { 
user <- authenticate(request) 
geo <- geoLocationFor(request, user) 
} yield { 
}
Futuros 
for { 
user <- authenticate(request) 
geo <- geoLocationFor(request, user) 
timeline <- timelineFor(user, geo) 
} yield { 
}
Futuros 
for { 
user <- authenticate(request) 
geo <- geoLocationFor(request, user) 
timeline <- timelineFor(user, geo) 
resources <- 
fetchTracks(timeline) 
.join(fetchPlaylists(timeline)) 
.join(fetchComments(timeline)) 
} yield { 
}
Futuros 
for { 
user <- authenticate(request) 
geo <- geoLocationFor(request, user) 
timeline <- timelineFor(user, geo) 
resources <- 
fetchTracks(timeline) 
.join(fetchPlaylists(timeline)) 
.join(fetchComments(timeline)) 
} yield { 
new EnrichedTimeline(timeline, resources) 
}
Futuros 
def handle(request: Request): Future[EnrichedTimeline] = 
for { 
user <- authenticate(request) 
geo <- geoLocationFor(request, user) 
timeline <- timelineFor(user, geo) 
resources <- 
fetchTracks(timeline) 
.join(fetchPlaylists(timeline)) 
.join(fetchComments(timeline)) 
} yield { 
new EnrichedTimeline(timeline, resources) 
}
Futuros 
+ NIO 
Escalabilidade
Máquinas
Máquinas 
Processos
Máquinas 
Processos 
Threads
Máquinas 
Processos 
Threads 
Futuros
Futuros 
def handle(request: Request): Future[EnrichedTimeline] = 
for { 
user <- authenticate(request) 
geo <- geoLocationFor(request, user) 
timeline <- timelineFor(user, geo) 
resources <- 
fetchTracks(timeline) 
.join(fetchPlaylists(timeline)) 
.join(fetchComments(timeline)) 
} yield { 
new EnrichedTimeline(timeline, resources) 
}
Agregar 
Funcional
Collections
val timeline: Timeline = …
val timeline: Timeline = … 
val actorsToFetch: List[User] = 
timeline.items.map(_.actor)
val timeline: Timeline = … 
val actorsToFetch: List[User] = 
timeline.items.map(_.actor) 
val itemsByActor: Map[User, List[Item]] = 
timeline.items.groupBy(_.actor)
val timeline: Timeline = … 
val actorsToFetch: List[User] = 
timeline.items.map(_.actor) 
val itemsByActor: Map[User, List[Item]] = 
timeline.items.groupBy(_.actor) 
val numberOfItemsByActor: Map[User, Int] = 
itemsByActor.mapValues(_.size)
def createEnrichedTimeline( 
timeline: Timeline, 
users: Map[User, EnrichedUser]) = { 
timeline.items.map { item => 
new EnrichedItem( 
item, users.get(item.actor)) 
} 
}
Options
Option[T] 
None Some(value)
Options 
def findUser(id: Int): Option[User] 
// Nao compila 
render.json(findUser(666).name)
def findUser(id: Int): Option[User] 
// Compila 
findUser(666).map { 
case Some(user) => render.json(user.name) 
case None => render.notFound 
} 
Options
Pattern 
Matching
case class User(name: String, gender: Gender, email: Email)
case class User(name: String, gender: Gender, email: Email) 
timelineActors.foreach { 
}
case class User(name: String, gender: Gender, email: Email) 
timelineActors.foreach { 
case User(name, Female, Email(_, “soundcloud.com”) => 
println(“mulher trabalhando na soundcloud”) 
}
case class User(name: String, gender: Gender, email: Email) 
timelineActors.foreach { 
case User(name, Female, Email(_, “soundcloud.com”) => 
println(“mulher trabalhando na soundcloud”) 
case User(name, Male, Email(_, “soundcloud.com”) => 
println(“homem trabalhando na soundcloud”) 
}
case class User(name: String, gender: Gender, email: Email) 
timelineActors.foreach { 
case User(name, Female, Email(_, “soundcloud.com”) => 
println(“mulher trabalhando na soundcloud”) 
case User(name, Male, Email(_, “soundcloud.com”) => 
println(“homem trabalhando na soundcloud”) 
case User(name, gender, Email(_, “qconrio.com.br”) => 
println(“organizador da qconrio”) 
}
case class User(name: String, gender: Gender, email: Email) 
timelineActors.foreach { 
case User(name, Female, Email(_, “soundcloud.com”) => 
println(“mulher trabalhando na soundcloud”) 
case User(name, Male, Email(_, “soundcloud.com”) => 
println(“homem trabalhando na soundcloud”) 
case User(name, gender, Email(_, “qconrio.com.br”) => 
println(“organizador da qconrio”) 
case _ => 
println(“pessoa desconhecida”) 
}
Nem tudo são flores...
Código denso
Mas e o Stream...?
Mas e o Stream...? 
API 
Cassandra 
MySQL
Mas e o Stream...? 
API 
Cassandra 
MySQL 
~400 ms
Mas e o Stream...? 
API 
MySQL 
Tracks 
SPelarvyilcisets 
SPelarvyilcisets 
Service 
Timeline Redis 
Service
Mas e o Stream...? 
~150 ms 
API 
MySQL 
Tracks 
SPelarvyilcisets 
SPelarvyilcisets 
Service 
Timeline Redis 
Service
Mas só o Stream...? 
Data team 
Outros servicos em 
Scala 
Ferramental jvmkit
Mas só o Stream...? 
Stranglers
Mas só o Stream...? 
Stranglers
Mas só o Stream...? 
Stranglers 
Novo 
stream
Mas só o Stream...? 
Stranglers 
Novo 
stream 
Cache
Em resumo... 
Produtivo como Ruby, typesafe 
como Java* 
Move faster, 
break fewer things
O presente
O futuro! 
Padrões de código 
Bibliotecas mais estáveis 
Facilidade de inovação 
"One Scala"
Perguntas? 
by the way, we're hiring 
http://bit.ly/qconrj2014

Mais conteúdo relacionado

Destaque

Hunting snake
Hunting snakeHunting snake
Hunting snakegabitaa8
 
The Death of TV? Hardly...
The Death of TV? Hardly...The Death of TV? Hardly...
The Death of TV? Hardly...Steve Weaver
 
Vacanze studio edimburgo 2008
Vacanze studio edimburgo 2008Vacanze studio edimburgo 2008
Vacanze studio edimburgo 2008dany
 
Game theory 11
Game theory 11Game theory 11
Game theory 11poundza
 
SyncNI Magazine Spring 2012
SyncNI Magazine Spring 2012SyncNI Magazine Spring 2012
SyncNI Magazine Spring 2012Mark W. Bennett
 
La riforma scolastica
La riforma scolasticaLa riforma scolastica
La riforma scolasticaandymene
 
Awal sebelum membeli rumah
Awal sebelum membeli rumahAwal sebelum membeli rumah
Awal sebelum membeli rumahRahmatian Zaleh
 
Skyebank TSP August 2011
Skyebank TSP August 2011Skyebank TSP August 2011
Skyebank TSP August 2011yemiolaitan
 
Front Page
Front PageFront Page
Front Pageagelso
 
ScalaDays Amsterdam - Don't block yourself
ScalaDays Amsterdam - Don't block yourselfScalaDays Amsterdam - Don't block yourself
ScalaDays Amsterdam - Don't block yourselfFlavio W. Brasil
 
Service Master Response
Service Master ResponseService Master Response
Service Master Responsejaciblain
 
Game theory
Game theoryGame theory
Game theorypoundza
 
Fall2010 quinnedu261syllabus
Fall2010 quinnedu261syllabusFall2010 quinnedu261syllabus
Fall2010 quinnedu261syllabusPeggy Quinn
 
Leadership in Open Innovation
Leadership in Open InnovationLeadership in Open Innovation
Leadership in Open Innovationfwippich
 
BDO 2011 Biotech Briefing
BDO 2011 Biotech BriefingBDO 2011 Biotech Briefing
BDO 2011 Biotech Briefingrstarkes
 
Program Engagement Power. Programs Do Affect Ad Engagement
Program Engagement Power.  Programs Do Affect Ad EngagementProgram Engagement Power.  Programs Do Affect Ad Engagement
Program Engagement Power. Programs Do Affect Ad EngagementSteve Weaver
 

Destaque (20)

Hunting snake
Hunting snakeHunting snake
Hunting snake
 
The Death of TV? Hardly...
The Death of TV? Hardly...The Death of TV? Hardly...
The Death of TV? Hardly...
 
Design process
Design processDesign process
Design process
 
Vacanze studio edimburgo 2008
Vacanze studio edimburgo 2008Vacanze studio edimburgo 2008
Vacanze studio edimburgo 2008
 
Game theory 11
Game theory 11Game theory 11
Game theory 11
 
SyncNI Magazine Spring 2012
SyncNI Magazine Spring 2012SyncNI Magazine Spring 2012
SyncNI Magazine Spring 2012
 
La riforma scolastica
La riforma scolasticaLa riforma scolastica
La riforma scolastica
 
Awal sebelum membeli rumah
Awal sebelum membeli rumahAwal sebelum membeli rumah
Awal sebelum membeli rumah
 
Skyebank TSP August 2011
Skyebank TSP August 2011Skyebank TSP August 2011
Skyebank TSP August 2011
 
Front Page
Front PageFront Page
Front Page
 
ScalaDays Amsterdam - Don't block yourself
ScalaDays Amsterdam - Don't block yourselfScalaDays Amsterdam - Don't block yourself
ScalaDays Amsterdam - Don't block yourself
 
Service Master Response
Service Master ResponseService Master Response
Service Master Response
 
Electronic voting-system
Electronic voting-systemElectronic voting-system
Electronic voting-system
 
Portafolio 4to corte admon
Portafolio 4to corte admonPortafolio 4to corte admon
Portafolio 4to corte admon
 
Game theory
Game theoryGame theory
Game theory
 
Atrodiet atbilstošo literatūras varoņu tēlu
Atrodiet atbilstošo literatūras varoņu tēluAtrodiet atbilstošo literatūras varoņu tēlu
Atrodiet atbilstošo literatūras varoņu tēlu
 
Fall2010 quinnedu261syllabus
Fall2010 quinnedu261syllabusFall2010 quinnedu261syllabus
Fall2010 quinnedu261syllabus
 
Leadership in Open Innovation
Leadership in Open InnovationLeadership in Open Innovation
Leadership in Open Innovation
 
BDO 2011 Biotech Briefing
BDO 2011 Biotech BriefingBDO 2011 Biotech Briefing
BDO 2011 Biotech Briefing
 
Program Engagement Power. Programs Do Affect Ad Engagement
Program Engagement Power.  Programs Do Affect Ad EngagementProgram Engagement Power.  Programs Do Affect Ad Engagement
Program Engagement Power. Programs Do Affect Ad Engagement
 

Semelhante a Scala na Nuvem de Som: Escalabilidade, Funcionalidade e Futuros

Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com pythonUFPA
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVAWillian Magalhães
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIElias Nogueira
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaCharles Kilesse
 
Apache NiFi com postgresql
Apache NiFi com postgresqlApache NiFi com postgresql
Apache NiFi com postgresqlGerdan Santos
 
Apache NiFi com PostgreSQL - PGConf.Brasil 2018
Apache NiFi com PostgreSQL - PGConf.Brasil 2018Apache NiFi com PostgreSQL - PGConf.Brasil 2018
Apache NiFi com PostgreSQL - PGConf.Brasil 2018Davy Alvarenga Machado
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesDevCamp Campinas
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 

Semelhante a Scala na Nuvem de Som: Escalabilidade, Funcionalidade e Futuros (20)

Possibilidades com python
Possibilidades com pythonPossibilidades com python
Possibilidades com python
 
JQuery
JQuery JQuery
JQuery
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVA
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completa
 
Apache NiFi com postgresql
Apache NiFi com postgresqlApache NiFi com postgresql
Apache NiFi com postgresql
 
Apache NiFi com PostgreSQL - PGConf.Brasil 2018
Apache NiFi com PostgreSQL - PGConf.Brasil 2018Apache NiFi com PostgreSQL - PGConf.Brasil 2018
Apache NiFi com PostgreSQL - PGConf.Brasil 2018
 
Tdc2010 web
Tdc2010 webTdc2010 web
Tdc2010 web
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
Leonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional InterfacesLeonardo Zamariola - High Order Functions e Functional Interfaces
Leonardo Zamariola - High Order Functions e Functional Interfaces
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Workshop Python
Workshop PythonWorkshop Python
Workshop Python
 
Kotlin no desenvolvimento Mobile - FTSL
Kotlin no desenvolvimento Mobile - FTSLKotlin no desenvolvimento Mobile - FTSL
Kotlin no desenvolvimento Mobile - FTSL
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Javascript
Javascript Javascript
Javascript
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 

Scala na Nuvem de Som: Escalabilidade, Funcionalidade e Futuros

  • 1.
  • 2. @flaviowbrasil Aficionado por open source Expert em escalabilidade Mestre Jedi Scala Prefere + uma sessão de profiling do que uma tarde na praia
  • 3. @herval Fundador de Startups Dois Easter Eggs publicados Padawan Scala Tem um cachorro com nome de sorvete
  • 4. A Nuvem de Som 12 horas de novo conteúdo/ minuto 350 milhões de usuários/mês 12 milhões de horas ouvidas/mês 1 usuário no espaço
  • 5. Era uma vez uma startup... Uma base de código Um punhado de construtores
  • 6. Um milhão de features Base de código gigante
  • 7. Move fast and break things
  • 9. Muitos vilarejos, muitos idiomas Microserviços → "tudo é http" Culturas de código Infraestrutura Monitoramento "production ready"
  • 10. A Torre de Babel Mais pessoas → mais linguagens N+1 linguagens N = número de linguagens de programação existentes
  • 11. Move fast without breaking everything, bitte.
  • 12. Java Serviços de base Bibliotecas compartilhadas Monitoria Autenticação/segurança (cross-cutting concerns) INFRAESTRUTURA BÁSICA
  • 14. Estudo de caso O novo Stream
  • 15. Reescrever pra quê? Novas features Latência Vazão Microserviços
  • 18. API Timeline Roshi Autentic. Autoriz. Geo loc.
  • 19. API Timeline Roshi Autentic. Autoriz. Geo loc.
  • 20. API Timeline Roshi Autentic. Autoriz. Geo loc. Playlists Tracks Usuários
  • 21. API Timeline Roshi Autentic. Autoriz. Geo loc. Playlists Tracks Usuários Likes Coment. Promoted Stats
  • 22. API Timeline Roshi Autentic. Autoriz. Geo loc. Playlists Tracks Usuários Likes Coment. Promoted Stats ...
  • 23. Buscar API Agregar Timeline Roshi Autentic. Autoriz. Geo loc. Playlists Tracks Usuários Likes Coment. Promoted Stats ...
  • 25. API Timeline Roshi Autentic. Autoriz. Geo loc. Playlists Tracks Usuários Likes Coment. Promoted Stats ...
  • 27. API Timeline Roshi Autentic. Autoriz. Geo loc. Playlists Tracks Usuários Likes Coment. Promoted Stats ...
  • 30.
  • 32. Futuros Referência para um valor que será disponibilizado no futuro.
  • 33. Futuros val response: Future[Int] = … // Não compila response + 1
  • 34. Futuros val response: Future[Int] = … // Adiciona um callback response.onSuccess { int => println(int) }
  • 35. Futuros val response: Future[Int] = … // Compõe um novo futuro val count: Future[Int] = response.map { int => int + 1 }
  • 36. Futuros for { user <- authenticate(request) } yield { }
  • 37. Futuros for { user <- authenticate(request) geo <- geoLocationFor(request, user) } yield { }
  • 38. Futuros for { user <- authenticate(request) geo <- geoLocationFor(request, user) timeline <- timelineFor(user, geo) } yield { }
  • 39. Futuros for { user <- authenticate(request) geo <- geoLocationFor(request, user) timeline <- timelineFor(user, geo) resources <- fetchTracks(timeline) .join(fetchPlaylists(timeline)) .join(fetchComments(timeline)) } yield { }
  • 40. Futuros for { user <- authenticate(request) geo <- geoLocationFor(request, user) timeline <- timelineFor(user, geo) resources <- fetchTracks(timeline) .join(fetchPlaylists(timeline)) .join(fetchComments(timeline)) } yield { new EnrichedTimeline(timeline, resources) }
  • 41. Futuros def handle(request: Request): Future[EnrichedTimeline] = for { user <- authenticate(request) geo <- geoLocationFor(request, user) timeline <- timelineFor(user, geo) resources <- fetchTracks(timeline) .join(fetchPlaylists(timeline)) .join(fetchComments(timeline)) } yield { new EnrichedTimeline(timeline, resources) }
  • 42. Futuros + NIO Escalabilidade
  • 47. Futuros def handle(request: Request): Future[EnrichedTimeline] = for { user <- authenticate(request) geo <- geoLocationFor(request, user) timeline <- timelineFor(user, geo) resources <- fetchTracks(timeline) .join(fetchPlaylists(timeline)) .join(fetchComments(timeline)) } yield { new EnrichedTimeline(timeline, resources) }
  • 51. val timeline: Timeline = … val actorsToFetch: List[User] = timeline.items.map(_.actor)
  • 52. val timeline: Timeline = … val actorsToFetch: List[User] = timeline.items.map(_.actor) val itemsByActor: Map[User, List[Item]] = timeline.items.groupBy(_.actor)
  • 53. val timeline: Timeline = … val actorsToFetch: List[User] = timeline.items.map(_.actor) val itemsByActor: Map[User, List[Item]] = timeline.items.groupBy(_.actor) val numberOfItemsByActor: Map[User, Int] = itemsByActor.mapValues(_.size)
  • 54. def createEnrichedTimeline( timeline: Timeline, users: Map[User, EnrichedUser]) = { timeline.items.map { item => new EnrichedItem( item, users.get(item.actor)) } }
  • 57. Options def findUser(id: Int): Option[User] // Nao compila render.json(findUser(666).name)
  • 58. def findUser(id: Int): Option[User] // Compila findUser(666).map { case Some(user) => render.json(user.name) case None => render.notFound } Options
  • 60. case class User(name: String, gender: Gender, email: Email)
  • 61. case class User(name: String, gender: Gender, email: Email) timelineActors.foreach { }
  • 62. case class User(name: String, gender: Gender, email: Email) timelineActors.foreach { case User(name, Female, Email(_, “soundcloud.com”) => println(“mulher trabalhando na soundcloud”) }
  • 63. case class User(name: String, gender: Gender, email: Email) timelineActors.foreach { case User(name, Female, Email(_, “soundcloud.com”) => println(“mulher trabalhando na soundcloud”) case User(name, Male, Email(_, “soundcloud.com”) => println(“homem trabalhando na soundcloud”) }
  • 64. case class User(name: String, gender: Gender, email: Email) timelineActors.foreach { case User(name, Female, Email(_, “soundcloud.com”) => println(“mulher trabalhando na soundcloud”) case User(name, Male, Email(_, “soundcloud.com”) => println(“homem trabalhando na soundcloud”) case User(name, gender, Email(_, “qconrio.com.br”) => println(“organizador da qconrio”) }
  • 65. case class User(name: String, gender: Gender, email: Email) timelineActors.foreach { case User(name, Female, Email(_, “soundcloud.com”) => println(“mulher trabalhando na soundcloud”) case User(name, Male, Email(_, “soundcloud.com”) => println(“homem trabalhando na soundcloud”) case User(name, gender, Email(_, “qconrio.com.br”) => println(“organizador da qconrio”) case _ => println(“pessoa desconhecida”) }
  • 66. Nem tudo são flores...
  • 67.
  • 69.
  • 70. Mas e o Stream...?
  • 71. Mas e o Stream...? API Cassandra MySQL
  • 72. Mas e o Stream...? API Cassandra MySQL ~400 ms
  • 73. Mas e o Stream...? API MySQL Tracks SPelarvyilcisets SPelarvyilcisets Service Timeline Redis Service
  • 74. Mas e o Stream...? ~150 ms API MySQL Tracks SPelarvyilcisets SPelarvyilcisets Service Timeline Redis Service
  • 75. Mas só o Stream...? Data team Outros servicos em Scala Ferramental jvmkit
  • 76. Mas só o Stream...? Stranglers
  • 77. Mas só o Stream...? Stranglers
  • 78. Mas só o Stream...? Stranglers Novo stream
  • 79. Mas só o Stream...? Stranglers Novo stream Cache
  • 80. Em resumo... Produtivo como Ruby, typesafe como Java* Move faster, break fewer things
  • 82. O futuro! Padrões de código Bibliotecas mais estáveis Facilidade de inovação "One Scala"
  • 83. Perguntas? by the way, we're hiring http://bit.ly/qconrj2014