Ergo: Erlang-inspired event driven actor framework in Go

Go vs other ecosystems & “batteries included”

  • Several comments praise Go’s rich standard library and “zero dependencies” approach; seen as simpler than Rust’s many competing crates.
  • Others argue external ecosystems can surpass stdlib quality at the top end (e.g., logging, error handling), but are fragmented and inconsistent.
  • Critiques of Go stdlib include: confusing time API and types, lack of simple date/time arithmetic, lack of guaranteed system CSPRNG access, mediocre logging levels in log/slog.
  • Comparisons note that Python/Java/.NET have more “batteries” (GUI, DI, rich collections, plugin systems), but Go’s culture resists “magic” features (reflection-heavy DI, AOP).

Ergo’s design, API, and Erlang integration

  • Ergo is an Erlang-inspired actor framework in Go; commenters like the concept and name but want clearer examples and less boilerplate.
  • Examples exist in a separate repo; the API closely mirrors Erlang/OTP concepts but with Go-style boilerplate and type-switching.
  • There is support for talking to real Erlang nodes, but some Erlang/OTP compatibility has moved to a commercial repo.
  • Some suggest for Erlang integration it may be simpler to use NIFs, ports, or plain network services rather than joining BEAM clusters.

Goroutines vs BEAM processes

  • Key differences highlighted:
    • Goroutines are not directly addressable; communication is via channels, not per-process mailboxes.
    • No built-in links/monitors, no process dictionary, no ability to externally kill a goroutine; termination is cooperative via contexts.
    • Channels can block senders and are capacity-bounded; Erlang mailboxes are unbounded and non-blocking for senders.
  • Ergo cannot fully replicate OTP semantics:
    • Kill only takes effect after the current handler returns (possible “zombie” period).
    • No hot code reloading.
    • No per-process GC; Go’s GC is global.

GC, performance, and hot code reloading

  • Per-process GC on BEAM gives fine-grained pauses and good fault isolation; Go uses a highly optimized global GC with very low pause times.
  • Some argue Go is generally faster and its GC is “good enough” for most workloads; BEAM still wins on predictable, non-bursty latency and isolation.
  • Hot code reloading is absent in Ergo/Go; Erlang uses it heavily in some domains, while Elixir commonly uses limited hot reload for development (e.g., web frameworks).

Use cases and necessity of actors

  • Supporters see actors as a fine-grained tool: parallelizing loops, isolating subsystems (logging, sessions, pools) more cheaply than separate processes + Kafka.
  • A backend engineer with stable gRPC/Kafka systems questions why actors are needed; responses suggest thinking at a smaller granularity than whole services.
  • Some feel that if you truly need robust actor semantics and supervision trees, you should use BEAM languages (Erlang/Elixir) or other actor platforms (Akka, Orleans), not Go.

Critiques: boilerplate and language fit

  • Multiple comments dislike the verbosity and ergonomics of actors in Go compared to Erlang syntax and semantics.
  • Skeptical voices claim frameworks like Ergo fight Go’s philosophy of simplicity and may be misusing the language; others are cautiously optimistic but want better docs and concrete, real-world examples (e.g., supervision trees and database interaction).