SlideShare a Scribd company logo
1 of 64
Download to read offline
Erlang, the big switch in
     social games
    Paolo Negri @hungryblank
About this talk
Erlang adoption @


  how we did it
and what we found
Social Games

• Run in the browser
• Published on social networks
• Popularity measured in millions of daily
  users
Social Games
Flash client (game)   HTTP API
Social Games
Flash client


               • Game actions need to be
                 persisted and validated

               • 1 API call every 2 secs
Social Games
                            HTTP API



• @ 1 000 000 daily users
• 5000 HTTP reqs/sec
• more than 90% writes
Social Games @wooga
                   HTTP API
• 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
The hard nut


http://www.flickr.com/photos/mukluk/315409445/
The hard nut
           60K queries/sec
           Read/Write ~ 1


@ 1mln daily users your SQL /
NOSQL data layer is the main technical
challenge
The hard nut roots
 Stateless app servers

     • very easy to scale (add one more)
     • easy to develop
     • Plenty of ready frameworks
The hard nut roots
 Stateless app servers

     • high pressure on data layer
     • extreme query/req optimization
       means heavy refactoring
     • query/req of 2 best possible ratio
The case for erlang

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

“What about application servers that
understand and represent efficiently the
concept of a gaming session?”
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
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
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”
Pitch won!
 CTO says:

• Develop proof of concept
                             Works?

• Hire 1 developer with erlang experience
• Go on and develop the backend for our new
  game
Pitch won!
 CTO says:

• Develop proof of concept
                             Works?
                                      Yes!
• Hire 1 developer with erlang experience
• Go on and develop the backend for our new
  game
How to hire erlang devs?




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

• mailing list
• Linkedin
• No agents
• No paid ads
Hiring


• 2 months
• Handful of applications with the right skills
• Hired one dev
Hiring
We also got quite a few...
“I’m really experienced in _something
else_ but I would like to learn and work
with erlang”
From people that are *good* for real
How to



http://www.flickr.com/photos/jakeandlindsay/5524669257/
                                                         With
getting started
Nice books around
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
getting started

gen_server, gen_tcp, gen_*
Very well documented and awesome by
default
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
getting started

                Learn you some erlang     [1]




        • Hands on book
        • Plenty of small examples
        • Written with the beginners in mind
[1] http://learnyousomeerlang.com
Erlang tools




                                                  we’re using
http://www.flickr.com/photos/loonatic/3871627355
tools we’re using
                                 rebar

         • Dependency management
         • Eunit integration
         • Release packaging
         • Enforces OTP standard
https://github.com/basho/rebar
tools we’re using
                                         eunit

        • not tested =:= not done
        • Eunit is a complete unit testing framework
        • No guidelines/tools for testing gen_servers
http://www.erlang.org/doc/apps/eunit/chapter.html
tools we’re using
                                  erlymock

         • mocking framework
         • Mock all module or nothing
         • Works, but very limited
https://github.com/nialscorva/erlymock
tools we’re using
                                        misultin
       • library for building lightweight HTTP servers
       • Tiny amount of code
       • Performs well
       • Good match for minimalist REST API
https://github.com/ostinelli/misultin
tools we’re using
                                  gproc
         • 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
https://github.com/esl/gproc
tools we’re using
                                    tsung
         •    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


http://tsung.erlang-projects.org/
tools we’re using
                                    tsung

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

         •    Flexible but hard to extend

         •    Code base rather obscure, not hosted on github



http://tsung.erlang-projects.org/
Erlang
brought
with it few
benefits we
weren’t
explicitly
looking
for...
Freebies

                 Transactions
handle_call(Request, From, State) ->
    NewState = mylib:myfun(State),
    {reply, ok, NewState};




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

               Transactions

• Immutability (erlang)
• Functional approach (erlang)
• Careful persistency side effects handling (you)
Freebies

Decoupling
     HTTP

Application Logic

 Persistency/DB
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
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
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
What we
          of
what we like

    Low level runtime infos

• erlang:statistics
• erlang:system_monitor
• erlang:process_info
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
what we like

 “erlang-questions” mailing list

• Very active and responsive
• “Big guns” open to help
• Threads go in depth on interesting topics
what we like

                 Github

• Thanks for sharing your code on github!
• Lots of answers to “how is that done?”
• Growing collection of erlang libs
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
works well with erlang...




http://www.flickr.com/photos/legofenris/4563478042
works well with
                 Rake!

• Integration test tasks
• Continuous integration setup/teardown
• Other tasks specific to the project
works well with
     Ruby test frameworks
