an erlang game stack

67
An Erlang Game Stack Erlang User Conference 2012 H. Diedrich Lua + Erlang + VoltDB http://www.eonblast.com – twitter @hdiedrich

Upload: others

Post on 12-Sep-2021

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: An Erlang Game Stack

Eonblast

An Erlang Game Stack

1

An Erlang Game Stack

Erlang User Conference 2012 H. Diedrich

Lua + Erlang + VoltDB

http://www.eonblast.com – twitter @hdiedrich

Page 2: An Erlang Game Stack

Eonblast

An Erlang Game Stack

2

Henning Diedrich

• Maintainer Emysql, Erlvolt, Erlualib • Eonblast: game + film • NewTracks: game + music • Bricks and mortar •  Insurance tariff language

Octocat says: try markedoc!

Page 3: An Erlang Game Stack

Eonblast

An Erlang Game Stack

3

Eonblast

Page 4: An Erlang Game Stack

Eonblast

An Erlang Game Stack

4

This Talk

• A game server architecture

•  Its components

• The glue

Page 5: An Erlang Game Stack

Eonblast

An Erlang Game Stack

5

This Talk

• Work in progress

• Unproven concepts

• Lies and conjecture andalso

• 3 genius tools

• 10,000 lines of glue code

Page 6: An Erlang Game Stack

Eonblast

An Erlang Game Stack

6

Questions

Please throw them in like Torben Mail me at hdiedrich at eonblast.com

Erlang Mailing List

Page 7: An Erlang Game Stack

Eonblast

An Erlang Game Stack

7

Erlang Game Servers

Zynga: FarmVille via membase, Activision Blizzard: Call of Duty, Bigpoint: Battle Star Galactica, Wooga: Magic Land

Page 8: An Erlang Game Stack

Eonblast

An Erlang Game Stack

8

Erlang + MySQL

http://eonblast.github.com/Emysql

Electronic Arts contributed emysql.

Page 9: An Erlang Game Stack

Eonblast

An Erlang Game Stack

9

The Hurt

• Leaks, Deadlocks • Bad Productivity • Game Design Language Gap • Less Features • Less Players • Lesser Product

Page 10: An Erlang Game Stack

Eonblast

An Erlang Game Stack

10

Target

„The perfect game server“ (makes no sense)

Page 11: An Erlang Game Stack

Eonblast

An Erlang Game Stack

11

Generals’ Problem

State

Two generals must agree on a time.

Page 12: An Erlang Game Stack

Eonblast

An Erlang Game Stack

12

Generals’ Problem

State

Send a messenger.

Page 13: An Erlang Game Stack

Eonblast

An Erlang Game Stack

13

Generals’ Problem

State

Acknowledge.

Page 14: An Erlang Game Stack

Eonblast

An Erlang Game Stack

14

Generals’ Problem

State

ACK the ACK. Etc.

Page 15: An Erlang Game Stack

Eonblast

An Erlang Game Stack

15

Generals’ Problem

State

The messenger may get lost.

Page 16: An Erlang Game Stack

Eonblast

An Erlang Game Stack

16

Byzantine Generals

State

The generals, too.

Page 17: An Erlang Game Stack

Eonblast

An Erlang Game Stack

17

The Hunt

Server Stack • Language

• Database

• Protocol

• Game Logic

Page 18: An Erlang Game Stack

Eonblast

An Erlang Game Stack

18

Spec

“Table Game” •  1 million active players •  1 million transactions per second •  1 second latency •  Linear scale •  100% data integrity

Page 19: An Erlang Game Stack

Eonblast

An Erlang Game Stack

19

Client Architecture

• Fat JavaScript Browser Client • COMET

Not discussed in this talk.

Page 20: An Erlang Game Stack

Eonblast

An Erlang Game Stack

20

Language

Wishlist • Robustness • Deadlock-free • Multi-core • Linear Scale

er?

Page 21: An Erlang Game Stack

Eonblast

An Erlang Game Stack

21

Database

CAP • Distributed • Consistent • Highly-available • Partition-tolerant

All of it!

Brewer on CAP 2012: http://www.infoq.com/articles/cap-twelve-years-later-how-the-rules-have-changed

Page 22: An Erlang Game Stack

Eonblast

An Erlang Game Stack

22

Database

ACID • Atomicity • Consistency •  Isolation • Durability For Granted?

Page 23: An Erlang Game Stack

Eonblast

An Erlang Game Stack

23

Database

Double Bookkeeping • Not every game needs it • Requires ACID Transactions • Neigh impossible to emulate •  Impossible with BASE /

Eventual Consistency

Page 24: An Erlang Game Stack

Eonblast

An Erlang Game Stack

