Slide 1

Slide 1 text

Erlang in the Land of Lisp with Jan Stępień @janstepien

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

api.stylefruits.de ↑ ↓ ↑↑↑ ↓↓↓ mobile client

Slide 4

Slide 4 text

GET /v1/give-me-all-i-need-right-now Host: api.stylefruits.de Accept: applica on/truckload-of-json

Slide 5

Slide 5 text

api.stylefruits.de ↑ ↓ ↑↑↑ ↓↓↓ batching proxy ↑ ↓ mobile client

Slide 6

Slide 6 text

↑↑↑ ↓↓↓ HTTP client ↑↑↑ ↓↓↓ JSON processing ↑ ↓ HTTP server ↑ ↓

Slide 7

Slide 7 text

͜ Rib Requests in Batches

Slide 8

Slide 8 text

Erlang The syntax and the beauty beneath

Slide 9

Slide 9 text

-module(qsort). -export([qsort/1]). qsort([]) -> []; qsort([Pivot|Rest]) -> qsort([Front || Front <- Rest, Front < Pivot]) ++ [Pivot] ++ qsort([Back || Back <- Rest, Back >= Pivot]). en.wikipedia.org/wiki/Erlang (programming language)

Slide 10

Slide 10 text

The Erlang VM where processes dwell p1 p2 ↕ p4 ↔ p3

Slide 11

Slide 11 text

CPU CPU CPU CPU sched sched sched sched p0 p1 p2 p3 p4 p5 p6 p7 p8 p9

Slide 12

Slide 12 text

Processes’ heaps are separated p0 p1 p2 p3 p4 p5

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Back to Rib Se ng the environment up

Slide 17

Slide 17 text

$ rebar create-app appid=rib ==> rib (create-app) Writing src/rib.app.src Writing src/rib_app.erl Writing src/rib_sup.erl

Slide 18

Slide 18 text

%% rebar.config {deps, [{jiffy, ".*", {git, "git://github.com/davisp/jiffy", {tag, "0.13.3"}}}, {ejsonpath, ".*", {git, "git://github.com/rustyio/sync", "de3c42df58"}}]}.

Slide 19

Slide 19 text

$ rebar sh ==> rib (shell) Erlang/OTP 18 Eshell V7.0 (abort with ^G) 1> sync:go(). Starting Sync (Automatic Code Compiler / Reloader) Scanning source files... ok 2> =INFO REPORT==== 7-Feb-2016::12:21:23 === src/rib.erl:0: Recompiled. =INFO REPORT==== 7-Feb-2016::12:21:23 === rib: Reloaded! (Beam changed.)

Slide 20

Slide 20 text

Elli and callback modules

Slide 21

Slide 21 text

-module(elli_minimal_callback). -behaviour(elli_handler). handle(Req, _Args) -> handle(Req#req.method, elli_request:path(Req), Req). handle('GET',[<<"hello">>, <<"world">>], _Req) -> {200, [], <<"Hello World!">>}; handle(_, _, _Req) -> {404, [], <<"Not Found">>}. github.com/knu n/elli

Slide 22

Slide 22 text

Let’s make it all concurrent

Slide 23

Slide 23 text

pmap(Fun, List) -> Parent = self(), Workers = [spawn(fun() -> Parent ! {self(), Fun(X)} end) || X <- List], [receive {Worker, Value} -> Value end || Worker <- Workers].

Slide 24

Slide 24 text

pmap(Fun, List) -> Parent = self(), Workers = [spawn_link(fun() -> Parent ! {self(), Fun(X)} end) || X <- List], [receive {Worker, Value} -> Value end || Worker <- Workers].

Slide 25

Slide 25 text

pmap(Fun, List) -> Parent = self(), Workers = [spawn_link(fun() -> Parent ! {self(), Fun(X)} end) || X <- List], [receive {Worker, Value} -> Value after 1000 -> error(timeout) end || Worker <- Workers].

Slide 26

Slide 26 text

You shall not !

Slide 27

Slide 27 text

OTP and generic behaviours in par cular

Slide 28

Slide 28 text

Use case HTTP connec on killer

Slide 29

Slide 29 text

-module(rib_conn_killer). -export([start_link/0]). start_link() -> {ok, spawn_link(fun go/0)}. go() -> {ok, Url} = application:get_env(rib, backend), Headers = [{"connection", "close"}], {ok, _} = httpc:request(get, {Url, Headers}), ok = timer:sleep(30000), go().

Slide 30

Slide 30 text

-module(rib_conn_killer_sup). -behaviour(supervisor). -export([start_link/0, init/1]). start_link() -> supervisor:start_link({local, ?MODULE}, ?MODULE, []). init([]) -> {ok, {{one_for_one, 5, 10}, [{rib_conn_killer, ...}]}}.

Slide 31

Slide 31 text

Use case Request limiter

Slide 32

Slide 32 text

-module(rib_limiter). -behaviour(gen_server). start_link(Opts) -> gen_server:start_link(?MODULE, Opts, []). subtract(ServerRef, N) -> gen_server:cast(ServerRef, {subtract, N}). init({max, N}) -> {ok, N}. handle_cast({subtract, N}, State) -> NewState = State - N, case NewState >= 0 of true -> {noreply, NewState}; false -> {stop, limit_exceeded, NewState} end.

Slide 33

Slide 33 text

Deployment Lightweight Docker images

Slide 34

Slide 34 text

Something completely different Happy path programming, le ng it crash

Slide 35

Slide 35 text

On shoulders of giants Virtual machine, OTP

Slide 36

Slide 36 text

Needs more research Polymorphism, editor integra on

Slide 37

Slide 37 text

Can’t stand the syntax? LFE, Joxa, Elixir

Slide 38

Slide 38 text

github.com/stylefruits/rib

Slide 39

Slide 39 text

Erlang in the Land of Lisp with Jan Stępień @janstepien