Empex 2016 Meetup Recap
In May 2016, I attended Empex, the first (annual, let’s hope) Elixir conference in NYC (called Empex). It was a one day conference full of great talks about Elixir, Phoenix, and Erlang. I am presenting a recap at a local meetup this month, and tracking my notes here.
Highlights
Keynote with Bruce Tate
Bruce Tate is a cool guy. He talked a lot about how we progressed from Java, to Ruby and now onto Elixir and Erlang.
Years ago he was on a train with Dave Thomas and talking about not getting ruby, to which a rarely frustrated Dave says “Shut up and do something nontrivial in ruby, and then we can talk”.
Another word that I may or may not have heard of was QWAN or Quality With a Name. In particular, language making in seeking QWAN.
Async Jobs in Elixir with George Guimarães
Task.Async
Avoid it. If the task dies it brings down the caller too.
Task.Supervisor
Familiar pattern that is used throughout most libs. You create your supervisory tree as follows (and it can be nested and complex if you like)
children = [
supervisor(Backyard.Endpoint, []),
supervisor(Bakcyard.Repo, []),
supervisor(Task.Supervisor, [[name: Backyard.Spreadsheet.ImporterSupervisor]]),
]
To start off your supervisor,
Task.Supervisor.start_child(
Backyard.Spreadsheet.ImporterSupervisor,
Spreadsheet.Importer, :start, [file]
)
Smart defaults include
strategy: :simple_one_for_one
restart: :temporary
Useful for things like
- spreadsheet importer
- image resize
- counter cache
- ratings
For deployment, consider using
shutdown: :brutal_kill (or :infinity, 5_000)
Be weary of external resources and consider restraining your code to avoid overwhelming those services (e.g. poolboy).
Poolboy
This provides a GenServer as a EventManager and is suitable when you want to limit the number of running processes in the pool; also supports retry if those services fail
External Queues
If you need a bit more persistence around your processes then look at using an external queue such as verk (job processor backed by redis). It has a great user interface for watching workers. Another option is nats, another message broker meant to be much simpler than say kafka or rabbitmq.
Your First Package with Brian Cardarella
Make sure to provide sensible values in your mix.exs and WTFM
def project do
[app: :crazypants,
version: "1.2.3",
elixir: “~> 1.2”,
deps: deps, # Hex
description: "Lots of crazy pants",
package: [
maintainers: ["x"],
license: ["MIT"],
links %{"GitHub"}
], docs: [
main: "CrazyPants",
logo: "/crazypants.png"
]
Look at the following packages to help
- :earmark
- :ex_doc
Create them locally
mix docsopen doc/index.html
For more advanced, take a look at Typespec
@spec drop(binary) :: binrary
def drop(location) do
“Hey, #{location}”
end
And use dialyxir for contract enforcement
mix dialyzer.plt
mix dialyzer
CodeGen In Elixir
Links
- http://deprogramming.net/2016/05/26/empire-city-elixir-conference-2016/
- Concurrency + Distribution = Scalability + Availability, a journey architecting Systems on BEAM
- Async Jobs in Phoenix
- The Climb — Experiencing the Rise of Elixir from the Inside
- Giving back, building your first package
- Real World Elixir Deployment
- Letting the Phoenix Fly in Production
- A Journey To The Center Of The BEAM
- Micropatterns: Learning to reach quickly for the right tool
- The Journey to Elixir In Production At Scale
- Code Generation in Elixir