Top Banner
Erlang, the big switch in social games Paolo Negri @hungryblank
64

Erlang, the big switch in social games

Oct 20, 2014

Download

Technology

Online games backend are challenging applications, a single user generates one http call every few seconds, usage volume can spike very quickly and balance between data read and write is close to 50/50 which make the use of write through cache or other common scaling approaches not so effective.
Follow how in our quest for a better architecture to serve millions of games sessions daily and reduce our resource usage we took the decision to write in Erlang our third generation game backend, see how we’re leveraging the actor model in order to change how we use and conceive our persistency layer. See also how introducing Erlang as a new tool in a company is working out, what we found hard from an organizational and technical point of view, which obstacle we hit and how as technical guys we convinced our management to take the risk of bringing in house a different technology.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Erlang, the big switch in social games

Erlang, the big switch in social games

Paolo Negri @hungryblank

Page 2: Erlang, the big switch in social games

About this talk

Erlang adoption @

how we did it

and what we found

Page 3: Erlang, the big switch in social games

Social Games

• Run in the browser

• Published on social networks

• Popularity measured in millions of daily users

Page 4: Erlang, the big switch in social games

Social GamesFlash client (game) HTTP API

Page 5: Erlang, the big switch in social games

Social GamesFlash client

• Game actions need to be persisted and validated

• 1 API call every 2 secs

Page 6: Erlang, the big switch in social games

Social GamesHTTP API

• @ 1 000 000 daily users

• 5000 HTTP reqs/sec

• more than 90% writes

Page 7: Erlang, the big switch in social games

Social Games @wooga

• up to 1 300 000 daily users on a single game

• team of 2 people

• develop from scratch

• AND do deployments + live operations

• Releasing on weekly schedule

HTTP API

Page 8: Erlang, the big switch in social games

The hard nut

http://www.flickr.com/photos/mukluk/315409445/

Page 9: Erlang, the big switch in social games

The hard nut

60K queries/sec

Read/Write ~ 1

@ 1mln daily users your SQL / NOSQL data layer is the main technical challenge

Page 10: Erlang, the big switch in social games

The hard nut roots

• very easy to scale (add one more)

• easy to develop

• Plenty of ready frameworks

Stateless app servers

Page 11: Erlang, the big switch in social games

The hard nut roots

• high pressure on data layer

• extreme query/req optimization means heavy refactoring

• query/req of 2 best possible ratio

Stateless app servers

Page 12: Erlang, the big switch in social games

The case for erlang

“A gaming session is a stream of close requests altering repeatedly the same game state”

Page 13: Erlang, the big switch in social games

The case for erlang

“What about application servers that understand and represent efficiently the concept of a gaming session?”

Page 14: Erlang, the big switch in social games

The case for erlang“Which language or framework for:”

• Long lived state

• Safe handling of a multitude of independent, different states

• All the above on a big cluster of machines

Page 15: Erlang, the big switch in social games

The case for erlang

• gen_server, gen_fsm good approach to state handling

• Processes are very good at isolating failures

• clustering is a concept in the language itself

Page 16: Erlang, the big switch in social games

Pitching the idea“This architecture let us leverage factors we can’t currently leverage in order to solve the scaling challenge”

“By the way erlang seems to be a very good match for this architecture”

Page 17: Erlang, the big switch in social games

Pitch won!

• Develop proof of concept

• Hire 1 developer with erlang experience

• Go on and develop the backend for our new game

Works?

CTO says:

Page 18: Erlang, the big switch in social games

Pitch won!

• Develop proof of concept

• Hire 1 developer with erlang experience

• Go on and develop the backend for our new game

Works?

CTO says:

Yes!

Page 19: Erlang, the big switch in social games

How to hire erlang devs?

http://www.flickr.com/photos/legofenris/4499417549

Page 20: Erlang, the big switch in social games

Hiring

• mailing list

• Linkedin

• No agents

• No paid ads

Page 21: Erlang, the big switch in social games

Hiring

• 2 months

• Handful of applications with the right skills

• Hired one dev

Page 22: Erlang, the big switch in social games

Hiring

“I’m really experienced in _something else_ but I would like to learn and work with erlang”

We also got quite a few...

From people that are *good* for real

Page 23: Erlang, the big switch in social games

With

How to

http://www.flickr.com/photos/jakeandlindsay/5524669257/

Page 24: Erlang, the big switch in social games

getting started

Nice books around

Page 25: Erlang, the big switch in social games

getting started

http://www.erlang.org/doc

keytake(Key, N, TupleList1) -> {value, Tuple, TupleList2} | false

Types:

Key = term()N = 1..tuple_size(Tuple)TupleList1 = TupleList2 = [Tuple]Tuple = tuple()

Docs are complete, well written but sometime missing examples

Page 26: Erlang, the big switch in social games

getting started

gen_server, gen_tcp, gen_*

Very well documented and awesome by default

Page 27: Erlang, the big switch in social games

getting started

The rest of OTP was black magic and foggy until the book was published

Still official howtos and complete docs would be nice to have

Page 28: Erlang, the big switch in social games

Learn you some erlang[1]

• Hands on book

• Plenty of small examples

• Written with the beginners in mind

[1] http://learnyousomeerlang.com

getting started

Page 29: Erlang, the big switch in social games

Erlang tools

we’re usinghttp://www.flickr.com/photos/loonatic/3871627355

Page 30: Erlang, the big switch in social games

tools we’re using

• Dependency management

• Eunit integration

• Release packaging

• Enforces OTP standard

rebar

https://github.com/basho/rebar

Page 31: Erlang, the big switch in social games

