Slide 1

Slide 1 text

from Ruby to Elixir

Slide 2

Slide 2 text

• why elixir? • historical context • quick intro • pipe operator • pattern-matching • processes • supervisors • phoenix • elixir in real life outline

Slide 3

Slide 3 text

• elixir • preemptive Erlang VM • yielding lightweight processes • no locks, no mutexes, etc. • ranch, cowboy • functional, immutable • ruby • MRI relies on GIL • OS processes, threads • locks, mutexes, etc. • WEBrick, unicorn, puma, passenger, etc. • OO, mutable why elixir?

Slide 4

Slide 4 text

historical context • Erlang (1986) • Ericsson (OSS 1998) • Ruby (1995) • Rails (2005) • F# (2005) • Clojure (2007) • Devise (2009) • Elixir (2009)

Slide 5

Slide 5 text

quick intro • integers • 2, 0xcafe, 0b100, 10_000 • floats • 1.0, 3.1415, 6.02e23 • lists • [1, 2, 3], [head|tail] • map • %{one: “un”, two: “deux”} • atom • :foo, :me@home, :elixir • tuple • {:ok, 11, ‘hi'} • keyword list • [a: :foo, b: :bar] • binary • <<104, 101, 108, 108, 111>>, “hello”

Slide 6

Slide 6 text

quick intro • functions • Enum.map/2, :erlang.localtime/0 • examples • IO.puts(“Hello World”) • Map.get(%{one: “un”}, :one) • struct(User, %{fname: “John”, lname: “Doe”}) # prints to stdout # returns “un” # returns a User struct # with first name “John”, # last name “Doe”

Slide 7

Slide 7 text

quick intro defmodule User do defstruct [:fname, :lname] def full_name(%User{fname: fname, lame: lname}) do “#{fname} #{lname}” end end $> user = %User{fname: “John”, lname: “Doe”} $> User.full_name(user) “John Doe”

Slide 8

Slide 8 text

pipe operator |> Enum.max(Enum.map(Enum.filter([1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end), fn x-> x * 2 end)) • find max of double the values

Slide 9

Slide 9 text

pipe operator |> Enum.max( Enum.map( Enum.filter( [1, 2, 3, 4, 5], fn x -> rem(x, 2) == 0 end ), fn x-> x * 2 end ) )

Slide 10

Slide 10 text

pipe operator |> [1, 2, 3, 4, 5] |> Enum.filter(fn x -> rem(x, 2) == 0 end) |> Enum.map(fn x -> x * 2 end) |> Enum.max() # 8

Slide 11

Slide 11 text

pattern-matching def zero?(0), do: true def zero?(_), do: false zero?(0) zero?(3) zero?(“hello”) # true # false # false

Slide 12

Slide 12 text

pattern-matching def started_at_text(%Task{started_at: nil}), do: “Not started” def started_at_text(%Task{started_at: time} = task) do
 “Started task-#{task.id} @ #{DateTime.to_string(time)}” end def state(%Task{started_at: nil, closed_at: nil}), do: :waiting def state(%Task{started_at: nil}), do: :canceled def state(%Task{closed_at: nil}), do: :in_progress

Slide 13

Slide 13 text

processes process A process B

Slide 14

Slide 14 text

processes BEAM

Slide 15

Slide 15 text

processes BEAM 2000 reductions each before yielding multiple schedulers ~1 per cpu

Slide 16

Slide 16 text

processes BEAM

Slide 17

Slide 17 text

processes BEAM

Slide 18

Slide 18 text

processes BEAM eu-west-1 us-east-1

Slide 19

Slide 19 text

supervisors BEAM

Slide 20

Slide 20 text

supervisors BEAM error

Slide 21

Slide 21 text

supervisors BEAM restart

Slide 22

Slide 22 text

one_for_one restart supervisors BEAM

Slide 23

Slide 23 text

one_for_all restart supervisors BEAM

Slide 24

Slide 24 text

phoenix

Slide 25

Slide 25 text

phoenix

Slide 26

Slide 26 text

phoenix Ruby Elixir Rack Plug Rails Phoenix ActiveRecord Ecto ERB EEx

Slide 27

Slide 27 text

elixir in real life • 1.5 billion page views per month • 200.000 concurrent users • resource intensive features • previously aggressive horizontal scaling • now 1/10th servers with low CPU usage

Slide 28

Slide 28 text

elixir in real life • 100.000 concurrent users • previously Java • now Erlang, Go and Elixir • 10.000s to 100.000s users per machine

Slide 29

Slide 29 text

elixir in real life • 11.000.000 concurrent users • 2.600.000 concurrent voice users • 220 Gbps • 120 Mpps

Slide 30

Slide 30 text

elixir in real life • media service handling millions of reqs/day • biometrics aggregator service handling 100.000s connections per day • average of 6 Kubernetes pods • cpu limits of 600m • mem limits of 512Mi

Slide 31

Slide 31 text

the end thank you dnlserrano.dev