Erlang + EDTK + BDB: Disrupting the Web Margo Seltzer Architect
What kind  of talk is this? Evangelism FUD Fun
Erlang  + EDTK + BDB: Huh? General purpose programming language Runtime system Developed by Ericsson Open source Key feature: designed for ease of developing highly-reliable, highly-concurrent systems Enables highly robust applications: The AXD 301 includes 2 million  lines of Erlang Reliability: NINE 9’s
Erlang +  EDTK  + BDB: Huh? Erlang Driver Toolkit Declarative APIs to external library Automatic wrapper generation Tracks library resources and cleans up Enhanced for BDB support: Supports Erlang’s “crash early” error-handling model (supervisors) Meshes Erlang-style concurrency with BDB concurrency (private thread pools) Adds significant convenience layers for configration and replication Minimal overhead
Erlang + EDTK +  BDB : Huh? Berkeley Database Database functionality … Transactions Recovery Replication …  in a different package Library linked directly into an application Programmatic APIs Schemaless: key/data pairs
Disruptive Technology “ a technological innovation, product, or service that eventually overturns the existing dominant technology or status quo product in the market.” -- Wikipedia
Outline Interpreting the Title Disecting an Internet Service Erlang, it’s philosophy and runtime Putting it all together Q&A
An Internet Service Clients Load  Balancer .NET Java The Internet App Servers Database Servers
An Internet Service Clients Load  Balancer .NET Java CGI PHP LISP Perl The Internet Database Servers
An Internet Service Clients Load  Balancer BDB CGI Perl Application Code The Internet Servers
The Software Architecture In any case, your software is a mess Gazillion Active Ports Fraction of a gazillion threads A relatively small number of disks
Outline Interpreting the Title Disecting an Internet Service Erlang, it’s philosophy and runtime Putting it all together Q&A
The Erlang Approach Don’t fight the problem Don’t fight the medium (the network) Don’t fight the medium (distributed software)
Don’t Fight the Problem 1:1 concurrency with the problem/solution domain Explicit lightweight stateful conversations (addressable processes) Arbitrarily rich messages
Don’t Fight the the Network Asynchronous send (location-agnostic send and pray) Ordered inbox per process Blocking receive with timeout (message-selection via pattern-matching)
Don’t Fight Distributed Software No shared memory: no mutexes, no mutation True loose-coupling: processes are free to migrate Safe to kill any process any time Recovery-oriented computing (before it was fashionable) Let it crash Propagate exceptions Know how to recover
Erlang Tricks: Processes Belong to the language (runtime), not OS Very lightweight Immutable data  Asynchronous message passing Upgrade application on live, running system Implication: No big deal if a process dies
Erlang Tricks: Links Links connect processes On process crash, all linked processes get message. Notified processes can clean up, takeover, do whatever is necessary. Easy to create supervisors No recovery: just crash, cleanup and restart
Erlang Tricks: Concurrency Use concurrency to structure the application “ My first message is that concurrency is best regarded as a program structuring principle” Tony Hoare, 2001 Concurrency-oriented programming Share nothing Pure message passing Let it crash
Erlang Nuts and Bolts Hello World -module(hello). -export(hello_world/0). hello_world() -> io:format(“Hello world.~n”, []). Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.5.5  (abort with ^G) 1> c(hello). {ok,hello} 2> hello:hello_world(). Hello world. ok 3>
Spawning Processes Pid = spawn(module, function, args). For example: Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.5.5  (abort with ^G) 1> spawn(hello, hello_world, []). <0.32.0>Hello world. 2>
Message send and receive Send: Pid ! message. Receive: receive Pattern1 [when Guard1] -> Expression1; Pattern2 [when Guard2] -> Expression2; … end
Send/Receive Example -module(food). -export([dinner/0]). dinner() -> receive sunday -> io:format(&quot;Sunday is fish.~n&quot;, []), dinner(); monday -> io:format(&quot;Monday is chicken.~n&quot;, []), dinner(); tuesday -> io:format(&quot;Tuesday is beef.~n&quot;, []), dinner(); Other -> io:format(&quot;Time to go home.~n&quot;, []) end.
Send/Receive Execution Eshell V5.5.5  (abort with ^G) 1> Pid = spawn(food, dinner, []). <0.32.0> 2> Pid ! tuesday. tuesdayTuesday is beef. 3> Pid ! sunday. sundaySunday is fish. 4> Pid ! wednesday. wednesdayTime to go home. 5> Pid ! monday. monday 6>
BDB in Erlang Erlang: Is Functional (not procedural) Communicates via messages Communicates asynchronously BDB: Is Procedural Communicates via shared memory Blocks on locks/IO/etc
EDTK fixes mismatch Erlang interfaces to outside world via ports. EDTK automatically generates code that wraps library API, making library look like Erlang process(es). Provides framework to: Clean up BDB resources after a crash Manage threadpools to deal with BDB blocking Manage administrative processes Manage replication groups
And the code looks like BDB DB = ?BDB:db_create(Port, []). ?BDB:db_open(Port, DB, void, “database”, “”, bdb_DB_BTREE, [bdb_DB_CREATE, 8#644). ?BDB:db_put(Port, DB, void “foo”, “foodata”, []). {Key, Data} = ?BDB:db_get(Port,  DB, void, “foo”, <<>>, []). ?BDB:db_close(Port, DB, []).
Outline Interpreting the Title Disecting an Internet Service Erlang, it’s philosophy and runtime Putting it all together Q&A
An Internet Service Clients Load  Balancer Servers The Internet
How does it Perform? From: http://www.sics.se/~joe/apachevsyaws.html
Acknowledgements Joe Armstrong (Erlang) Scott Lystig Fritchie (EDTK) Chris Newcombe (EDTK extensions for BDB)
A Q &
 

Erlang plus BDB: Disrupting the Conventional Web Wisdom

  • 1.
  • 2.
  • 3.
    Erlang + EDTK+ BDB: Disrupting the Web Margo Seltzer Architect
  • 4.
    What kind of talk is this? Evangelism FUD Fun
  • 5.
    Erlang +EDTK + BDB: Huh? General purpose programming language Runtime system Developed by Ericsson Open source Key feature: designed for ease of developing highly-reliable, highly-concurrent systems Enables highly robust applications: The AXD 301 includes 2 million lines of Erlang Reliability: NINE 9’s
  • 6.
    Erlang + EDTK + BDB: Huh? Erlang Driver Toolkit Declarative APIs to external library Automatic wrapper generation Tracks library resources and cleans up Enhanced for BDB support: Supports Erlang’s “crash early” error-handling model (supervisors) Meshes Erlang-style concurrency with BDB concurrency (private thread pools) Adds significant convenience layers for configration and replication Minimal overhead
  • 7.
    Erlang + EDTK+ BDB : Huh? Berkeley Database Database functionality … Transactions Recovery Replication … in a different package Library linked directly into an application Programmatic APIs Schemaless: key/data pairs
  • 8.
    Disruptive Technology “a technological innovation, product, or service that eventually overturns the existing dominant technology or status quo product in the market.” -- Wikipedia
  • 9.
    Outline Interpreting theTitle Disecting an Internet Service Erlang, it’s philosophy and runtime Putting it all together Q&A
  • 10.
    An Internet ServiceClients Load Balancer .NET Java The Internet App Servers Database Servers
  • 11.
    An Internet ServiceClients Load Balancer .NET Java CGI PHP LISP Perl The Internet Database Servers
  • 12.
    An Internet ServiceClients Load Balancer BDB CGI Perl Application Code The Internet Servers
  • 13.
    The Software ArchitectureIn any case, your software is a mess Gazillion Active Ports Fraction of a gazillion threads A relatively small number of disks
  • 14.
    Outline Interpreting theTitle Disecting an Internet Service Erlang, it’s philosophy and runtime Putting it all together Q&A
  • 15.
    The Erlang ApproachDon’t fight the problem Don’t fight the medium (the network) Don’t fight the medium (distributed software)
  • 16.
    Don’t Fight theProblem 1:1 concurrency with the problem/solution domain Explicit lightweight stateful conversations (addressable processes) Arbitrarily rich messages
  • 17.
    Don’t Fight thethe Network Asynchronous send (location-agnostic send and pray) Ordered inbox per process Blocking receive with timeout (message-selection via pattern-matching)
  • 18.
    Don’t Fight DistributedSoftware No shared memory: no mutexes, no mutation True loose-coupling: processes are free to migrate Safe to kill any process any time Recovery-oriented computing (before it was fashionable) Let it crash Propagate exceptions Know how to recover
  • 19.
    Erlang Tricks: ProcessesBelong to the language (runtime), not OS Very lightweight Immutable data Asynchronous message passing Upgrade application on live, running system Implication: No big deal if a process dies
  • 20.
    Erlang Tricks: LinksLinks connect processes On process crash, all linked processes get message. Notified processes can clean up, takeover, do whatever is necessary. Easy to create supervisors No recovery: just crash, cleanup and restart
  • 21.
    Erlang Tricks: ConcurrencyUse concurrency to structure the application “ My first message is that concurrency is best regarded as a program structuring principle” Tony Hoare, 2001 Concurrency-oriented programming Share nothing Pure message passing Let it crash
  • 22.
    Erlang Nuts andBolts Hello World -module(hello). -export(hello_world/0). hello_world() -> io:format(“Hello world.~n”, []). Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.5.5 (abort with ^G) 1> c(hello). {ok,hello} 2> hello:hello_world(). Hello world. ok 3>
  • 23.
    Spawning Processes Pid= spawn(module, function, args). For example: Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.5.5 (abort with ^G) 1> spawn(hello, hello_world, []). <0.32.0>Hello world. 2>
  • 24.
    Message send andreceive Send: Pid ! message. Receive: receive Pattern1 [when Guard1] -> Expression1; Pattern2 [when Guard2] -> Expression2; … end
  • 25.
    Send/Receive Example -module(food).-export([dinner/0]). dinner() -> receive sunday -> io:format(&quot;Sunday is fish.~n&quot;, []), dinner(); monday -> io:format(&quot;Monday is chicken.~n&quot;, []), dinner(); tuesday -> io:format(&quot;Tuesday is beef.~n&quot;, []), dinner(); Other -> io:format(&quot;Time to go home.~n&quot;, []) end.
  • 26.
    Send/Receive Execution EshellV5.5.5 (abort with ^G) 1> Pid = spawn(food, dinner, []). <0.32.0> 2> Pid ! tuesday. tuesdayTuesday is beef. 3> Pid ! sunday. sundaySunday is fish. 4> Pid ! wednesday. wednesdayTime to go home. 5> Pid ! monday. monday 6>
  • 27.
    BDB in ErlangErlang: Is Functional (not procedural) Communicates via messages Communicates asynchronously BDB: Is Procedural Communicates via shared memory Blocks on locks/IO/etc
  • 28.
    EDTK fixes mismatchErlang interfaces to outside world via ports. EDTK automatically generates code that wraps library API, making library look like Erlang process(es). Provides framework to: Clean up BDB resources after a crash Manage threadpools to deal with BDB blocking Manage administrative processes Manage replication groups
  • 29.
    And the codelooks like BDB DB = ?BDB:db_create(Port, []). ?BDB:db_open(Port, DB, void, “database”, “”, bdb_DB_BTREE, [bdb_DB_CREATE, 8#644). ?BDB:db_put(Port, DB, void “foo”, “foodata”, []). {Key, Data} = ?BDB:db_get(Port, DB, void, “foo”, <<>>, []). ?BDB:db_close(Port, DB, []).
  • 30.
    Outline Interpreting theTitle Disecting an Internet Service Erlang, it’s philosophy and runtime Putting it all together Q&A
  • 31.
    An Internet ServiceClients Load Balancer Servers The Internet
  • 32.
    How does itPerform? From: http://www.sics.se/~joe/apachevsyaws.html
  • 33.
    Acknowledgements Joe Armstrong(Erlang) Scott Lystig Fritchie (EDTK) Chris Newcombe (EDTK extensions for BDB)
  • 34.
  • 35.