24

Database

Upcoming Blog Post • Looking at 14 databases •  Riak, Cassandra, Membase, H-Base, Voldemort, MySQL, MySQL Cluster, Redis, Redis

Cluster, Tokyo Cabinet, Memcached, CouchDB, Couchbase, VoltDB, MongoDB, Postgres

•  In the light of what games need • Unbiased comparison • Twitter @hdiedrich

Page 25: An Erlang Game Stack

Eonblast

An Erlang Game Stack

25

Protocol

Wishlist • Small footprint • Fast to encode • Human-readable

Page 26: An Erlang Game Stack

Eonblast

An Erlang Game Stack

26

Logic

Wishlist • Human Readable • Stable • Fast • Concise • Small Footprint

Page 27: An Erlang Game Stack

Eonblast

An Erlang Game Stack

27

The Answers

• Client

• Protocol

• Server

• Logic

• Data Client: HTML5/JS, Protocol: JSON, Server: Erlang, Logic: Lua, Data: VoltDB.

Page 28: An Erlang Game Stack

Eonblast

An Erlang Game Stack

28

“Embeddable scripting language”

Page 29: An Erlang Game Stack

Eonblast

An Erlang Game Stack

29

Lua

”Lua is strange.“ R. Virding

“It has mutable variables, what more need I say.”

Page 30: An Erlang Game Stack

Eonblast

An Erlang Game Stack

30

Lua

a = “Roberto” if a ~= nil then print “Hello ” .. a .. “!” end

Page 31: An Erlang Game Stack

Eonblast

An Erlang Game Stack

31

Lua

• Created 1993 •  Simple, imperative syntax •  Stable syntax, stable VMs •  Two main VMs: ISO C, JIT • Game scripting champion • Open Source, 100% dictatorial*

*benevolent, of course

Site: http://www.lua.org List: [email protected]

Page 32: An Erlang Game Stack

Eonblast

An Erlang Game Stack

32

Lua

•  Made for non-programmers - imperative syntax •  Powerful for programmers - Scheme semantics •  Made for DSLs - extensible semantics •  Made to be extended - simple C API •  Made to be embedded - small VM footprint •  Now with a native Erlang VM!

Page 33: An Erlang Game Stack

Eonblast

An Erlang Game Stack

33

Lua Caveats

•  Deceiving Looks •  Encourages magic •  Simple but not for beginners •  Syntax forked •  Only one collection type

Page 34: An Erlang Game Stack

Eonblast

An Erlang Game Stack

34

Lua VMs

•  PUC Reference VM Lua 5.2

•  JIT VM

remains at Lua 5.1 adds extensions

•  Luerl

Lua 5.2 incomplete

pure ISO C super compatible

X86, ARM, PPC, MIPS super fast

native Erlang VM super stable

Page 35: An Erlang Game Stack

Eonblast

An Erlang Game Stack

35

Architecture

Page 36: An Erlang Game Stack

Eonblast

An Erlang Game Stack

36

Perceived reaction to asking about benchmarks on the Erlang mailing list.

Page 37: An Erlang Game Stack

Eonblast

An Erlang Game Stack

37

World State

State

Where does the state go? Into the Logic core, for speed.

Page 38: An Erlang Game Stack

Eonblast

An Erlang Game Stack

38

World State

State

State

State State State State

Page 39: An Erlang Game Stack

Eonblast

An Erlang Game Stack

39

World State

State

State

State State State State

Page 40: An Erlang Game Stack

Eonblast

An Erlang Game Stack

40

World State

State

State State State State

State

Page 41: An Erlang Game Stack

Eonblast

An Erlang Game Stack

41

World State

State

State State State State State

Page 42: An Erlang Game Stack

Eonblast

An Erlang Game Stack

42

“High Velocity Database”

Page 43: An Erlang Game Stack

Eonblast

An Erlang Game Stack

43

VoltDB • Created 2009 •  Simple SQL syntax •  Stable 2.5 • Commercial developer, support • High Velocity Secret Tip • Open Source, 100% dictatorial*

*benevolent, of course

Site: http://www.voltdb.com Help: http://community.voltdb.com/forum

Page 44: An Erlang Game Stack

Eonblast

An Erlang Game Stack

44

VoltDB

•  ACID transactions – double bookkeeping •  SQL – subset of '92 •  Linear scale - „unlimited“ data (but ...) •  Made for OLTP - fast, cheap writes, high throughput •  “More SQL than SQL” – invites clean sep. of data •  In-memory - 100x faster than MySQL •  Replication, Snapshots – 'hot backup built in'

Page 45: An Erlang Game Stack

Eonblast

An Erlang Game Stack

45

VoltDB Caveats

