F# in social gaming

85
F# in Social Gaming Yan Cui (@theburningmonk)

description

In this talk I talked about some of the use cases we have had for F# in the backend stack used to build our range of social games, and how F# has helped us achieve better 1) time to market; 2) efficiency; 3) correctness, and 4) dealing with complexity

Transcript of F# in social gaming

Page 1: F# in social gaming

F# in Social GamingYan Cui (@theburningmonk)

Page 2: F# in social gaming

Who is Gamesys?

•Founded in 2001

•#1 in the UK

• Handle $5 Billion in turnover annually

•First company to launch real money gaming on Facebook

•Employ 1,000 globally

Page 3: F# in social gaming
Page 4: F# in social gaming
Page 5: F# in social gaming
Page 6: F# in social gaming

What is F#?

• Functional-first

• ML family of languages

• 1st class citizen on the .Net platform– also supported by Mono

Page 7: F# in social gaming

What is F#?

• Records

• Discriminated Unions

• MailboxProcessor (aka Agents)

• Computation Expressions (aka Workflows)

• Type Providers

• Quotations

• Units of Measure

Page 8: F# in social gaming

Why F#?

• Time to Market

• Efficiency

• Correctness

• Complexity

Page 9: F# in social gaming

Case Study #1

• Slots Engine– Written in F#– The ‘brain’– Enforces game rules and maths model

Page 10: F# in social gaming

Collectables

Wager Size

Special SymbolAvg Wager Size

Web Server call

Page 11: F# in social gaming

Winning at Slots

• Line Win– X number of matching symbols on adjacent columns– Positions have to be a ‘line’– Wild symbols substitute for other symbols

• Scatter Win– X number of matching symbols anywhere– Triggers bonus game

Page 12: F# in social gaming

What symbols should land?What lines did the player bet on?How much did the player wager?

Did the player win anything?Any special symbol wins?

Should the player receive collectables?

What’s the player’s new avg wager?

Page 13: F# in social gaming
Page 14: F# in social gaming

New avg wager Got a Collectable!

A pay line win!

Page 15: F# in social gaming

Betting small reduces avg wager!

Bonus Game!

Page 16: F# in social gaming

Use collectables

Page 17: F# in social gaming
Page 18: F# in social gaming

And a pay line win!

Coin size brought over from main game

Houses = multiplier on wins

GAME OVER

Collected in the bonus game.Gives player extra ‘lives’.

Page 19: F# in social gaming
Page 20: F# in social gaming
Page 21: F# in social gaming
Page 22: F# in social gaming

Why F#?

• Time to Market

• Efficiency

• Correctness

• Complexity

Page 23: F# in social gaming

Why F#?

• Record and Discriminated Unions– Lightweight syntax for creating types and hierarchies– Illegal states cannot be represented– Immutable by default

• Pattern matching– Clear and concise way to handle all branch conditions

• Unit of Measure– Prevents a whole class of errors related to misuse of units

Page 24: F# in social gaming

Case Study #2

• Stateful Server– Actor-based architecture

Page 25: F# in social gaming

Travel, Collect, Craft!

Page 26: F# in social gaming

Trap Monsters

Page 27: F# in social gaming
Page 28: F# in social gaming

Stateful Server

Elastic Load Balancer

S3

Auto scaling Group

Server A Server B

...

EC2

CloudFront

Page 29: F# in social gaming

Stateful Server

• Need to ensure Server affinity– All calls need to be routed to the affined server

• Need to balance load– Session lengths vary greatly– Some players are more active than others– Need to avoid hot spots

• Need to avoid players hogging a server– Need to be able to scale down!

Page 30: F# in social gaming

Stateful Server

• Persist player state after short inactivity

• Move player to another server after persistence

Page 31: F# in social gaming

Why Stateful Server?

• 500% efficiency increase

• 60% reduction in avg latency

• Fewer game servers

• No CouchBase cluster

• Huge saving on cost

Page 32: F# in social gaming

The Actor Model

An actor is the fundamental unit of computation which embodies the 3 things

• Processing• Storage• Communication

that are essential to computation.

