What We Talk About When We Talk About Distributed Systems
videlalvaro.github.io
videlalvaro.github.io
To put it another way, distributed system does not necessarily imply a massive research cluster connected via MPI.
On the JVM, the best group communication infrastructure is the terrific JGroups library[2]. On .NET (and soon the JVM, too) there's Vsync (Isis 2)[3]. For C/C++ (with Java and Python binding), there's Spread[4]. All three are heavily inspired by the work of (or, in the case of Vsync/ISIS, directly created by) Ken Birman of Cornell, and implement group membership and leader election, atomic multicast, failure detection and more.
[1]: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102....
[2]: http://jgroups.org/
This worked.
And once you have a real system, you can start looking into the principles of the underlying pieces such as Zookeeper etc.
[2]: http://www.allthingsdistributed.com/files/amazon-dynamo-sosp...
Any thoughts of how these compare to something like the Data Distribution Service (DDS) for group communication?
[DDS]: http://portals.omg.org/dds/
I don't know much about DDS (except that a company I used to work for bought the RTI implementation, and it was quite expensive).
Spread is an #ifdef soup containing scary stuff like "#ifndef _REENTRANT" in their hello world examples. Additionally it has a weird not quite BSD licence that doesn't look compatible with the GPL. It also makes you send them either an ssh key to checkout from subversion, or send them email/name/company info just to get the download link working.
Vsync/ISIS is a single 50KLOC C# file that spawns upwards of a dozen threads on init.
IMHO there's room for someone with more of a software engineering background to come in and clean them up (assuming that this person/group knows enough about distributed systems to clear things up without introducing more problems).
I was about to say that academic code is almost always poor quality, but that should never, ever apply to distributed systems code. If there's one thing we should see from academic distributed systems research, it's principled, well-constructed, solidly tested libraries, rather than wannabe commercial databases written by graduate students.
Focuses on theory results that are applicable to real systems and analyzes those systems.
More seriously, when I started digging into distributed systems I just started picking up papers and reading and asking questions. It was definitely a meandering path until I synthesized, maybe after 1 year, what it was all about. Reading Paxos one week and DyanmoDB the next week made it tough to see the bigger picture. I think this survey post would have been really helpful to me in the past.
Which is fine, but not everyone has the time or inclination for that. Sometimes academic papers leave out lots of important practical details, or don't make a good connection with how a system might look in the real world.
I think there's some room for a few good books that fill that space, although perhaps they exist and I'm not aware of them.
So true. Also – I've been involved in a few contexts, tangentially or otherwise, where it seemed to me that there was a root problem that no one quite understood. For reasons, that meant it had to be solved with a distributed system. Now there are more problems, because "distributed systems are really hard."
(N.B. I'm not deriding that phrase, or doubting it's accuracy; just saying that it's also used as a way to shy away from not having a clue what problem you're trying to solve in the first place.)
Basically my question is: do you have any recommendations for reading about "concurrency" but at a higher level than "concurrent programming" and less formal than "distributed systems" algorithms? Here's an attempt at explaining what I mean:
Suppose I worked for a company which mostly writes web apps in python. They don't write much multi-threaded code. They don't write native desktop graphical apps or do "systems programming". So books about "concurrent programming" with threads, or in go/scala/clojure/erlang etc seem, superficially, slightly irrelevant. Also, books about formal distributed systems algorithms seem, superficially, slightly irrelevant. But "concurrency" is still highly relevant! It's just at a higher level than is meant by "concurrency" in a programming language and it's not as formal or regular as is usually meant by "distributed systems".
What I mean is: the company handles concurrent HTTP requests resulting in concurrent database transactions; celery tasks might also be running at the same time; message-queue type problems come up frequently; they are increasingly tending towards a "service-oriented" architecture which is inherently concurrent; and, at the end of the day, all the higher-level "business logic" is some sort of emergent property of a complex, and concurrent, underlying system of apps communicating via HTTP, with asynchronous background tasks, etc. Wise senior programmers say: "Oh, you're going to need to apply some row-locking there.". Wide-eyed junior programmers say: "Oh yes, of course" and wonder, "What should I be reading to know this?".
What should they be reading?
Also, how the hell do people diagram this stuff in order to talk about it? Google searches tend to end up either in UML languages that seem to be unfashionable (but might in fact be just the right thing?) or in academic CS papers that seem to be uninfluential. But there must be something better than those pessimistic paragraphs from No Silver Bullet:
> Software is invisible and unvisualizable... The reality of software is not inherently embedded in space... As soon as we attempt to diagram software structure, we find it to constitute not one, but several, general directed graphs superimposed one upon another. The several graphs may represent the flow of control, the flow of data, patterns of dependency, time sequence, name-space relationships... In spite of progress in restricting and simplifying the structures of software, they remain inherently unvisualizable, and thus do not permit the mind to use some of its most powerful conceptual tools. This lack not only impedes the process of design within one mind, it severely hinders communication among minds.