8 ms·
Why not use Go? They have one of the best networking stacks among language standard libraries, excellent support for low latency soft real-time concurrent opera
by melony 3y ago
Why not use Go? They have one of the best networking stacks among language standard libraries, excellent support for low latency soft real-time concurrent operations, and single binary deployment is trivial.
- cheeseblubber 3y agoWe were more familiar with Elixir since our last product was another real-time chat app built in Elixir/Phoenix.
- fndex 3y agoIMHO, Elixir has much more powerful networking capabilities than Go. And as for deployment, https://hexdocs.pm/mix/1.12/Mix.Tasks.Release.html https://hexdocs.pm/mix/1.12/Mix.Tasks.Release.html Not to mention how good Phoenix and Ecto are. I would never think about using Go if Elixir is a suitable option.
- throwawaymaths 3y agoElixir has releases, so deployment is not really that hard whether or not you use containers. And the beam networking stack is quite good, which is unsurprising given it's been in slowly evolving use for 30 years now. In go you just don't get stuff like "trivially cleaning up associated resources with zero lines of code when your socket gets early terminated by the client or a backhoe cuts the network in to the data center"
- jolux 3y agoFor me personally (not OP): I find Elixir more ergonomic, the networking stuff is very solid, soft realtime is the whole reason it exists, and I don't need single binary deployment because everything is going to be running in a container in AWS anyway. Elixir also has Releases, which let you deploy a self-contained application more easily. But I think Go might let you cross-compile out of the box, which you can't do with Releases out of the box as far as I know.
- throwawaymaths 3y agoCross compilation is possible in elixir with burrito.
- jolux 3y agoI've never tried it but I think I've heard of it. Regardless, it's a third-party tool, so not at the same level of support as Go.
- throwawaymaths 3y agoTechnically ecto, phoenix, plug, cowboy/bandit and Jason are third party tools too.
- jolux 3y agoYes, I'm aware. I've been programming in Elixir since 2014. I didn't intend to imply that being third-party means these are bad tools, they're not. They're great. But Go people often harp about how much stuff is in the standard library, so it felt relevant to mention.
- throwawaymaths 3y ago:) just thought it was a good idea to bring it up to make clear some major differences between the two communities
- ianbutler 3y agoNot OP. Very personal opinion: Go is an ugly language and I don't enjoy working in it for that reason alone. Outside of that, I also don't like the language design for a lot of its features. Though, admittedly, the goroutines part is not one of those choices I dislike. But the error handling pattern, generics and a few other things are super meh to me. And everything Go does with networking and concurrency, Elixir does better. Elixir just doesn't have the backing of a big name like Google so it doesn't have the same popularity.
- reeaper 3y agoSometimes I want partial application and other functional paradigms... to reduce LOC by 90%
- adregan 3y agoI’m currently in the process of picking up elixir. When you say partial application, are you referring to the use of the capture operator `&`?
- pdimitar 3y agoNot your parent commenter but likely they at least partially meant that, yes. Though that alone can't reduce LoC by 90%. Elixir is just incredibly terse and no-bullshit language in general. All the shorter code idioms together make for a readable and to-the-point code.
- reeaper 3y agoBad explanation from a noob (me), but basically yes. Functions just always fit together and I don't need ugly sprawling interfaces or pointless declarations of nearly identical functions. In Elixir when I want to pass a function with 3 arguments into an interface that expects 4, I can do something inline with no extra boilerplate like func(&1, &2, &3, <a default 4th value to be used in each invocation>)
- cultofmetatron 3y agogo is great at a lot of things but if you want a multi clustered websocket solution, elixir is the absolute best in this category. go has go threads. elixir has the actors, futures, message passing, immutable data structures and the OTP platform. OTP is killer and gives you genservers with pubsub and the ability to have thousands of tiny stateful processors PER machine. Its all battle tested too. comparing go to elixir in this particular case is like comparing a piper cub to a jet liner source: 5 years of experience building an elixir startup with realtime sync between devices over websockets as a killer feature.
- foldr 3y ago> the ability to have thousands of tiny stateful processors PER machine Go has this too. It also has message passing (via channels). That's not to deny that Elixir/Erlang have a more developed story for IPC, process supervision and clustering.
- whalesalad 3y agogolang is pretty rudimentary versus the BEAM and OTP. It is hard to compare erlang/elixir to a traditional language. They benefit from the fact that you can run literally hundreds of thousands of processes on a single node all doing their own independent thing and managing their own state.
- rco8786 3y agoGeneral distaste for writing `if err := nil { return err }` over and over and over
- Dowwie 3y agoThe best language for the task at hand, when presented with time constraints, is the one that you already know well. OP said in the article that they authored Papercups [1]. Adopting Elixir for a websocket-push service makes a lot of sense, then. However, why don't you learn Elixir, some OTP, and then reconsider that question? You could be missing out. [1] https://github.com/papercups-io/papercups https://github.com/papercups-io/papercups