-Carl Hewitt*

* http://bit.ly/HoNHbG

Page 33: F# in social gaming

The Actor Model

• Everything is an actor

• An actor has a mailbox

• When an actor receives a message it can:– Create new actors– Send messages to actors it has addresses for– Designate how to handle the next message it receives

Page 34: F# in social gaming

Stateful Server

• Gatekeeper– Manages the local list of active workers– Spawns new workers

• Worker– Manages the states for a player– Optimistic locking– Persist state after period of inactivity

Page 35: F# in social gaming

Stateful Server

Game Server

Player A

Player B

S3Worker C

Worker B

GatekeeperRe

ques

t Han

dler

s

Asynchronous

Page 36: F# in social gaming

Stateful Server

Game Server

Player A

Player B

S3Worker C

Worker B

Gatekeeper

Worker A

Requ

est H

andl

ers

Asynchronous

ok

Page 37: F# in social gaming

Stateful Server

Game Server

Player A

Player B

S3Worker C

Worker B

Gatekeeper

Worker A

Requ

est H

andl

ers

Asynchronous

Page 38: F# in social gaming

Stateful Server

Game Server

Player A

Player B

S3Worker C

Gatekeeper

Worker A

Requ

est H

andl

ers

Asynchronous

Page 39: F# in social gaming

Stateful Server

Game Server

Player A

Player B

S3Worker C

Worker A

Requ

est H

andl

ers

Gatekeeper

Asynchronous

error

Page 40: F# in social gaming
Page 41: F# in social gaming

MailboxProcessor<Message>

Page 42: F# in social gaming

Async<Message option>

Page 43: F# in social gaming

switch state

Page 44: F# in social gaming
Page 45: F# in social gaming
Page 46: F# in social gaming

Why F#?

• Time to Market

• Efficiency

• Correctness

• Complexity

Page 47: F# in social gaming

Why F#?

• Agents– No locks– Asynchronous message passing– Each actor is self-contained and easier to reason with

• Pattern matching– Clear and concise way to handle all branch conditions

Page 48: F# in social gaming

Why F#?

• Async Workflows– Non-blocking IO– Convert synchronous code into asynchronous code with

minimal code changes– Similar to C# 5’s async-await feature, but available in F#

since 2007!

Page 49: F# in social gaming

Case Study #3

• Quests & Achievements– Progress tied to most actions– Avoid scripting– Data driven

Page 50: F# in social gaming

Caught a Gnome

Page 51: F# in social gaming

EXP Item Gold

Quest Progress

Caught a Gnome

Page 52: F# in social gaming

Level Up

Quest Progress

EXP Item Gold

Caught a Gnome

Quest Complete

Page 53: F# in social gaming

Level Up

Quest Progress

EXP Item Gold

Caught a Gnome

Quest Complete

New Quest

Page 54: F# in social gaming

Level Up

Quest Progress

EXP Item Gold

Caught a Gnome

Quest Complete

New Quest

Page 55: F# in social gaming

Level Up

Quest Progress

EXP Item Gold

Caught a Gnome

Quest Complete

New QuestAchievement

Progress

Page 56: F# in social gaming

Level Up

Quest Progress

EXP Item Gold

Caught a Gnome

Quest Complete

New QuestAchievement

Progress

Achievement Complete

Page 57: F# in social gaming

Level Up

Quest Progress

EXP Item Gold

Caught a Gnome

Quest Complete

New QuestAchievement

Progress

Achievement Complete

Page 58: F# in social gaming

Quests & Achievements

• 100+ actions available in the game– Most can be tied to quests/achievements– Many yield rewards

• Triggered from different abstraction layers– Level controller– Trapping controller– ...

Page 59: F# in social gaming

Quests & Achievements

• Non-functional requirements– Analytics tracking– 3rd party reporting– ...

Page 60: F# in social gaming

Quests & Achievements

• Message broker pattern

• Something happened, it’s a FACT– Caught a Gnome– Received an item– Got some EXP– ...

Page 61: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

Page 62: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

Ignore

Process

Process

Process

Process

Ignore