•  Less agile than MySQL/NoSQL • Need to understand partitions • Must program SPs in Java • Not elastic (yet) • No online schema change (yet) •  There is always a bottleneck •  Simple but not for beginners

Page 46: An Erlang Game Stack

Eonblast

An Erlang Game Stack

46

Horizonzal Partitions

State #

Page 47: An Erlang Game Stack

Eonblast

An Erlang Game Stack

47

Replication

State #

Page 48: An Erlang Game Stack

Eonblast

An Erlang Game Stack

48

Actual Connections

State State State State State

State

Page 49: An Erlang Game Stack

Eonblast

An Erlang Game Stack

49

The Mix

Erlang + Lua + VoltDB

Page 50: An Erlang Game Stack

Eonblast

An Erlang Game Stack

50

Page 51: An Erlang Game Stack

Eonblast

An Erlang Game Stack

51

Page 52: An Erlang Game Stack

Eonblast

An Erlang Game Stack

52

Page 53: An Erlang Game Stack

Eonblast

An Erlang Game Stack

53

The Packages

Erlvolt

Fleece

Erlualib

Luerl

Lua to JSON

Lua port

Lua VM

VoltDB driver

• Protocol

• Logic

• Logic

• Data

Page 54: An Erlang Game Stack

Eonblast

An Erlang Game Stack

54

Erlualib

•  Lua embedding library for Erlang •  Lua state in original PUC Lua VM • A fast way • A not secure way: can crash Erlang

Page 55: An Erlang Game Stack

Eonblast

An Erlang Game Stack

55

Erlualib

hello() -> % get handle of the Lua engine {ok, L} = lua:new_state(),

% put "print" global on top of stack lua:getfield(L, global, "print"),

% put hello on top lua:pushstring(L, "Hello from Lua!"),

% execute on top 2 values on stack lua:call(L, 1, 0).

Page 56: An Erlang Game Stack

Eonblast

An Erlang Game Stack

56

Erlualib

hello() -> {ok, L} = lua:new_state(),

lua:getfield(L, global, "print"),

lua:pushstring(L, "Hello from Lua!"),

lua:call(L, 1, 0).

Page 57: An Erlang Game Stack

Eonblast

An Erlang Game Stack

57

Luerl

• New Lua VM programmed in Erlang • Perfectly secure way • Precompiled Chunks • Re-usable State • Work in progress

Page 58: An Erlang Game Stack

Eonblast

An Erlang Game Stack

58

Luerl

hello() -> L = luerl:init(),

luerl:do("print('Hello from Lua!')", L).

Page 59: An Erlang Game Stack

Eonblast

An Erlang Game Stack

59

Luerl

hello() -> L = luerl:init(),

Chunk = luerl:eval("print('Hello from Lua!')", L), luerl:call(Chunk, L) % Chunk and L can be re-used.

Page 60: An Erlang Game Stack

Eonblast

An Erlang Game Stack

60

Benchmark Luerl vs Erlualib

Erlualib / PUC Luerl 270 µs state Init 250 µs 10 µs parse 1 + 1 15 µs 2.5 µs execute 1 + 1 13 µs 23 µs parse formula 63 µs 2.5 µs execute formula 35 µs 2.5 µs call a function 28 µs Formula: a = 7.33; b = 9000; c = (33 * a / b) ^ 15 * a + b

Page 61: An Erlang Game Stack

Eonblast

An Erlang Game Stack

61

Fast Lua to JSON encoder

Page 62: An Erlang Game Stack

Eonblast

An Erlang Game Stack

62

Fleece

•  Fastest Lua JSON encoder • C+ASM or ISO C •  Faster than Lua JIT •  Faster than concat •  10x faster than other fastest

Page 63: An Erlang Game Stack

Eonblast

An Erlang Game Stack

63

Page 64: An Erlang Game Stack

Eonblast

An Erlang Game Stack

64

Erlvolt

• Native Erlang VoltDB driver • Async parallel data shuffling • Coming next quarter •  Your help is wanted • Connect over github

Page 65: An Erlang Game Stack

Eonblast

An Erlang Game Stack

65

Server Architecture

• Erlang • Lua • JSON • VoltDB

• Luerl • Erlualib • Fleece • Erlvolt

Page 66: An Erlang Game Stack

Eonblast

An Erlang Game Stack

66

Invitation

• All at github • All w/samples & docs • All maintained by Eonblast • Luerl maintained by R. Virding • Updates @hdiedrich, @rvirding

Page 67: An Erlang Game Stack

Eonblast

An Erlang Game Stack

67

Questions

Mail: hdiedrich ∂ eonblast.com

Skype: eonblast Twitter: @hdiedrich