xgeek116

xgeek116

Elixir Phoenix use cases ? Why start using it?

Hello,

We have been using Elixir and Phoneix for creating REST APIs for a few months now.

But I can’t see the benefits of this switch (from nodejs / Nestjs) in terms of performance, speed etc ?

So :

  1. Can you please tell me why are you using it ? (did you switch from another technology ?)
  2. What are the major benefits ? To explore them
  3. Is there a specific domain to used it in ? (AI, mailing etc.) ?
  4. In terms of deployment, scaling etc. Do you find it efficient ?

Many thanks

Most Liked

derpycoder

derpycoder

Take it from someone who has been in the deep muddy water of JavaScript development, both in frontend and backend, Elixir & Phoenix are better duo than anything I came across.

Let me answer each of your question, one by one.

  1. I switched form Node.js. I used it along with Socket IO to make presence tracking app and distributed locking.

    • The Node.js environment is riddled with memory leak. (The only Node.js program without memory leak is a Hello World program) (Elixir & Phoenix app have per process garbage collection, so memory won’t bloat for entire application)
    • It is opaque, i.e. You can’t inspect what’s happening inside in production. (You can with Elixir & Phoenix, you can even terminate a single process that might be causing trouble, without crashing the whole server!)
    • It’s not multi threaded, so you have to run multiple instances using PM2 or Docker. (Elixir & Phoenix have that natively)
    • Multiple Node.js instances don’t communicate with each other, instead you have to host a separate Redis instance, and use its PubSub mechanism or use some other message queue. (Elixir & Phoenix run on top of BEAM virtual machine, which has those primitives built in!!)
    • JavaScript is an unreliable mess, which you will replace with TypeScript anyway, which is just a fake type checker. (With Elixir, you won’t need Type checking whatsoever, because of the first class testing features and type checkers don’t prevent all bugs anyways, just type bugs)
  2. a. Major benefits:

    • The Phoenix Framework has Live View, which is like next level compared to the terrible Single Page Application. (I can fill a page about how it’s a mind-blowing piece of tech if you want to know)
    • Elixir has LiveBooks, where you can learn, make Machine Learning models, even create business intelligence tools, because it can connect directly to all other Elixir Phoenix nodes with ease.
    • Elixir has Pipelining, i.e. |>, for better readable and maintainable code.
     def on_mount(:only_admin, _params, session, socket) do
      {:cont, socket}
        |> assign_user(session)
        |> verify_user()
        |> verify_lock()
        |> verify_email()
        |> verify_role(~w(super_admin admin)a)
        |> subscribe_user()
     end
  1. b. Some other benefits:
    • The paradigm for coding is functional, and not OOP, so you won’t drown in the rabbit hole of Design Patterns.
    • Elixir has pattern matching, which eases error handling and reduces lines of code we have to write:
   def env(atom) when is_atom(atom), do: Application.get_env(:derpy_coder, :environment) == to_string(atom)
   def env(str) when is_binary(str), do: Application.get_env(:derpy_coder, :environment) == str
   def env(list) when is_list(list), do: Application.get_env(:derpy_coder, :environment) in list
  1. Domains:

    • The language and the BEAM virtual machine lend themselves to soft real time application really well.
    • Better & Modern web applications. See: Phoenix Framework
    • Soft Realtime, collaborative applications. See: Phoenix LiveView
    • Internet of Things using Nerves project. See: Nerves Project
    • Mobile Application. See: Phoenix LiveView Native
    • Desktop Application. See: Elixir Desktop
    • Artificial Intelligence training and serving. Elixir Nx, Axon
    • Here’s a list of Awesome Collections: Awesome Elixir, Awesome Phoenix LiveView
  2. Deployment

    • It takes up less memory, compared to Java or Node based apps.
    • It uses less server resources and just one instance deployed onto a server can utilise all cores of that machine. So you don’t have to use a tool like PM2 to run multiple instances like in case of Nodejs.
    • There was a blog post about how a company using Ruby, with 80 servers came down to only 5 after switching to Elixir.
    • Discord uses Elixir, and WhatsApp used to use it.
    • Current build process can output single binary, so you can deploy it in a old school way like I prefer, or you can Dockerize it to run it inside Kubernetes, or throw the binary at Hashicorp Nomad for orchestrating standalone binaries.
    • Separately deployed nodes can communicate with each other, without using ETCD or Redis or Kafka separately, it’s built in.
    • With fly .io, you can deploy your server to the edge, as if it’s a CDN, except your code is running closer to the user, and you won’t have to deal with any extra tech layer. See: LiveBeats.

I have been falling down the rabbit hole of Front End frameworks, for what feels like forever. It was like a never ending Distro hopping. Everything that comes out in front end space solves one or the other problem, but leaves out a gaping hole behind them.

For instance, React, solved some problem, but left open the server side rendering. So Next.js came along.

REST api felt unwieldy, so GraphQL came along, now state needs to be maintained in both backend and front end. So you end up with business logic scattered across both places.