• Flexible assertions
• Rapid modeling of API
• Low maintenance overhead
• Easy fixturing/mocking
works well with
                  Redis
  “An open source, advanced key-value store”
• In memory key value store
• Optional on disk persistency
• Optional replication
works well with
         Redis
    Binary safe protocol

            +
   Binary safe datatypes
works well with
            Redis

  200K ops/sec on a single thread
           Serialization?
     term_to_binary/1
     binary_to_term/1
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
We’re missing...
we’re missing
        HashMaps

user[:inventory][:food][:apples]
             => 1
User#user{inventory = Inventory}
              ...
we’re missing


packages à la CPAN
    rubygems...
we’re missing

           also...
github is great but which
   one of 5 forks is the
   “authoritative” one?
we’re missing
       will agner
A Giant Nebula of Erlang
  Repositories be the
        answer?
   http://erlagner.org
we’re missing

Live environment performance
       monitoring S.A.S.

       ruby/java/php
  have http://newrelic.com
           erlang?
how is it going?

• On time so far
• Benchmarks look good
• Stay tuned... launch date approaching!
Thanks!

http://www.wooga.com/jobs
 paolo.negri@wooga.com
     @hungryblank

More Related Content

What's hot

Storm presentation
Storm presentationStorm presentation
Storm presentationShyam Raj
 
Analysis big data by use php with storm
Analysis big data by use php with stormAnalysis big data by use php with storm
Analysis big data by use php with storm毅 吕
 
Akka-chan's Survival Guide for the Streaming World
Akka-chan's Survival Guide for the Streaming WorldAkka-chan's Survival Guide for the Streaming World
Akka-chan's Survival Guide for the Streaming WorldKonrad Malawski
 
Python Raster Function - Esri Developer Conference - 2015
Python Raster Function - Esri Developer Conference - 2015Python Raster Function - Esri Developer Conference - 2015
Python Raster Function - Esri Developer Conference - 2015akferoz07
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Andrei KUCHARAVY
 
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
Kubernetes at NU.nl   (Kubernetes meetup 2019-09-05)Kubernetes at NU.nl   (Kubernetes meetup 2019-09-05)
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)Tibo Beijen
 
Atlanta Hadoop Users Meetup 09 21 2016
Atlanta Hadoop Users Meetup 09 21 2016Atlanta Hadoop Users Meetup 09 21 2016
Atlanta Hadoop Users Meetup 09 21 2016Chris Fregly
 
Understanding Akka Streams, Back Pressure, and Asynchronous Architectures
Understanding Akka Streams, Back Pressure, and Asynchronous ArchitecturesUnderstanding Akka Streams, Back Pressure, and Asynchronous Architectures
Understanding Akka Streams, Back Pressure, and Asynchronous ArchitecturesLightbend
 
Webinar: Queues with RabbitMQ - Lorna Mitchell
Webinar: Queues with RabbitMQ - Lorna MitchellWebinar: Queues with RabbitMQ - Lorna Mitchell
Webinar: Queues with RabbitMQ - Lorna MitchellCodemotion
 
John adams talk cloudy
John adams   talk cloudyJohn adams   talk cloudy
John adams talk cloudyJohn Adams
 
Introduction to Apache Storm - Concept & Example
Introduction to Apache Storm - Concept & ExampleIntroduction to Apache Storm - Concept & Example
Introduction to Apache Storm - Concept & ExampleDung Ngua
 
Benchmarking at Parse
Benchmarking at ParseBenchmarking at Parse
Benchmarking at ParseTravis Redman
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)Panagiotis Kanavos
 
Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)Jeremy Edberg
 
Akka.net versus microsoft orleans
Akka.net versus microsoft orleansAkka.net versus microsoft orleans
Akka.net versus microsoft orleansBill Tulloch
 

What's hot (16)

Storm presentation
Storm presentationStorm presentation
Storm presentation
 
Analysis big data by use php with storm
Analysis big data by use php with stormAnalysis big data by use php with storm
Analysis big data by use php with storm
 
Akka-chan's Survival Guide for the Streaming World
Akka-chan's Survival Guide for the Streaming WorldAkka-chan's Survival Guide for the Streaming World
Akka-chan's Survival Guide for the Streaming World
 
Python Raster Function - Esri Developer Conference - 2015
Python Raster Function - Esri Developer Conference - 2015Python Raster Function - Esri Developer Conference - 2015
Python Raster Function - Esri Developer Conference - 2015
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1
 
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
Kubernetes at NU.nl   (Kubernetes meetup 2019-09-05)Kubernetes at NU.nl   (Kubernetes meetup 2019-09-05)
Kubernetes at NU.nl (Kubernetes meetup 2019-09-05)
 
