Skip to content

eigr-labs/steinadler

Repository files navigation

Steinadler

Overview

Steinadler is a high-level alternative to Erlang Distribution. While we are aware of the incredible capabilities of the Erlang Distribution we also know that there are numerous deficiencies in this protocol that we are trying to address.

The main points we try to attack is regarding the security of applications in a cluster. Although Erlang Distribution supports tls/ssl the setup to achieve this benefit is not simple, therefore we propose a simplified API for using TLS making all applications in a cluster communicate securely.

Another point has to do with scalability, Erlang Distribution has certain limits that we try to overcome with our approach making really large clusters possible. We also do this with a network topology that is easily bridged via NAT technologies and/or firewalls.

Running locally

$ iex --name node1@ip -S mix

iex(1)> Steinadler.start_link([cluster_strategy: :gossip])

10:29:38.250 [debug] Starting node :"node@ip

In another terminal try:

$ iex --name node2@ip -S mix

iex(1)> Steinadler.start_link([cluster_strategy: :gossip])

10:29:38.250 [debug] Starting node :"node2@ip

10:29:41.392 [debug] Connecting with Node: "node1". On Address: "127.0.0.1"
 
10:29:41.392 [info]  [libcluster:steinadler] connected to :"[email protected]"
 

Call function in remote Node:

iex([email protected])1> # Execute code in all Nodes  
nil
iex([email protected])2> import Steinadler.Node

iex([email protected])3> list() |> Enum.map(fn node -> spawn(node, Test, :hello, ["world"]) end)

iex([email protected])4> # Or
nil
iex([email protected])5> spawn(:all, Test, :hello, ["world"]) end)

Features

  • Node discovery. ✓
  • Tls support. ✓
  • Cookie support. ✓
  • Execute functions in one, all or some nodes. ✓
  • Send messages to named process.
  • Backpressure.
  • Retry with backoff. ✓
  • Stream over Network (StreamRef)

Project Status

  • Node discovery
  • gRPC Server
  • gRPC Client (Elixir)
  • gRPC Client (Rust)
  • Execution of Functions on Remote Node
  • Caching of function arguments
  • Node labels.
  • Send messages to named process.
  • Supported Types
    • Atoms
    • Booleans
    • Bytes
    • Floats
    • Integers
    • Lists
    • Maps
    • PIDs
    • References
    • Strings
    • Structs
  • Cluster Registry
  • Cluster DynamicSupervisor
  • StreamRef (Reactive Streams over Network)

Benchmark

TODO

Releases

No releases published

Packages

No packages published