A presentation at Buffer Snack Chat by Brooklyn Zelenka
A W H I R LW I N D TO U R O F E L I X I R B U F F E R “S N AC K C H AT ” 📬⚗ PIPES, MAILBOXES, & THE ZEN OF JUST LETTING YOUR APP CRASH ☠🚀
BACKGROUND
BACKGROUND A B I T O F I N F O A B O U T T H E TA L K A N D C O N T E X T
BACKGROUND B R O O K LY N Z E L E N K A
BACKGROUND B R O O K LY N Z E L E N K A
BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite
BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite •PLT & VM enthusiast
BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite •PLT & VM enthusiast •Ethereum Core Developer
BACKGROUND B R O O K LY N Z E L E N K A •Cofounder of •Web3 tools for a Web 2.0 world •Early access: https://tools.fission.codes •Code: https://github.com/fission-suite •PLT & VM enthusiast •Ethereum Core Developer •Previously a FT Elixir developer •Exceptional •Witchcraft Suite •https://github.com/witchcrafters •Keynotes •Elixir.LDN 2017 / Empex 2018 / ElixirConf 2019
BACKGROUND GOALS
BACKGROUND GOALS • Situate Elixir • Main characteristics & concepts • Briefly touch on Phoenix
BACKGROUND WHY ELIXIR?
BACKGROUND WHY ELIXIR? • According to the 2019 Stack Overflow developer survey: • Developers who work with Rust, WebAssembly, and Elixir contribute to open source at the highest rates • Globally, respondents who use Clojure, F#, Elixir, and Rust earn the highest salaries
BACKGROUND FUNCTIONAL PROGRAMMING
BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church
BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church Imperative instructions Expressions & analytic truths
BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church Imperative instructions Expressions & analytic truths Global state — “memory” Manual, localized state — “stateless”
BACKGROUND FUNCTIONAL PROGRAMMING Alan Turing Alonzo Church Imperative instructions Expressions & analytic truths Global state — “memory” Manual, localized state — “stateless” Mechanistic, Turing machines Semantic, mathematical models
ERLANG & ELIXIR
ERLANG & ELIXIR A B R I E F H I S T O R Y O F T H E B E A M & O P E N T E L E C O M P L AT F O R M
BEAM ERLANG
BEAM ERLANG
BEAM ● ERLANG HIGH LEVEL
BEAM ● ERLANG HIGH LEVEL • Name • Agner Krarup Erlang • “Ericsson Language” • High performance 1980s telecom switches • Prolog-ish syntax • Same VM as Elixir (BEAM) • Full introp • Actor model
BEAM ELIXIR
BEAM ELIXIR
BEAM ● ELIXIR HIGH LEVEL
BEAM ● ELIXIR HIGH LEVEL • Released in 2011 • BDFL José Valim & co • Several Rails core members • Runs on Erlang’s BEAM VM • Fully interoperable with Erlang • Concurrent, fault tolerant, &c
BEAM ● ELIXIR P H I LO S O P H Y
BEAM ● ELIXIR P H I LO S O P H Y • Readability • Consistency • Fault tolerance • Light weight processes • Soft realtime • Modernity (ex. UTF-8 support out of the box) • Extension / metaprogarmming
BEAM ● ELIXIR RUBY INFLUENCE 💎
BEAM ● ELIXIR RUBY INFLUENCE 💎 • Philosophy • Superficial aesthetics • Friendly • do blocks • Pragmatic • Dot syntax • Readable (“like English”) • Truthiness • Permissive • Dynamic
BEAM IN THE WILD
BEAM IN THE WILD • WhatsApp (2 million connections on a single node) • “Every phone call since 1986” • Discord • Amazon • Facebook • Motorola • Ericsson (obviously) • Heroku • RabbitMQ • Nerves • Parallela
BEAM M O T I VAT I N G C A S E S
BEAM M O T I VAT I N G C A S E S • Performance free lunch is over • Soft realtime • Networking (ie: internet) • Fault tolerant • High availability • Concurrency • “Nine nines” of uptime • Distributed computing • 99.9999999% • Hot code reloading • ~32ms total downtime per year • Clustering
S A L I E N T S Y N TA X
S A L I E N T S Y N TA X F I R S T T H I N G S T H AT Y O U ’ L L N O T I C E
S A L I E N T S Y N TA X PAT T E R N M AT C H I N G & M U LT I P L E F U N C T I O N H E A D S
S A L I E N T S Y N TA X VA R I A D I C F U N C T I O N S
S A L I E N T S Y N TA X PIPES
S A L I E N T S Y N TA X PIPES • Reorder the flow of functions • Linearize function calls for readability • Goes into the first argument position of the next function • Conceptually there is a “subject”
S A L I E N T S Y N TA X P ROTO C O LS
S A L I E N T S Y N TA X P ROTO C O LS
CONCURRENCY
CONCURRENCY THE BEAM’S RAISON D’ÊTRE
CONCURRENCY LIGHTWEIGHT
CONCURRENCY LIGHTWEIGHT • Lightweight virtual green threads • Spin up millions of processes easily • spawn ~ fork
CONCURRENCY “ WAR & PEACE” WORD FREQUENCY
CONCURRENCY “ WAR & PEACE” WORD FREQUENCY
CONCURRENCY 1 0 0 , 0 0 0 + C O N C U R R E N T TA S K S ( O N A L A P T O P )
CONCURRENCY 1 0 0 , 0 0 0 + C O N C U R R E N T TA S K S ( O N A L A P T O P )
CONCURRENCY 1 0 0 , 0 0 0 + C O N C U R R E N T TA S K S ( O N A L A P T O P )
THE ACTOR MODEL
THE ACTOR MODEL A SANE MODEL OF CONCURRENCY & A CLEANER O.O.
THE ACTOR MODEL STO RY T I M E 📖
THE ACTOR MODEL STO RY T I M E 📖 ‘
THE ACTOR MODEL STO RY T I M E 📖 📈 ‘
THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ) 📊
THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ 🤔 ) 📊
THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ 🤔 ✉ ✉ ) 📨 📊
THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ 🤔 . ✨ ✉ ✉ ) 📨 📊
THE ACTOR MODEL STO RY T I M E 📖 📈 ’ ✉ ✉ ✉ 🤔 📚 ✉ ✉📨 ✉ . ✨ ) 📨 📊
THE ACTOR MODEL STO RY T I M E 📖 📈 ✉ ✉ ✉ 🤔 ’ ✨ ✉ 📚 ✉📨 ✉ . ✨ ✉ ) 📨 📊
THE ACTOR MODEL STO RY T I M E 📖 📈 ✉ ✉ ’ 📨 ✉ ✉ ✉ 🤔 ✨ ✉ 📚 ✉📨 ✉ . ✨ ✉ ) 📨 📊
THE ACTOR MODEL ABILITIES
THE ACTOR MODEL ABILITIES 📈 ’ ✉ ✉ 📨
THE ACTOR MODEL ABILITIES ✉ 🤔 📈 ’ ✉ ✉ 📨 2 👶👶👶 ✉ 🔥
THE ACTOR MODEL MAILBOXES
THE ACTOR MODEL MAILBOXES • Literally what it sounds like • Elixir is async, so message passing needs a message queue buffer • Message queue • Optional timeout
SUPERVISION
SUPERVISION WHEN GOOD CODE GOES BAD 😈
SUPERVISION LET IT CRASH 🤯
SUPERVISION LET IT CRASH 🤯 • Don’t defensively program for extreme edge cases 😊 • Does not mean that you can sidestep error handling completely 😡 • Can ignore unknown unknowns • High load, concurrent systems • 1/1,000,000 bug may happen every few seconds
SUPERVISION D E C L A R AT I V E C O N F I G U R AT I O N
SUPERVISION D E C L A R AT I V E C O N F I G U R AT I O N
SUPERVISION D E C L A R AT I V E C O N F I G U R AT I O N
SUPERVISION R E S TA R T S T R AT E G I E S ♻
SUPERVISION R E S TA R T S T R AT E G I E S ♻
SUPERVISION R E S TA R T S T R AT E G I E S ♻ • :one_for_one • :simple_one_for_one • :one_for_all • :rest_for_one
SUPERVISION :ONE_FOR_ONE . 👷 ; 👷 💀
SUPERVISION :ONE_FOR_ONE . 👷 ; 💀
SUPERVISION :ONE_FOR_ONE . 💀 👷 ;
SUPERVISION :ONE_FOR_ONE . 💀 👷 ; 👷
SUPERVISION :ONE_FOR_ALL . 👷 💀 ; 💀 👷 💀
SUPERVISION :ONE_FOR_ALL . 👷 💀 ; 💀 💀
SUPERVISION :ONE_FOR_ALL . 💀 👷 💀 ; 💀
SUPERVISION :ONE_FOR_ALL . 💀 💀 💀
SUPERVISION :ONE_FOR_ALL . 💀 👷 💀 ; 💀 👷
SUPERVISION :REST_FOR_ONE . ; 1 👷 💀 2 👷 💀 3 ; 💀 4
SUPERVISION :REST_FOR_ONE . 💀 ; 1 👷 💀 2 3 ; 💀 4
SUPERVISION :REST_FOR_ONE . 💀 ; 1 2 💀 💀 3 4
SUPERVISION :REST_FOR_ONE . 💀 ; 1 👷 2 👷 💀 3 ; 💀 4
PHOENIX 🐣🔥
PHOENIX 🐣🔥 A H I G H U P T I M E , B AT T E R I E S - I N C L U D E D W E B F R A M E W O R K
PHOENIX STRENGTHS
PHOENIX STRENGTHS • All of the OTP goodness (concurrent, fault tolerant, &c) • Generally no need for external queuing systems like Sidekiq or RabbitMQ • Convenient, Rails-y APIs • Familiar layout & style • Clean(er) MVC architecture • “A bunch of libraries”, rather than a monolithic system
PHOENIX T H E R A I L S P H O E N I X W AY
PHOENIX T H E R A I L S P H O E N I X W AY • Opinionated! • [M]VC+ • Explicit > automagic • …for the parts that you touch • Safe defaults • Consistency • Focus on • Developer experience & ease of use • Sockets • Performance
PHOENIX EXAMPLE REQUEST
PHOENIX EXAMPLE REQUEST
PHOENIX EXAMPLE REQUEST
PHOENIX EXAMPLE REQUEST
PHOENIX EXAMPLE REQUEST
PHOENIX FA M I L I A R S T R U C T U R E
PHOENIX FA M I L I A R S T R U C T U R E
PHOENIX FA M I L I A R S T R U C T U R E
PHOENIX EXAMPLE CONTROLLER
PHOENIX EXAMPLE CONTROLLER
FURTHER READING
FURTHER READING WHERE TO GO FROM HERE
FURTHER READING G E T T I N G S TA R T E D & I N T E R E S T R E A D I N G
FURTHER READING G E T T I N G S TA R T E D & I N T E R E S T R E A D I N G • https://elixir-lang.org • IEx & Mix • GenServer • Broadway • Phoenix LiveView • https://hex.pm & https://hexdocs.pm • http://blog.plataformatec.com.br/tag/elixir/ • https://github.com/expede/up_run • https://github.com/expede/todo-example • https://github.com/expede/quick_chat • Twitter’s #MyElixirStatus
🎉 THANK YOU, BUFFER! ✨ hello@brooklynzelenka.com g i t h u b . c o m /e x p e d e @expede