Atlanta Hadoop Users Meetup 09 21 2016
Atlanta Hadoop Users Meetup 09 21 2016Atlanta Hadoop Users Meetup 09 21 2016
Atlanta Hadoop Users Meetup 09 21 2016
 
Understanding Akka Streams, Back Pressure, and Asynchronous Architectures
Understanding Akka Streams, Back Pressure, and Asynchronous ArchitecturesUnderstanding Akka Streams, Back Pressure, and Asynchronous Architectures
Understanding Akka Streams, Back Pressure, and Asynchronous Architectures
 
Apache Storm
Apache StormApache Storm
Apache Storm
 
Webinar: Queues with RabbitMQ - Lorna Mitchell
Webinar: Queues with RabbitMQ - Lorna MitchellWebinar: Queues with RabbitMQ - Lorna Mitchell
Webinar: Queues with RabbitMQ - Lorna Mitchell
 
John adams talk cloudy
John adams   talk cloudyJohn adams   talk cloudy
John adams talk cloudy
 
Introduction to Apache Storm - Concept & Example
Introduction to Apache Storm - Concept & ExampleIntroduction to Apache Storm - Concept & Example
Introduction to Apache Storm - Concept & Example
 
Benchmarking at Parse
Benchmarking at ParseBenchmarking at Parse
Benchmarking at Parse
 
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)Parallel and Asynchronous Programming -  ITProDevConnections 2012 (Greek)
Parallel and Asynchronous Programming - ITProDevConnections 2012 (Greek)
 
Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)Devops at Netflix (re:Invent)
Devops at Netflix (re:Invent)
 
Akka.net versus microsoft orleans
Akka.net versus microsoft orleansAkka.net versus microsoft orleans
Akka.net versus microsoft orleans
 

Similar to Erlang factory SF 2011 "Erlang and the big switch in social games"

Erlang: TL;DR
Erlang: TL;DRErlang: TL;DR
Erlang: TL;DRvorn
 
Erlang - Dive Right In
Erlang - Dive Right InErlang - Dive Right In
Erlang - Dive Right Invorn
 
Repeating History...On Purpose...with Elixir
Repeating History...On Purpose...with ElixirRepeating History...On Purpose...with Elixir
Repeating History...On Purpose...with ElixirBarry Jones
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threadsmperham
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and AbstractionsMetosin Oy
 
Fi fo euc 2014
Fi fo euc 2014Fi fo euc 2014
Fi fo euc 2014Licenser
 
From Test to Live with Rex
From Test to Live with RexFrom Test to Live with Rex
From Test to Live with RexJan Gehring
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Newlink
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Newlink
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640LLC NewLink
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Newlink
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Newlink
 
Intro to elixir and phoenix
Intro to elixir and phoenixIntro to elixir and phoenix
Intro to elixir and phoenixJared Smith
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for RubyistsDoug Goldie
 
Distributed Erlang Systems In Operation
Distributed Erlang Systems In OperationDistributed Erlang Systems In Operation
Distributed Erlang Systems In OperationAndy Gross
 
Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Hannes Lowette
 
Software Engineering in Startups
Software Engineering in StartupsSoftware Engineering in Startups
Software Engineering in StartupsDusan Omercevic
 

Similar to Erlang factory SF 2011 "Erlang and the big switch in social games" (20)

Erlang: TL;DR
Erlang: TL;DRErlang: TL;DR
Erlang: TL;DR
 
Erlang - Dive Right In
Erlang - Dive Right InErlang - Dive Right In
Erlang - Dive Right In
 
Repeating History...On Purpose...with Elixir
Repeating History...On Purpose...with ElixirRepeating History...On Purpose...with Elixir
Repeating History...On Purpose...with Elixir
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threads
 
Cucumber in Practice(en)
Cucumber in Practice(en)Cucumber in Practice(en)
Cucumber in Practice(en)
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and Abstractions
 
Fi fo euc 2014
Fi fo euc 2014Fi fo euc 2014
Fi fo euc 2014
 
From Test to Live with Rex
From Test to Live with RexFrom Test to Live with Rex
From Test to Live with Rex
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640
 
Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640Xen and-the-art-of-rails-deployment2640
Xen and-the-art-of-rails-deployment2640
 
A sip of Elixir
A sip of ElixirA sip of Elixir
A sip of Elixir
 
