Persistent Term PDF
Persistent Term PDF
persistent_term 1
Hello
— Clark Kampfe
— Fast Radius
— 3D printing manufacturing
— Phoenix, Nerves in production
— Yes we're hiring
persistent_term 2
Problem
— Global data
— Big
— Lots of concurrent access
— Rarely changing
persistent_term 3
Examples
— Config data
— Cluster hosts
— Large precomputed math calculations
persistent_term 4
Solutions Elsewhere
persistent_term 5
Elixir/Erlang VM: The BEAM
persistent_term 6
Solutions in Elixir/Erlang
— GenServer
— ETS
— FastGlobal
— persistent_term (new!)
persistent_term 7
GenServer
defmodule Pterm.MapServer do
use GenServer
# PUBLIC
######################################
def start_link(args) do
GenServer.start_link(__MODULE__, args, name: __MODULE__)
end
def get(pid) do
GenServer.call(pid, :get, 30_000)
end
# CALLBACKS
######################################
### Client
persistent_term 8
GenServer
persistent_term 9
ETS - Erlang Term Storage
hosts = %{...}
persistent_term 10
ETS - Erlang Term Storage
— Basically, Redis
— Big mutable hash table
— Easy, fast
— Built in
— Not GC'd
— Data is copied to caller: keyspace access patterns
matter!
persistent_term 11
FastGlobal
hosts = %{...}
FastGlobal.put(:hosts, hosts)
FastGlobal.get(:hosts)
persistent_term 12
FastGlobal
persistent_term 13
persistent_term
hosts = %{...}
:persistent_term.get({HostsModule, :hosts})
persistent_term 14
persistent_term
persistent_term 16
persistent_term considered dangerous
persistent_term 17
small, n = 10, parallelism = 6
persistent_term 18
medium, n = 10,000, parellelism = 6
persistent_term 19
large, n = 1,000,000, parallelism = 6
persistent_term 20
small, n = 1,000, parallelism = 60
persistent_term 21
medium, n = 10,000, parallelism = 60
persistent_term 22
large, n = 1,000,000, parallelism = 60
persistent_term 23
summary
distributed can be no no no
persistent_term 24
persistent_term 25