erlang message passing concurrency, for the win
DESCRIPTION
TRANSCRIPT
![Page 1: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/1.jpg)
ErlangMessage Passing
Concurrency, For The Win
Toby DiPasqualeCommerce360, Inc.
Presented to Philly Linux Users GroupJune 6, 2007
![Page 2: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/2.jpg)
Er-what?
Language/runtime created at Ericsson
Designed for scalable, long-lived systems
Not object oriented
Compiled, Functional, Dynamically typed, Open source
![Page 3: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/3.jpg)
Another f***** language?
Pattern matching
Message-passing concurrency
Distributed programming
Hot code update
![Page 4: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/4.jpg)
Runway Models
Meebo
SlideAware
RabbitMQ
Jabber.org
OpenPoker
![Page 5: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/5.jpg)
Sequential
![Page 6: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/6.jpg)
=
Not what you think it is, Performs a “binding”Invokes pattern matching, Pattern matching like Prolog, nevermind Perl regexs
![Page 7: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/7.jpg)
Syntax
Variables start with uppercase letter
Variables can only be assigned once
Last evaluation is return value of function
Functions and shell exprs end in periodClauses end in semicolon
![Page 8: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/8.jpg)
She’s got the look
-module(math_o_matics).-export([square/1]).
square(X) -> X * X.
![Page 9: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/9.jpg)
Atoms
Self-indicating identifiers
Start with lowercase letter
Can also be quoted with single quotes
atomthis_is_an_atom
‘I am also an atom’
Used just like you’d use an enum in C or a Symbol in Lisp or Ruby
![Page 10: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/10.jpg)
TuplesFixed length containers
Often prepended with an identifier atom
Decompose with pattern matching
Car = {car, {honda, civic}, {horsepower, 100}}.
{car, Type, Power} = Car.
![Page 11: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/11.jpg)
Lists
Variable length containers
Use [H|T] syntax to get head and tail of list
List = [1, 2, 3, four, 5.0]
[Head|Tail] = List
[H1,H2|T2] = List
Use lists just like you would in LispDo something to head, recursively; [H|T] syntax is pattern matching
![Page 12: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/12.jpg)
Strings
Not really
Strings are just lists of integers
Must use double quotes
Meeting = “PLUG”.
Meeting2 = [80,76,85,71].
Those two examples at the bottom are the same string; String handling blows in ErlangNo Unicode
![Page 13: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/13.jpg)
Arity
Use functions with same name and different arity* as auxiliary functions
-module(math_o_matics).-export([sum/1]).
sum(L) -> sum(L, 0).sum([], N) -> N;sum([H|T], N) -> sum(T, H+N).
* ‘Arity’ refers to the number of input parameters a function takes
![Page 14: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/14.jpg)
Modules
Logically associated code block
Use colon (:) to use intermodule code
Use -import to avoid prefixing
io:format(“Using the module io~n”).
One module per file
![Page 15: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/15.jpg)
The “fun” in functional
Anonymous functions
Used for higher-order programming
Square = fun(X) -> X * X end.
Cube = fun(X) -> Square(X) * X end.
![Page 16: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/16.jpg)
List ComprehensionsTakes an expression and a set of qualifiers and returns another list (like Python’s)
Looks like: [X || Q1, Q2, ... Qn ]
qsort([]) -> []; qsort([Pivot|T]) -> qsort([X || X <- T, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T, X >= Pivot]).
![Page 17: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/17.jpg)
Guards
Simple tests against a pattern matching
Can make code more concise
max(X, Y) when X > Y -> X;max(X, Y) -> Y.
Multiple guards separated by a semicolon; Other guards include: arithmetic exprs, short-circuit boolean exprs, constants (False), true (True)
![Page 18: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/18.jpg)
Biting the bits
<<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, ID:16, Flgs:3, FragOff:13, TTL:8, Proto:8, HdrChkSum:16, SrcIP:32, DestIP:32, RestDgram/binary>>
Syntax for extracting/packing bits
Can do signed, unsigned, big-endian and little-endian, integer, float and binary qualifiersExample decomposes an IPv4 packet
![Page 19: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/19.jpg)
Concurrency
![Page 20: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/20.jpg)
Shared Memory
Image credit: http://www.ja.org/nested/berrienandcass/kelly-vault.jpg
Lots of contention in there; Sweaty and noisy after a whileUnpleasant; Teacher must watch to make sure things go smoothly (single point of failure)
![Page 21: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/21.jpg)
Message Passing
Image credit: http://english.people.com.cn/200512/21/images/pop2.jpg
Pass messages to communicate; Stability through replication and communicationMore like real world concurrent systems; No mutexes, semaphores, monitors, etc to deal with
![Page 22: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/22.jpg)
Processes
Basic unit of concurrency
Use spawn/0, !/1 (a.k.a. send) and receive/1 BIF’s*
Asynchronous send, synchronous receive
* BIF means “Built-in Function”
Owned by runtime, not OS; Very cheap and fast to spawn; No shared memory between processes
![Page 23: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/23.jpg)
Concurrency Template*-module(template).-compile(export_all).
start() -> spawn(fun() -> loop([]) end).
rpc(Pid, Query) -> Pid ! {self(), Query}, receive {Pid, Reply} -> Reply end.
loop(X) -> receive Any -> io:format("Received:~p~n", [Any]), loop(X) end.
* Courtesy of Joe Armstrong in Programming Erlang, First Edition
loop/1 is tail-recursivewhen you get a new message, add a clause to receive in rpc/2
![Page 24: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/24.jpg)
Errors
Linking processes defines error chain
When a process dies, linked processes are sent an exit signal
Use spawn_link/1 to spawn linked processes
Only system processes can trap special exit signals
![Page 25: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/25.jpg)
Distributing Erlang
Erlang has built-in support for distributed operation
Two modes:
Distributed Erlang (easier, less secure)
Socket-based distribution (more secure)
Distributed Erlang looks largely the same as non-distributed
![Page 26: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/26.jpg)
Distributing Erlang (2)
Two libraries for higher-level Distributed Erlang:
rpc - RPC services
global - naming, locking, maintenance
Cookie based security model
security is crappy, suitable only for protected LANseach machine is given a cookie; cookie must be same for all nodes in cluster
![Page 27: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/27.jpg)
ets and dets
Erlang Term Storage (and Disk ets)
Dictionary for mad loads of Erlang data
ets tables are transient, dets are persistent
support insertion/lookup of keys and deletion of entire table
![Page 28: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/28.jpg)
Mnesia
Real-time, distributed database that comes with Erlang
Query language looks like SQL/list comprehensions
Built-in visualization tools
Can store data in memory or on diskMnesia is built on top of ets and dets
![Page 29: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/29.jpg)
OTP
Open Telecom Platform
Web server, FTP server, CORBA ORB, ASN.1, SNMP, etc
Designed around encapsulated “behaviors”
Has lots more than telco stuff; set of libraries and platforms for building large-scale appsbehaviors help code up large-scale apps (e.g. gen_tcp, gen_server)
![Page 30: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/30.jpg)
Hot Erlang-on-Erlang action
Yaws
Super scalable Web server/platform
ejabberd
Super scalable XMPP server
RabbitMQ
Super scalable message broker
Seeing a pattern here?
![Page 31: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/31.jpg)
RTFM
Programming Erlang (PDF and dead tree versions; great book)
Concurrent Programming with Erlang (older; first half available online)
Erlang Website
Trapexit forums
erlang-questions mailing list
![Page 32: Erlang Message Passing Concurrency, For The Win](https://reader034.vdocument.in/reader034/viewer/2022042714/54c485824a7959e8078b4662/html5/thumbnails/32.jpg)
Huh huh huh huh... you said ‘Erlang’
Slides: http://cbcg.net/talks/erlang.pdf