erlang plus bdb: disrupting the conventional web wisdom

Post on 16-Apr-2017

6.997 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Erlang + EDTK + BDB: Disrupting the Web

Margo SeltzerArchitect

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 ServiceClients

The Internet

Load Balancer

App Servers

Database Servers

.NET Java

An Internet ServiceClients

The Internet

Load Balancer

Database Servers

.NET Java

CGIPHPLISP

Perl

An Internet ServiceClients

The Internet

Load Balancer

ServersBDB

CGIPerl

Application Code

The Software Architecture

• In any case, your software is a messGazillion 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.ok3>

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:

receivePattern1 [when Guard1] ->

Expression1;Pattern2 [when Guard2] ->

Expression2;…

end

Send/Receive Example-module(food).-export([dinner/0]).

dinner() ->receivesunday ->io:format("Sunday is fish.~n", []),dinner();monday ->io:format("Monday is chicken.~n", []),dinner();tuesday ->io:format("Tuesday is beef.~n", []),dinner();Other ->io:format("Time to go home.~n", [])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.monday6>

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 ServiceClients

The Internet

Load Balancer

Servers

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)

AQ&

top related