Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Simplifying systems with Elixir - Belgrade

Simplifying systems with Elixir - Belgrade

Saša Jurić

October 25, 2018
Tweet

More Decks by Saša Jurić

Other Decks in Programming

Transcript

  1. Simplifying systems
    with Elixir
    @sasajuric
    aircloak.com

    View Slide

  2. Elixir
    functional
    concurrent

    View Slide

  3. process
    ...
    foo(...)
    bar(...)
    ...

    View Slide

  4. functional Elixir
    modules and functions
    immutable data
    first-class functions

    View Slide

  5. ...
    spawn(fn -> ... end)
    ...

    View Slide

  6. process A
    ...
    foo(...)
    bar(...)
    ...
    process B
    ...
    baz(...)
    qux(...)
    ...

    View Slide

  7. send(
    process_b,
    some_message
    )
    receive do
    message ->
    handle(message)
    end
    process a process b

    View Slide

  8. BEAM (Erlang VM)

    View Slide

  9. BEAM (Erlang VM)

    View Slide

  10. scheduler scheduler scheduler scheduler
    BEAM (Erlang VM)
    CPU CPU CPU CPU

    View Slide

  11. concurrent
    functional

    View Slide

  12. activities
    incoming requests
    background jobs
    in-memory state
    load control

    View Slide

  13. managing activities
    multiple OS processes
    3rd party products
    service managers

    View Slide

  14. View Slide

  15. View Slide

  16. uniformity
    simpler development
    simpler testing
    simpler deployment
    simpler maintenance
    improved collaboration

    View Slide

  17. View Slide

  18. theerlangelist.com

    View Slide

  19. git clone https://github.com/sasa1977/erlangelist.git
    mix deps.get && pushd assets && npm install && popd
    iex -S mix phx.server

    View Slide

  20. View Slide

  21. serving requests

    View Slide

  22. http listener https listener

    View Slide

  23. http listener https listener
    handler 1 handler 2 handler n

    View Slide

  24. usage stats

    View Slide

  25. stats collector
    handler
    handler handler

    View Slide

  26. stats collector
    disk writer

    View Slide

  27. def store(path, data) do
    File.write!(
    path,
    :erlang.term_to_binary(data)
    )
    end

    View Slide

  28. def read(path, default) do
    path
    |> File.read!()
    |> :erlang.binary_to_term()
    rescue ArgumentError ->
    default
    end

    View Slide

  29. cleanup

    View Slide

  30. scheduler cleanup job
    periodically starts

    View Slide

  31. HTTPS

    View Slide

  32. our system CA server
    certificate request
    challenge info
    challenge

    View Slide

  33. certifier
    http server
    usage stats

    View Slide

  34. dev CA server

    View Slide

  35. service management

    View Slide

  36. defmodule StatsCollector do
    def start_link() do
    # ...
    end
    # ...
    end

    View Slide

  37. Supervisor.start_link(
    [
    StatsCollector,
    Cleanup
    ],
    # ..
    )

    View Slide

  38. supervisor
    stats collector cleanup

    View Slide

  39. supervisor
    worker

    View Slide

  40. 1

    View Slide

  41. 1
    2

    View Slide

  42. 1
    2
    3 4 5

    View Slide

  43. 1
    2 6 9
    7 8
    3 4 5

    View Slide

  44. erlangelist
    usage stats web

    View Slide

  45. usage stats
    stats collector cleanup

    View Slide

  46. web
    ACME server main site certifier

    View Slide

  47. View Slide

  48. technical feature built-in options
    services GenServer, Task
    service manager Supervisor
    service registry Registry
    k-v ets, mnesia
    web server phoenix, plug, cowboy
    periodical jobs :timer, quantum, periodic
    load regulation jobs, safetyvalve, sbroker
    concurrent flows Flow, GenStage

    View Slide

  49. Elixir in a nutshell
    start simple
    go far

    View Slide

  50. Elixir guides
    Phoenix guides
    Learning resources
    Elixir forum

    View Slide

  51. 40% off using code
    ctwelixirbg18 at
    manning.com
    slides available at
    bit.ly/elixirbg102018

    View Slide