tools we’re using

• not tested =:= not done

• Eunit is a complete unit testing framework

• No guidelines/tools for testing gen_servers

eunit

http://www.erlang.org/doc/apps/eunit/chapter.html

Page 32: Erlang, the big switch in social games

tools we’re using

• mocking framework

• Mock all module or nothing

• Works, but very limited

erlymock

https://github.com/nialscorva/erlymock

Page 33: Erlang, the big switch in social games

tools we’re using

• library for building lightweight HTTP servers

• Tiny amount of code

• Performs well

• Good match for minimalist REST API

misultin

https://github.com/ostinelli/misultin

Page 34: Erlang, the big switch in social games

tools we’re using

• Extended process registry for Erlang

• Used to map active users/sessions -> pids

• Works fine at 100K processes/node

• We use it only in local (single node) mode

gproc

https://github.com/esl/gproc

Page 35: Erlang, the big switch in social games

tools we’re using

• Multi protocol (HTTP, XMPP) benchmarking tool

• Synthetic load only way to “scale proof” new project

• Able to test non trivial call sequences

• Can actually simulate game play

tsung

http://tsung.erlang-projects.org/

Page 36: Erlang, the big switch in social games

tools we’re using

• Generates ~ 2500 reqs/sec on AWS m1.large

• Flexible but hard to extend

• Code base rather obscure, not hosted on github

tsung

http://tsung.erlang-projects.org/

Page 37: Erlang, the big switch in social games

Erlang brought with it few benefits we weren’t explicitly looking for...

Page 38: Erlang, the big switch in social games

Freebies

handle_call(Request, From, State) ->

NewState = mylib:myfun(State),

{reply, ok, NewState};

Immutability -> last sane state is always known and easily available

Transactions

Page 39: Erlang, the big switch in social games

Freebies

Transactions

• Immutability (erlang)

• Functional approach (erlang)

• Careful persistency side effects handling (you)

Page 40: Erlang, the big switch in social games

Freebies

Decoupling

HTTP

Application Logic

Persistency/DB

Page 41: Erlang, the big switch in social games

Freebies

Decoupling

• Switching from HTTP to sockets would take a day

• Changing persistency solution would take a day(data migration excluded)

• Both changes would leave application logic untouched

Page 42: Erlang, the big switch in social games

Freebies

Test a cluster on a box

• Multiple erlang nodes on a single machine

• Continuous integration for clustering logic!

• End to end test on a single box

Page 43: Erlang, the big switch in social games

Freebies

New point of view

• From the erlang point of view problems look different

• Approaches used in this project were ported to ruby projects

• Erlang makes for a good thinking exsercise

Page 44: Erlang, the big switch in social games

What we

of

Page 45: Erlang, the big switch in social games

what we like

Low level runtime infos

• erlang:statistics

• erlang:system_monitor

• erlang:process_info

Page 46: Erlang, the big switch in social games

what we like

Performance tweaks

• Efficiency guide[1]

• Control on initial process heap

• Garbage collection can be measured

[1] http://www.erlang.org/doc/efficiency_guide/introduction.html

Page 47: Erlang, the big switch in social games

what we like

“erlang-questions” mailing list

• Very active and responsive

• “Big guns” open to help

• Threads go in depth on interesting topics

Page 48: Erlang, the big switch in social games

what we like

Github

• Thanks for sharing your code on github!

• Lots of answers to “how is that done?”

• Growing collection of erlang libs

Page 49: Erlang, the big switch in social games

what we like

Github Tags Appeal

Please use tags on your github projects...

So we can bind rebar deps to a tag...

git  push  --tags

Page 50: Erlang, the big switch in social games

works well with erlang...

http://www.flickr.com/photos/legofenris/4563478042

Page 51: Erlang, the big switch in social games

works well with

Rake!

• Integration test tasks

• Continuous integration setup/teardown

• Other tasks specific to the project

Page 52: Erlang, the big switch in social games

works well with

Ruby test frameworks

• Flexible assertions

• Rapid modeling of API

• Low maintenance overhead

• Easy fixturing/mocking

Page 53: Erlang, the big switch in social games

works well with

Redis

“An open source, advanced key-value store”

• In memory key value store

• Optional on disk persistency

• Optional replication

Page 54: Erlang, the big switch in social games

works well with

Redis

Binary safe protocol

+Binary safe datatypes

Page 55: Erlang, the big switch in social games

works well with

Redis

200K ops/sec on a single thread

Serialization?

term_to_binary/1

binary_to_term/1

Page 56: Erlang, the big switch in social games

works well with

Cloud (AWS)

• Erlang understands clustering out of the box

• Nodes joining/leaving handling

• Async I/O to compensate high latency

• Cloud works better if you’re parallel

Page 57: Erlang, the big switch in social games

We’re missing...

Page 58: Erlang, the big switch in social games

we’re missing

HashMaps

user[:inventory][:food][:apples]

=> 1

User#user{inventory = Inventory}

...

Page 59: Erlang, the big switch in social games

we’re missing

packages à la CPAN rubygems...

Page 60: Erlang, the big switch in social games

we’re missing

also...github is great but which

one of 5 forks is the “authoritative” one?

Page 61: Erlang, the big switch in social games

we’re missing

will agnerA Giant Nebula of Erlang

Repositories be the answer?

http://erlagner.org

Page 62: Erlang, the big switch in social games

we’re missing

Live environment performance monitoring S.A.S.

ruby/java/phphave http://newrelic.com

erlang?

Page 63: Erlang, the big switch in social games

how is it going?

• On time so far

• Benchmarks look good

• Stay tuned... launch date approaching!