The Syndicated Actor Model
syndicate-lang.org
syndicate-lang.org
See also Goblins, an actor model + object capability system inspired by a lot of the same stuff (like E) that uses the Preserves-derived Syrup format for encoding messages over the network. https://spritely.institute/goblins/
There's also a standard in development for communicating capabilities over the network called OCapN: https://ocapn.org/
Probably more in the thesis, but at a glance this mention isn't further defined or referenced. The https://en.wikipedia.org/wiki/Ambient_calculus is quite beautiful and IMHO doesn't get the attention it deserves. Undergrad as far as I know never covers it, and most people I meet have never heard of it. AFAIK tuplespaces also are not usually taught, and people that have heard of it tend to dismiss it as "just some obsolete old java thing" because the most popular implementation probably does fit in that category. A shame since this is really cool stuff.
One problem that I see with all 3 technologies (ambients, tuplespaces, and syndicate) is that they sit somewhere at the intersection of datastructures / infrastructure / frameworks, but don't have clear and obvious deployment options. Compare this with say, akka on kubernetes. No matter how cool your tech is, this is an immediate non-starter for everything except academic investigation or low-level systems programming. Synit for user-space sounds neat, but if syndicate is generally a better model than Akka and additionally productionizing the other great ideas of past concurrency research, then it would be awesome to see the gap for other use-cases addressed.
> One problem that I see with all 3 technologies (ambients, tuplespaces, and syndicate) is that they sit somewhere at the intersection of datastructures / infrastructure / frameworks, but don't have clear and obvious deployment options.
I disagree. I think it's simply still science fiction and the cutting edge of distributed research which isn't very popular in academia these days. Actors (1978) are just now barely becoming mainstream with the hype of Elixir and rediscovery of Erlang, even though the world still runs on multithreaded C and dead locks.
The tech is cool, but no one is being paid just yet to create practical languages and environments out of this. As in many other scientific endeavours, mainstream programming paradigms tend to lag 20 or 30 years compared to the research.
I have never heard of these ideas about the Syndicated Actor, but they seem like they might hold answers for issues in the Fediverse and make implementing local-first software more practical,.
We have things with synchronizing state between web clients and servers and jump though all kinds of hoops with that (example, Relay), and I wonder if this would help with that. Lumen (Elixir on WASM) has stalled in development and LiveView is popular, but maybe with this, that is not what we want to do anyways.
We have things like event-driven architecture, microservices, and DDD, but maybe that results from using narrowly-scoped primitives that isn't suitable for everything. But we use it for adjacent use-cases because that is all we have for commercial languages.
I'd love to see how this can work out in Elixir.
Such a thing might handle web as a special case, and could maybe evolve towards secure by design / provably-secure in ways that could be new/interesting. Or it might be a more expressive kind of FaaS, or be wildly popular with the "kubernetes is too complex/expensive!" crowd, especially if it can somehow integrate components written in other languages.
Just dreaming though, I only wish this kind of stuff was my day job. And even if I had really concrete ideas, something more solid than a proof of concept for such things probably needs a small army of devs. Phoenix does have the major benefit of actually existing, which is nice!
This kind of parallel programming fell out of favor with PVM and MPI kind of taking over the space in the late 90s, but I suspect Tuplespaces were just a bit ahead of their time.
Things like this can potentially really help with the observability of distributed systems, which has been a huge pain especially in areas of eventual consistency.
That said, I really, really appreciate when I can see a tangible piece of code that solves a real problem. In the case of concurrency, perhaps a hello world from an actor, ping pong, a chat room, cancellation, timeout or similar. Show something that's easy to do in this model, which is tedious to do in different models. (This shouldn't be hard to find, since concurrency is ridiculously easy to get wrong in most languages).
If a partial goal is to engage practicians, then code samples is very effective. I usually don't need the full theory to grok code even in a foreign paradigm. If I can get an initial sense and I like it, then I am infinitely more willing to read up on the theory. Now, unfortunately, you're missing out on one very curious, albeit lazy, reader.
For the record, the closest I could find was some pseudo-code[1]. If there's more please share!
[1]: https://synit.org/book/syndicated-actor-model.html
EDIT: I'm stupid, there are a couple of examples on the linked page if you scroll down. I wish there were more!
Tell me about it. I also lack formal education, and a lot of advanced research into distributed communication models is basically expressed in alien languages to me, i.e. pi-calculus, rho-calculus, even Hewitt's research. It is both fun and a bit frustrating trying to figure out how they would work in practice from formal academic papers.
This one has a lot of actual Racket code though, you might want to read the history section for some practical examples.
You might find the ~blog/journal part of the site interesting, wrt examples: https://syndicate-lang.org/journal/ -- still not exactly an embarrassment of riches, but it's something.
Decent articles on Orleans and Virtual Actor model.
https://learn.microsoft.com/en-us/dotnet/orleans/overview
https://darlean.io/the-virtual-actor-model/
Discussion on Orbit by EA:
https://news.ycombinator.com/item?id=31192795
This basically makes C# behave Erlang esque. You can have a single server running until load kicks off, and even if you destroy a node, spinning it up again is easy. Nodes maintain their own state and can be across systems as needed. You can also do zero-downtime updating like in Erlang. It's really neat. I assume Syndicated Actor Model solves a similar problem, but it looks like they make use of an MQ as needed.
What's funny about Orbit though is the Akka devs wrote some sort of "hit" piece about why their model is fine, and you don't need Virtual Actors.
[1] https://docs.dapr.io/developing-applications/building-blocks...
You could tie your own hands in approximately same way in a typical monolithic codebase by spinning out some Actor/Grain base types and enforcing a similar execution model around their implementations.
Carl Hewitt's actor model (often seen in Erlang, Akka & co.) uses message-passing to communicate between concurrent actors, but doesn't easily allow for state synchronization or dynamic topologies of actors.
Tuple Spaces [https://en.m.wikipedia.org/wiki/Tuple_space] are another paradigm for distributed communication where message tuples are stored into distributed shared "space" and processes can pull messages that match a certain pattern. Very much like how biological cell communicate between each other, which allows for dynamic topologies, but you lose any concept of ordering (message X came before message Y)
The Syndicated Actor model is an attempt at bridging the two ideas to dynamically allow neighbouring actors to coordinate and communicate with each other using something like pub/sub.
---
The history page is very much worth reading: https://syndicate-lang.org/about/history/
Here's the author's doctoral thesis: https://syndicate-lang.org/papers/conversational-concurrency...
And SYNIT, a reactive layer for Linux which aims to replace most user-space subsystems with this model: https://synit.org/book/
I understand Erlang and the actor model and how distributed processes work, but what is unique in the Tuple Space aspect? I vaguely recall getting it but it doesn't register for me now.
Maybe it's because Erlang already has pub/sub for every 'thing?'
Process in a tuple space just communicate through shared memory. Messages have no address. And processes can write or pattern match messages from this shared memory space.
Process A:
put({"foo", "bar", 123})
put({"foo", "quux", 456})
Process B, later:
get({"foo", ?x, 123})
# here x = "bar"
Imagine a cell communicating with others by squirting out molecules meant for no one in particular, and having external receptors to match specific other molecules.This allows actors that have not been designed to work with each other to communicate, just by sharing the same tuple space.
> State management via dataspaces is directly comparable to a distributed datalog-based system, and enjoys many of the same benefits.