a slice of scala

156
Melbourne Scala User Group - August 2013 Kevin O’Neill - CTO PlayUp - @kevinoneill Kevin O’Neill CTO PlayUp A Slice of Scala @kevinoneill August 2013

Upload: kevin-oneill

Post on 15-Jan-2015

1.226 views

Category:

Technology


2 download

DESCRIPTION

A presentation given to the Melbourne Scala User Group in August 2013 talking about how PlayUp is using scala, akka, spray and neo4j to drive it's next generation of mobile sports applications.

TRANSCRIPT

Page 1: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Kevin O’Neill CTO PlayUp

A Slice of Scala

@kevinoneill

August 2013

Page 2: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 3: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 4: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 5: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 6: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

A little History

Page 7: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Engage & Entertain Around Live Sport

Page 8: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Mobile Games

Page 9: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

SMS Based

Page 10: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Number of Runs

Page 11: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Complex

Page 12: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Carrier Integration

Page 13: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Smart Phone Revolution

Page 14: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Move from a Content Creator to a Content

Enabler

Page 15: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Top 10 in Engagement

Page 16: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Over 3 Million Likes

Page 17: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

30% - 40% Active

Page 18: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Manually Curated

Page 19: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

We Know there's an Opportunity

Page 20: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

October 2011

Page 21: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Technologist at Large

Page 22: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Version 2

Page 23: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 24: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Rebuild Based on Hypermedia*

Page 25: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 26: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Same Feature Set

Page 27: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 28: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 29: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Different Skin

Page 30: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 31: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

iOS

Page 32: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Android

Page 33: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Ruby

Page 34: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Version 3

Page 35: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Platform Extensions

Page 36: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 37: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 38: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Tiles

Page 39: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 40: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Third Party

Page 41: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 42: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Ticketing

Page 43: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 44: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Ruby

Page 45: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

PHP

Page 46: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Version 4

Page 47: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 48: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Engagement Too Deep

Page 49: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Streams

Page 50: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Page 51: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Graph Storage

Page 52: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Story

League

Region

Team Story

Team

Story

League

TeamStory

Story

User

Story

about

about

about

aboutabout

follows competes in

competes in

follows

competes in

Region

follows

Team

Story

competes in

about

about

User

follows

follows

Story

Contest

about

plays in

plays in

Story

about

Page 53: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Value is in the Connections

Page 54: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Ruby

Page 55: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

50 Seconds

Page 56: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Cypher Processing too much Data

Page 57: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Java plugin

Page 58: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

5 Seconds

Page 59: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

10 Times too Long*

Page 60: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Aiming Around 200ms

Page 61: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Time to Change

Page 62: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

If you hear a voice within you say 'you cannot paint,' then by all means paint, and that voice will be silenced.

– Vincent Van Gogh

Page 63: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Scala

Page 64: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Just Couldn't Face Java

Page 65: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Some Experience with it on a Large Project

Page 66: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

The Stack

Page 67: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Scala 2.10.x

Page 68: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

akka 2.1.x*

Page 69: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Spray M8+

Page 70: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Play 2.1.x*

Page 71: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Other Bits

Page 72: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Neo4j 1.9.x

Page 73: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Scalaz 7.0.x

Page 74: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Blueprints 2.4.x

Page 75: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Scala Test 2.0.x

Page 76: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Scala Check 1.10.x

Page 77: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

SBT 1.12.x*

Page 78: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Systems

Page 79: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Two akka Services*

Page 80: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Graph Service

Page 81: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Sports Connect

Page 82: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Fanbase Connect*

Page 83: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

One Spray Server

Page 84: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Hypermedia API

Page 85: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

One Play Application*

Page 86: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

HTML Front End

Page 87: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Admin Front End*

Page 88: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

JSON Generation

Page 89: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Problem : How do you isolate environment

Page 90: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Lambda: The Ultimate Dependency Injection

Framework

Page 91: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Did my Head in

Page 92: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

So what if …

Page 93: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Environment Readers

type  Settings  =  Set[EnvironmentSetting[_]]  !type  EnvironmentReader[+A]  =  scalaz.Reader[Settings,  A]       object  EnvironmentReader  {    def  apply[A](f:  Settings  =>  A):EnvironmentReader[A]          =  scalaz.Reader(f) }

Page 94: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Writing an Identity

   protected  def  writeResourcePointer(identity:  ResourceIdentity)   :  EnvironmentReader[JObject]  =  for  { !            href  <-­‐  urlForIdentity(identity)              contentType  =  identity.documentType              representations  <-­‐  writeRepresentations(identity)              views  <-­‐  viewsForIdentity(identity) !        }  yield  (":href"  -­‐>  href)  ~                          (":type"  -­‐>  contentType)  ~                        (":uri"  -­‐>  identity.uri)  ~                        representations  ~                        (":views"  -­‐>  views)  

Page 95: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

urlForIdentity

protected  def  urlForIdentity(identity:ResourceIdentity)    :  EnvironmentReader[JValue]  =  for  { !    r  <-­‐  URLResolverSetting.resolve(identity)      href  <-­‐  mapOrJNothing(r)  {        ref  :  String  =>  pure(JString(ref))    } !}  yield  href  

Page 96: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

URLResolverSetting