Intro to elixir and phoenix
Intro to elixir and phoenixIntro to elixir and phoenix
Intro to elixir and phoenix
 
MPI, Erlang and the web
MPI, Erlang and the webMPI, Erlang and the web
MPI, Erlang and the web
 
Phoenix for Rubyists
Phoenix for RubyistsPhoenix for Rubyists
Phoenix for Rubyists
 
Distributed Erlang Systems In Operation
Distributed Erlang Systems In OperationDistributed Erlang Systems In Operation
Distributed Erlang Systems In Operation
 
Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®Build software like a bag of marbles, not a castle of LEGO®
Build software like a bag of marbles, not a castle of LEGO®
 
Software Engineering in Startups
Software Engineering in StartupsSoftware Engineering in Startups
Software Engineering in Startups
 

More from Paolo Negri

Turning the web stack upside down rethinking how data flows through systems
Turning the web stack upside down  rethinking how data flows through systemsTurning the web stack upside down  rethinking how data flows through systems
Turning the web stack upside down rethinking how data flows through systemsPaolo Negri
 
AWS Lambda in infrastructure
AWS Lambda in infrastructureAWS Lambda in infrastructure
AWS Lambda in infrastructurePaolo Negri
 
Erlang introduction geek2geek Berlin
Erlang introduction geek2geek BerlinErlang introduction geek2geek Berlin
Erlang introduction geek2geek BerlinPaolo Negri
 
Getting real with erlang
Getting real with erlangGetting real with erlang
Getting real with erlangPaolo Negri
 
Scaling Social Games
Scaling Social GamesScaling Social Games
Scaling Social GamesPaolo Negri
 
Mongrel2, a short introduction
Mongrel2, a short introductionMongrel2, a short introduction
Mongrel2, a short introductionPaolo Negri
 
RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009Paolo Negri
 
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...Paolo Negri
 
SimpleDb, an introduction
SimpleDb, an introductionSimpleDb, an introduction
SimpleDb, an introductionPaolo Negri
 
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim CrontabsPaolo Negri
 

More from Paolo Negri (10)

Turning the web stack upside down rethinking how data flows through systems
Turning the web stack upside down  rethinking how data flows through systemsTurning the web stack upside down  rethinking how data flows through systems
Turning the web stack upside down rethinking how data flows through systems
 
AWS Lambda in infrastructure
AWS Lambda in infrastructureAWS Lambda in infrastructure
AWS Lambda in infrastructure
 
Erlang introduction geek2geek Berlin
Erlang introduction geek2geek BerlinErlang introduction geek2geek Berlin
Erlang introduction geek2geek Berlin
 
Getting real with erlang
Getting real with erlangGetting real with erlang
Getting real with erlang
 
Scaling Social Games
Scaling Social GamesScaling Social Games
Scaling Social Games
 
Mongrel2, a short introduction
Mongrel2, a short introductionMongrel2, a short introduction
Mongrel2, a short introduction
 
RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009RabbitMQ with python and ruby RuPy 2009
RabbitMQ with python and ruby RuPy 2009
 
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
Distributed and concurrent programming with RabbitMQ and EventMachine Rails U...
 
SimpleDb, an introduction
SimpleDb, an introductionSimpleDb, an introduction
SimpleDb, an introduction
 
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
%w(map reduce).first - A Tale About Rabbits, Latency, and Slim Crontabs
 

Recently uploaded

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 

Recently uploaded (20)

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 

