https://pragprog.com/titles/pb7con/seven-concurrency-models-...
What I have never used, but is inferred from https://en.wikipedia.org/wiki/List_of_concurrent_and_paralle... and in special the original CSP is how all this lacks total control in build your network patterns.
In special, is my dream to have a language that allows to express better what is explained starting here:
https://zguide.zeromq.org/docs/chapter2/
There is not (AFAIK) languages that make nice to properly wire this AND keep the semantic understanding/composability of it.
For example, is hard to know if a function if is running in a thread/process, what is their priority, etc.
I imagine that a language with orchestration (like Erlang/Elixir) in a explicit way will be far easier, but is hard to figure how do it with good composability
Most simplistically, ports are designated as "input" or "output" (from point of view of the node). But, these designations can be expanded so that ports can carry designations matching the ZeroMQ socket patterns. The implementation can then leverage the transport agnosticity of ZeroMQ when supporting adaptation to MT vs MP but with the cost that all edges require data serialization instead of pointer passing.
If you need to use Go, there is also ergo: https://github.com/ergo-services/ergo
Yet another cool tool is lunatic: https://github.com/lunatic-solutions/lunatic
You can build cyclic data-flows [2] - not just DAGs - which seems a key ingredient.
You can also write contract-based tests that verify the end-to-end behaviors of your "agents" [3].
Today, you're limited to SQLite or TypeScript. Looking forward, we aim to open it up to any program packaged in a docker container.
[1] https://docs.estuary.dev/concepts/derivations/
[2] https://docs.estuary.dev/concepts/derivations/#approving-tra...
IIRC, Akka based their implementation on Erlang (possibly OTP), but it's been a long time since I did anything with either Erlang or Scala, and I never used Akka in Java.