case  class  URLResolverSetting(value:  Resolver[String])    extends  EnvironmentSetting[Resolver[String]]  {          val  key  =  "url-­‐resolver"  }  !object  URLResolverSetting  extends  ResolverSetting  ({      case  setting:  URLResolverSetting  =>  setting.value  })  

Page 97: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

ResolverSetting

class  ResolverSetting[T](   finder  :  PartialFunction[      EnvironmentSetting[_],          Resolver[T]])  { !    def  resolve(identity  :  ResourceIdentity)  :        EnvironmentReader[Option[T]]  =  EnvironmentReader    {  settings  =>          for  {              resolver  <-­‐  settings.collectFirst(finder)              result  <-­‐  resolver.resolve(identity)          }  yield  result      }  }  

Page 98: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Wooh … That's far more

complex than my … blah blah in blah

Page 99: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Yup

Page 100: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Nope

Page 101: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Remember I mentioned Runars talk

did my head in.*

Page 102: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

It's actually really easy to work with

Page 103: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Each components is responsible for one

thing

Page 104: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Combining components is trivial

Page 105: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

You spend most of your time doing

simple, safe, composition

Page 106: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Spray

Page 107: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Elephants all the way down

Page 108: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

The Language

val  route  =  {          language  {  lang  =>                  implicit  val  env  =  RequestEnvironmentProvider(                    EnvironmentConfig(language  =  Some(lang))                ) … !}

Page 109: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

The Directive*

def  language:  Directive1[Lang]  =  {      headerValue  { !        case  HttpHeader("accept-­‐language",  langString)  =>            langString.split(',').headOption.flatMap(firstLanguage  =>                Lang.get(firstLanguage)) !        case  _  =>  None !    }  |  provide(Lang.defaultLang)  }  

Page 110: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Creating a Responsedef  getStream(implicit  env:  RequestEnvironmentProvider):  Route  =  {      path("stream"  /  StreamPath)  {  case  (stream,  afterStory)  =>        read(FetchStream(stream,  afterStory))  {  stream  =>        val  streamEnv  =  environmentForStreamWithTopics(          env,  stream.identity.references        )          respondWithHeaders(            `Cache-­‐Control`(`public`,  `max-­‐age`(60)))  {              complete  {                implicit  val  criteriaMarshaller:  Marshaller[StoryStream]                =  resourceMarshaller(streamEnv)                  stream        }      }    }  }      }  

Page 111: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

A Little akka Helper

Page 112: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Reading the Graph

def  read[T](message  :  GraphRequest[T])(f  :  T  =>  Route):Route  = {  ctx  =>      val  response:  Future[T]  =        Graph.reader.ask(message).asInstanceOf[Future[T]]                  response.map  {              case  Error(messages)  =>  {                  ctx.complete(                  InternalServerError,  messages.mkString("\n")                )              }              case  result  =>  f(result)(ctx)          }  }

Page 113: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

akka

Page 114: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Topic Management

Page 115: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Topic Actor

private  class  TopicActor  (system  :  GraphSystem,                                                    topic  :  StreamComponentIdentity)    extends  GraphWorker(system)  with  Stash  {  !    override  def  preStart()  {          available(topic)  onAvailable  {              become(active)          }  onMissing  {              topicManager  !  UpdateTopic(topic)              become(pending)          }      }  !… }

Page 116: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Receive

def  receive  =  PartialFunction.empty

Page 117: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Pending

def  pending  :  Actor.Receive  =  {      case  message  @  LinkStory(story,  identity)        if  identity  ==  topic  =>  {              stash()          }  !    case  identity  if  identity  ==  topic  =>  {          unstashAll()          become(active)      }  }

Page 118: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Active

   def  active  :  Actor.Receive  =  {          case  LinkStory(story,  identity)  if  identity  ==  topic  =>  {              gs.write(associateWithSubject(story,  topic))          }      }  

Page 119: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Baby Steps

Page 120: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Challenges

Page 121: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

As the Carpenters said …

Page 122: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

We've Only Just Begun

Page 123: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Data Load

Page 124: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Sparsity

Page 125: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Propagation

Page 126: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Friends

Page 127: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

500 Topics

Page 128: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

10,000,000 Nodes

Page 129: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

1,000,000 Topics

Page 130: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

10,000,000,000 Nodes

Page 131: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Time Series Data

Page 132: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Distribution

Page 133: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Need to change the way you think about

services

Page 134: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Actors are not Queues

Page 135: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Monitoring is Hard

Page 136: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

"Real Time"

Page 137: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Balancing Load vs Caching

Page 138: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Two Hard Problems

Page 139: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Naming

Page 140: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Cache Invalidation

Page 141: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Off by One Errors

Page 142: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Caching Stuff is Easy

Page 143: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Invalidation is Hard

Page 144: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Limited Use

Page 145: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Just be Fast

Page 146: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Payments

Page 147: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Ticketing

Page 148: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

À la carte

Page 149: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Cross Platform

Page 150: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Come Join Us

Page 151: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Disrupting

Page 152: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Looking for the 'X' factor

Page 153: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Hiring Selectively

Page 154: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Talk to Me or Andrea

Page 155: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

You miss 100 percent of the the shots you don't take

– Wayne Gretzky

Page 156: A Slice of Scala

Melbourne Scala User Group - August 2013Kevin O’Neill - CTO PlayUp - @kevinoneill

Kevin O’NeillCTO - PlayUp

[email protected]@kevinoneill

Questions?