Mostly Erlang’s OTP and Elixir’s additions on top of it – processes, Task
s, Agent
s, GenServer
s, Supervisor
s, and all that jazz. The reason OTP is much ahead than Akka and others is that they don’t go all the way to fault-tolerance and lagless operation while OTP (and the BEAM VM itself) is designed so the system keeps a predictable lag even under heavy load. Furthermore, order and deliverability of messages to processes is guaranteed.
There’s no other runtime system like BEAM / OTP that can utilise the actor model so well. It simply does not make mistakes, ever. And where you make mistakes, the system allows for self-healing (if you use OTP’s primitives).
Add on top of that this system can almost transparently do parallel processing while 99% of all other languages and frameworks are just making their first steps, and you can see why the people who heavily use Erlang and Elixir are fans. The runtime is simply light years ahead of everything else in these departments (although as already mentioned, it is not the most performant one). Sure everybody else can spawn threads but that’s extremely error-prone. The actors plus the transparent multiplexing on all CPU cores is proven historically to be the much better programming model.
As for drawbacks, you have correctly identified them. I like to think that this community is much more objective than many others because you will not hear people here say “just use Elixir for everything!”. On the contrary, there’s a number of scenarios where it’s not a good fit, as you discovered.
If you need a system that doesn’t make mistakes in its contracts and promises and which can parallelise tasks almost transparently, and is quite adequately fast as a bonus, Erlang/Elixir are your tech. You simply can’t make a mistake using them, and the community periodically adds support for more arcane / corner standards or protocols or data serialisation formats.
If however you need a lot of raw speed, or simply can’t convert your organisation (“we can’t find Elixir devs” seems to be a often-repeated mantra) then just don’t risk it and use either old tech like PHP / Python, or a new and emerging and constantly improving tech like the Rust ecosystem.
Erlang/Elixir are fantastic glue languages that can also do much more in addition to that role. I’d pick them for 80-90% of any random project I might have coming my way. For everything else I’d go for Rust or, if I have no other choice, PHP/Python/Ruby.