eigr-labs / steinadler

High-Level Alternative to Erlang Distribution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 :"node1@127.0.0.1"
 

Call function in remote Node:

iex(node1@127.0.0.1)1> # Execute code in all Nodes  
nil
iex(node1@127.0.0.1)2> import Steinadler.Node

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

iex(node1@127.0.0.1)4> # Or
nil
iex(node1@127.0.0.1)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

About

High-Level Alternative to Erlang Distribution


Languages

Language:Makefile 91.7%Language:Elixir 3.7%Language:Vim Snippet 3.4%Language:Rust 0.6%Language:LLVM 0.5%Language:Shell 0.0%