Erlang factory SF 2011 "Erlang and the big switch in social games"

  • 1. Erlang, the big switch in social games Paolo Negri @hungryblank
  • 2. About this talk Erlang adoption @ how we did it and what we found
  • 3. Social Games • Run in the browser • Published on social networks • Popularity measured in millions of daily users
  • 4. Social Games Flash client (game) HTTP API
  • 5. Social Games Flash client • Game actions need to be persisted and validated • 1 API call every 2 secs
  • 6. Social Games HTTP API • @ 1 000 000 daily users • 5000 HTTP reqs/sec • more than 90% writes
  • 7. Social Games @wooga HTTP API • 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
  • 9. The hard nut 60K queries/sec Read/Write ~ 1 @ 1mln daily users your SQL / NOSQL data layer is the main technical challenge
  • 10. The hard nut roots Stateless app servers • very easy to scale (add one more) • easy to develop • Plenty of ready frameworks
  • 11. The hard nut roots Stateless app servers • high pressure on data layer • extreme query/req optimization means heavy refactoring • query/req of 2 best possible ratio
  • 12. The case for erlang “A gaming session is a stream of close requests altering repeatedly the same game state”
  • 13. The case for erlang “What about application servers that understand and represent efficiently the concept of a gaming session?”
  • 14. 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
  • 15. 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
  • 16. 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”
  • 17. Pitch won! CTO says: • Develop proof of concept Works? • Hire 1 developer with erlang experience • Go on and develop the backend for our new game
  • 18. Pitch won! CTO says: • Develop proof of concept Works? Yes! • Hire 1 developer with erlang experience • Go on and develop the backend for our new game
  • 19. How to hire erlang devs? http://www.flickr.com/photos/legofenris/4499417549
  • 20. Hiring • mailing list • Linkedin • No agents • No paid ads
  • 21. Hiring • 2 months • Handful of applications with the right skills • Hired one dev
  • 22. Hiring We also got quite a few... “I’m really experienced in _something else_ but I would like to learn and work with erlang” From people that are *good* for real
  • 25. 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
  • 26. getting started gen_server, gen_tcp, gen_* Very well documented and awesome by default
  • 27. 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
  • 28. getting started Learn you some erlang [1] • Hands on book • Plenty of small examples • Written with the beginners in mind [1] http://learnyousomeerlang.com
  • 29. Erlang tools we’re using http://www.flickr.com/photos/loonatic/3871627355
  • 30. tools we’re using rebar • Dependency management • Eunit integration • Release packaging • Enforces OTP standard https://github.com/basho/rebar
  • 31. tools we’re using eunit • not tested =:= not done • Eunit is a complete unit testing framework • No guidelines/tools for testing gen_servers http://www.erlang.org/doc/apps/eunit/chapter.html
  • 32. tools we’re using erlymock • mocking framework • Mock all module or nothing • Works, but very limited https://github.com/nialscorva/erlymock
  • 33. tools we’re using misultin • library for building lightweight HTTP servers • Tiny amount of code • Performs well • Good match for minimalist REST API https://github.com/ostinelli/misultin
  • 34. tools we’re using gproc • 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 https://github.com/esl/gproc
  • 35. tools we’re using tsung • 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 http://tsung.erlang-projects.org/
  • 36. tools we’re using tsung • Generates ~ 2500 reqs/sec on AWS m1.large • Flexible but hard to extend • Code base rather obscure, not hosted on github http://tsung.erlang-projects.org/
  • 37. Erlang brought with it few benefits we weren’t explicitly looking for...
  • 38. Freebies Transactions handle_call(Request, From, State) -> NewState = mylib:myfun(State), {reply, ok, NewState}; Immutability -> last sane state is always known and easily available
  • 39. Freebies Transactions • Immutability (erlang) • Functional approach (erlang) • Careful persistency side effects handling (you)
  • 40. Freebies Decoupling HTTP Application Logic Persistency/DB
  • 41. 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
  • 42. 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
  • 43. 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
  • 44. What we of
  • 45. what we like Low level runtime infos • erlang:statistics • erlang:system_monitor • erlang:process_info
  • 46. 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
  • 47. what we like “erlang-questions” mailing list • Very active and responsive • “Big guns” open to help • Threads go in depth on interesting topics
  • 48. what we like Github • Thanks for sharing your code on github! • Lots of answers to “how is that done?” • Growing collection of erlang libs
  • 49. 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
  • 50. works well with erlang... http://www.flickr.com/photos/legofenris/4563478042
  • 51. works well with Rake! • Integration test tasks • Continuous integration setup/teardown • Other tasks specific to the project
  • 52. works well with Ruby test frameworks • Flexible assertions • Rapid modeling of API • Low maintenance overhead • Easy fixturing/mocking
  • 53. works well with Redis “An open source, advanced key-value store” • In memory key value store • Optional on disk persistency • Optional replication
  • 54. works well with Redis Binary safe protocol + Binary safe datatypes
  • 55. works well with Redis 200K ops/sec on a single thread Serialization? term_to_binary/1 binary_to_term/1
  • 56. 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
  • 58. we’re missing HashMaps user[:inventory][:food][:apples] => 1 User#user{inventory = Inventory} ...
  • 59. we’re missing packages à la CPAN rubygems...
  • 60. we’re missing also... github is great but which one of 5 forks is the “authoritative” one?
  • 61. we’re missing will agner A Giant Nebula of Erlang Repositories be the answer? http://erlagner.org
  • 62. we’re missing Live environment performance monitoring S.A.S. ruby/java/php have http://newrelic.com erlang?
  • 63. how is it going? • On time so far • Benchmarks look good • Stay tuned... launch date approaching!