Routing story gets bad or has several fragmented implementation. State management remains a mess.

Then someone from business comes along and asks you to make some of it real time, and now you are caught in the JavaScript web hell.

The 2 ton heavy npm package gets replaced by pnpm, which breaks everything. You can’t reliably run a Node.js project after a hiatus.

Webpack bundler keeps getting slower, so you move to something else, which has some other headache of its own.

Believe me when I say, you are saving yourself a ton of headache and sparing yourself from paying technical debt by moving to Elixir/Phoenix.

It saved me from yak shaving me life away.


See the following talks to get a visual explanation of all the things I pointed out:

P.S. I would have put a lot more links, but new users are not allowed to add more than 5 links. (I started learning Elixir & Phoenix 3 or 4 months back and joined the forum today :sweat_smile:)

Sebb

Sebb

  so_survery_get(:techs, :webfw, 2022) #=> %{
    dotnet: ["Blazor", "ASP.NET Core", "ASP.NET"],
    elixir: ["Phoenix"],
    js: ["React.js", "Node.js", "Vue.js", "Next.js", "Svelte", "Angular",
     "Express", "Nuxt.js", "Angular.js", "jQuery", "Deno", "Gatsby", "Fastify"],
    php: ["Laravel", "Symfony"],
    python: ["Django", "Flask", "FastAPI"],
    ruby: ["Ruby on Rails"],
    scala: ["Play Framework"]
  }
  |> filter(fn {lang, _} -> not microsoft?(lang) end) #=> [
    elixir: ["Phoenix"],
    js: ["React.js", "Node.js", "Vue.js", "Next.js", "Svelte", "Angular",
     "Express", "Nuxt.js", "Angular.js", "jQuery", "Deno", "Gatsby", "Fastify"],
    php: ["Laravel", "Symfony"],
    python: ["Django", "Flask", "FastAPI"],
    ruby: ["Ruby on Rails"],
    scala: ["Play Framework"]
  ]
  |> filter(fn {lang, _} -> functional?(lang) end) #=> [
    elixir: ["Phoenix"],
    scala: ["Play Framework"]
  ]
  |> filter(fn {lang, _} -> can_normal_people_understand?(lang) end) #=> [
    elixir: ["Phoenix"]
  ]
dimitarvp

dimitarvp

Elixir and Phoenix are good for:

  • Any web app with server-side rendering.
  • Any web app with client-side rendering (you can use partial hydration with JSON API server that Phoenix can also do). Phoenix integrates well with every frontend framework but you’ll have to do some plumbing with webpack, rollup, esbuild and others.
  • Any API server (REST and GraphQL through HTTP[S] are best supported though we have functional libraries for gRPC as well).
  • Any long-term persistent servers – general background workers, crawlers, data collectors and aggregators, and many others.
  • Any app backend that requires persistent bi-directional connections to its clients. Phoenix’s WebSockets support is very good.
  • And lately some ML is on the rise though I’m not sure how well-supported it is at the moment.

You can use Elixir for likely no less than 80% of all possible projects out there.

It’s at least as fast as the hot paths in JS, so it’s pretty fast. We’re talking average 15-35 milliseconds per request in a web app even when DB is involved.

As others mentioned it’s no C/C++ or Rust but (a) you can use these in your super hot paths if you want, and (b) most apps don’t need such a beastly speed so you’re 98% likely to get away with pure Elixir.

Elixir is a secret weapon. Many people can’t see that because they want to arrive at an already super popular ecosystem. Rest assured however, companies using Elixir are very happy with their choice, and they can get away with hiring less devs, too.

12
Post #5
tj0

tj0

I think the biggest benefit that no one has mentioned yet is maintainability over multiple years.

The ecosystem is stable yet steadily improving. And you may have noticed already that the language lends itself to making easier to understand code which means less bugs or maintenance headache.

If you want to have a long-running stable system with minimal maintenance cost, I’m not sure how the JS ecosystem can compete.

11
Post #7
cmo

cmo

  1. It’s a joy to develop in. Switched from F#/C# and Python (part way through the project).

  2. The concurrency model of the BEAM. Speed/ease of development, documentation, REPL, community.

  3. Pretty much whatever domain you like. Web, distributed, data, orchestration, embedded, machine learning, desktop, mobile (mobile is in it’s infancy).

  4. Yes it’s efficient. It’s no Rust/C, but you can use those from Elixir. Deployment is fairly trivial.

Where Next?

Popular in Questions Top

lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
wernerlaude
In AR this is so simple @articles = current_user.articles How to do in Ecto? def index(conn, _params) do current_user = conn.assig...
New
clayschick
I'm trying to create a simple query to select distinct values from a column. If I only use select and distinct I get back a list of uniqu...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30048 115
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 45766 226
New
dokuzbir
Hello, I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these buyer = %{ id: ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

We're in Beta

About us Mission Statement