8 ms·
What Erlang Taught Me About Distributed Systems
- enraged_camel 9y ago>>Elixir depends on the decades of development behind the Erlang VM and in many ways is just syntactic sugar on top of Erlang/OTP I think calling Elixir "just syntactic sugar" is a gross and unfair oversimplification. While friendly syntax is one of its welcoming qualities, Elixir is its own language. It doesn't "transpile" into Erlang. It compiles down to bytecode.
- rubiquity 9y agoI agree with your post because Elixir has brought so much beyond syntax to the BEAM such as tool aesthetics and community building. However, Elixir does not compile to BEAM bytecode directly. The compiler emits Erlang terms first which are then compiled to bytecode.
- dmitriid 9y agohttps://medium.com/@fxn/how-does-elixir-compile-execute-code-c1b36c9ec8cf https://medium.com/@fxn/how-does-elixir-compile-execute-code... Elixir creates an AST which is transformed into Erlang Abstract Format (http://erlang.org/doc/apps/erts/absform.html http://erlang.org/doc/apps/erts/absform.html) which is then compiled into Erlang bytecode by Erlang compiler. Erlang VM's bytecode is largely undocumented (except for third-party attempts like http://erlangonxen.org/more/beam http://erlangonxen.org/more/beam and http://beam-wisdoms.clau.se/en/latest/ http://beam-wisdoms.clau.se/en/latest/). So all languages on the Erlang VM either create and compile Erlang Abstract Format or transpile to Core Erlang (https://8thlight.com/blog/kofi-gumbs/2017/05/02/core-erlang.html https://8thlight.com/blog/kofi-gumbs/2017/05/02/core-erlang....)
- gootik 9y agoDon't forget about https://github.com/happi/theBeamBook https://github.com/happi/theBeamBook
- kureikain 9y agoWhen Elixir first came, I think like you. Eventually I try to do something with Elixir. Then suddenly everything is so good. The whole experience how I create a new project with `mix`, get dependencies, build, compile, run `repl` was so much better than rebar. To me, `mix` is the greatest tool. I don't see something like mix in other languages, except Clojure and Leiningen. The community around Elixir is awesome too. It's very different from Erlang type. I have a hard time to find library and stuff in Erlang before. I don't have a central place to look for that. Elixir brough me hex.pm. I personally like Erlang syntax, I think it's short and concise. But I end up like Elixir much more than Erlang.
- rs86 9y agoYep much more then syntax. It has great metaprogramming support, better records and polymorphism support.
- julienmarie 9y agoI discovered Erlang in the late 2000s via its kinda weird and iconic video "Erlang the Movie" https://www.youtube.com/watch?v=xrIjfIjssLE https://www.youtube.com/watch?v=xrIjfIjssLE that prompted me to dig further. I was at the time an average developer. Erlang, and Joe Armstrong books and videos, made me understand things that other web-oriented languages ( Ruby, PHP... ) never really dug into at the time. Because the Erlang ecosystem is more than distribution. Distribution is a consequence of its design around concurrency and message passing and let-it-crash/auto-healing philosophy. Erlang, and after that Elixir, made me think differently about code and made me a better programmer.
- paulsutter 9y agoThe sequel is shorter and more fun, “all erlang needs is an image upgrade.. we need something fresh, something edgy” https://youtu.be/rRbY3TMUcgQ https://youtu.be/rRbY3TMUcgQ
- cuddlybacon 9y agoI love it! When will OTP be updated to support Blockchain?
- kirillseva 9y agoHaha, this reminds me of red-lang's approach to get funded via ICO https://ico.red-lang.org/ https://ico.red-lang.org/
- nudpiedo 9y agoI expected a bit more of content in the article, like which components of kubernetes equals which OTP functions or general patterns and how easy can be to implement your mini-kubernetes on Erlang, not just “hey they both solve the problems of a distributed by using similar patterns”. I wish I could downvote but this feature does not seem available in my UI, I guess only certain users can downvote.
- icebraining 9y agoNobody can downvote submissions (well, except the mods).
- di4na 9y agoThe main difference sadly break most of the analogy. Because a pod is far from the granularity of a process. It is closer to the granularity of an application, the biggest abstraction that OTP gives you. What that mean is that k8s does not have the same property than erlang. In erlang, isolation is your go to tool. If you need something, you spawn a process. Having a lot of really granular process makes scheduling on cores easy, makes your design easy to crash because the blast area is small, and makes it really cheap to have message passing in the core of the VM. In k8s, any networking is hard, hence the current trend of service mesh. As the unit of computation is bigger, supervision get harder. Building a supervision tree is more expensive. And crashing and restarting get more expensive too. K8s has the advantage of being language agnostic ofc. But do not forget the paradigm shift that having really cheap process give you in an integrated environment like the BEAM. And ofc, i have not even talked about the dynamic tracing that the BEAM gives.
- Steeeve 9y agoI read the article and thought it looked like a 2005 SEO article order. Has all the right words. Good length. No substance whatsoever.
- outlog 9y agoVirding's First Rule of Programming: Any sufficiently complicated concurrent program in another language contains an ad hoc informally-specified bug-ridden slow implementation of half of Erlang. https://rvirding.blogspot.com/2008/01/virdings-first-rule-of-programming.html https://rvirding.blogspot.com/2008/01/virdings-first-rule-of... (he is one of the creators of erlang / stars in Erlang the Movie)
- TurboHaskal 9y agoThat's funny, considering that the reason I'm doing concurrent programming in "another language" is due to Erlang's poor performance.
- nickh9000 9y agoErlang is not a panacea. It excels as a middle layer, one that orchestrates work. It's not a tool to perform intensive calculations.
- z3t4 9y agoWith all this message passing, have anyone experienced the network becoming the bottleneck !?
- nudpiedo 9y agoif you push your design to the limits of scalability, then you gonna hit a wall at some point (IO, memory or CPU) and as long as your application is not based on CPU intensive calculations (simulations, calculus, ...) most of the time IO is the bottleneck, network or disk. However, I am not that experienced in distributed applications and would appreciate reading the opinions from more experienced engineers.
- zbentley 9y agoIn large Erlang applications, the "send to multiple peers" broadcast tendencies of its message passing can indeed cause the network to become a bottleneck; so can the default chattiness that a lot of Erlang application developers assume for their app behavior. Fortunately, there are lots of simple-to-apply patterns and solutions when you get to that point, for example the excellent Partisan library: https://github.com/lasp-lang/partisan https://github.com/lasp-lang/partisan
- toast0 9y agoSure. As with any other distributed processing, if you have enough other resources, you can run out of network. Or if something happens to reduce capacity of the network, it's going to constrain the rest of your system. It depends on what you're doing. At work we have several systems that needed to upgrade to 2x 10G Ethernet (from 2x 1G), but not much pushes that limit at the moment. Our newer hosting is more badwidth with smaller CPU and RAM, so we expect to see more CPU constraints than network constraints.
- amelius 9y agoDoes Erlang support structural sharing between large data structures? If not, how is it possible to efficiently pass large messages between processes on the same physical machine?
- kd5bjo 9y agoYes; data structures are immutable in Erlang, so the runtime system can share them (and their substructures) freely amongst its threads.
- sb8244 9y agoI don't believe everything is shared like this. Anything smaller than 64 bytes is copied around to different process stacks. https://hamidreza-s.github.io/erlang%20garbage%20collection%20memory%20layout%20soft%20realtime/2015/08/24/erlang-garbage-collection-details-and-why-it-matters.html https://hamidreza-s.github.io/erlang%20garbage%20collection%... Is a great post
- deleted 9y ago[deleted]
- toast0 9y agoBEAM does not share structures like this. It would make garbage collection much harder. Immutability and shared nothing makes the GC simple. You couldn't compact a process heap if parts of it were in use by other processes.
- e12e 9y agoIf you want to limit yourself to a single machine: isn't that what files are for? Sharing large data between processes?
- amelius 9y agoSometimes you want to set up an efficient processing pipeline on a single machine, e.g. when writing a database engine. In that case, you don't want to serialize all communication between processes. Of course, other processes (not related to the efficient pipeline) can live on different machines.
- ngrilly 9y ago> To wrap up, it's evident that much of the work that went into Erlang has inspired the work of Kubernetes. Even if there are clear similarities between Erlang and Kubernetes, I'm not sure the former inspired the latter. We should ask Kubernetes developers :-)
- zaphar 9y agoKubernetes is based on borg which as far as I know wasn't really inspired by erlang necessarily. However I suspect the problem space lends itself to idenpendent discovery of very similar solutions.
- gtycomb 9y agoI recently went half way in a project using Erlang back-end but didn't get to a production stage mainly due to political reasons in my organization. Mnesia (Erlang’s distributed database) is remarkable and in the Erlang way it comes completely packaged with the system. My only gripe is that documentation overall is a bit hard once you start digging in. The OTP book mentioned is good but may be a bit dated (but we can figure out what is amiss still). I am not sure whether drivers for accessing external databases such as Mongo, Postgresql etc are actively maintained. (Edit: when I check it now it looks like the drivers are recently updated!)
- ngrilly 9y agoIs it possible with Erlang to make sure that two Erlang processes are co-located on the same physical node?
- _asummers 9y agoYes! Each node has a name and you would look into the functions on the Node module on how to do that. In Elixir you'd say: iex(3)> defmodule Hello do ...(3)> def world() do ...(3)> IO.puts "here we go!" ...(3)> end ...(3)> end iex(4)> Node.spawn_link(:erlang.node(), fn -> Hello.world() end) here we go! #PID<0.101.0>
- ngrilly 9y agoThanks! I should have read Erlang docs: http://erlang.org/doc/man/erlang.html#spawn-2 http://erlang.org/doc/man/erlang.html#spawn-2
- pipu 9y agoAny Erlang book recommendations?
- cinbun8 9y agoThis is fun - http://learnyousomeerlang.com/ http://learnyousomeerlang.com/
- jb3689 9y agoIf you like the O'Reilly format then I liked Designing for Scalability with Erlang/OTP. I thought it was light on the details beyond scaling beyond single node OTP apps but it covers a lot of the built-in Erlang functionality pretty well http://shop.oreilly.com/product/0636920024149.do http://shop.oreilly.com/product/0636920024149.do