Page 63: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

EXPItemGold

Page 64: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

EXPItemGold

Page 65: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

EXPItemGold

Process

Ignore

Ignore

Ignore

Process

Ignore

Page 66: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

EXPItemGold

Level Up

Page 67: F# in social gaming

Caught Gnome Trapping

Queue

Levelling

Quests

Achievements

Analytics

Partner Reporting

EXPItemGold

Level Up

Page 68: F# in social gaming

Message Broker Pattern

• Simple

• Flexible

• Extensible

• Requires many types of facts!

Page 69: F# in social gaming

OK for small number of DU cases

Page 70: F# in social gaming
Page 71: F# in social gaming

Why F#?

• Time to Market

• Efficiency

• Correctness

• Complexity

Page 72: F# in social gaming

Why F#?

• Discriminated Unions– Saved days/weeks in writing and maintaining a very large

class hierarchy

• Pattern Matching– Clear and concise way to handle all branch conditions

Page 73: F# in social gaming

Case Study #4

• DynamoDB.SQL*– SQL-like external DSL for working with Amazon DynamoDB– Built on top of FParsec

* http://theburningmonk.github.io/DynamoDb.SQL

Page 74: F# in social gaming

Amazon DynamoDB

• Fully managed NoSQL database

• Provisioned throughput

• Potentially infinitely scalable

• SSD-backed

• Fast, predictable performance

• Data replicated across data centres

Page 75: F# in social gaming

Amazon DynamoDB

• Semi-schema– Hash and Range key– Local Secondary Index

• Supports both strong or eventual consistency

• Supports ‘query’ and ‘scan’ operations

• Supports parallel scans

Page 76: F# in social gaming

Amazon DynamoDB

• API is cumbersome to use– Non-trivial queries are hard to express– .Net SDK doesn’t make it any easier...– Need an easier way to query for data

Page 77: F# in social gaming

DynamoDB.SQL

• Query with hash key only

SELECT Ticker, TimeStamp, Value FROM Prices WHERE Ticker = “MSFT”

SELECT * FROM Prices WHERE Ticker = “MST”

• Query with hash and range key

SELECT * FROM PricesWHERE Ticker = “MSFT”AND TimeStamp BEGINS WITH “2013-10”

Page 78: F# in social gaming

DynamoDB.SQL

• Ordering and Limiting number of results

SELECT * FROM Prices WHERE Ticker = “MSFT”ORDER ASCLIMIT 100

• Using eventual consistency and throttling

SELECT * FROM Prices WHERE Ticker = “MSFT”WITH (NoConsistentRead, PageSize(10))

Page 79: F# in social gaming

DynamoDB.SQL

• Counting without returning data

COUNT * FROM Prices WHERE Ticker = “MSFT”

COUNT * FROM Prices WHERE Ticker = “MSFT” AND TimeStamp BEGINS WITH “2013-10”

Page 80: F# in social gaming

Image by Mike Rohde

DynamoDB.SQ

L

Page 81: F# in social gaming

Why F#?

• Time to Market

• Efficiency

• Correctness

• Complexity

Page 82: F# in social gaming

Why F#?

• Record and Discriminated Unions– Lightweight syntax for creating types and hierarchies– Illegal states cannot be represented– Immutable by default

• Pattern matching– Clear and concise way to handle all branch conditions

Page 83: F# in social gaming

Why F#?

• Active Patterns– Extends the power of pattern matching– Composable

• Async Workflows– Non-blocking IO– Convert synchronous code into asynchronous code with

minimal code changes– Similar to C# 5’s async-await feature, but available in F#

since 2007!

Page 84: F# in social gaming

Thank You!

Page 85: F# in social gaming

JackpotJoy Slotshttp://apps.facebook.com/jackpotjoyslots

Bingo Lanehttp://apps.facebook.com/bingolane

Here Be Monstershttp://apps.facebook.com/herebemonsters

Building a MMORPGhttp://bit.ly/1hjqoL8http://slidesha.re/18MD4XY

Google I/O 2013 – Here Be BigQueryhttp://bit.ly/1fHjbce