Why any instead of proto.Message (v4)?
v4 allows any type as actor messages. Benefits:
- Flexibility β Plain Go structs, protobuf, or custom types
- Simplicity β No mandatory .proto definitions for simple cases
- CBOR β Efficient serialization for arbitrary Go types
Why a custom TCP frame protocol?
GoAkt uses length-prefixed binary frames over TCP instead of gRPC:- Low overhead β No HTTP/2, HPACK, or stream multiplexing
- Control β Connection pools, compression, buffer pooling tuned for actor traffic
- Fewer dependencies β Leaner than gRPC
Why Olric for cluster state?
Cluster state (actor/grain placement) needs replication. Olric provides:- Embedded β No external database
- Distributed hash map β Configurable quorum for consistency
- Memberlist β Same membership layer as the cluster
Why a tree-based actor hierarchy?
Mirrors Erlang/OTP and Akka:- Lifecycle ordering β Stopping a parent stops descendants first (depth-first)
- Scoped supervision β Parent defines failure policy for children
- Namespacing β Addresses reflect tree path; no name collisions
Why separate Actor and Grain?
- Actors β Explicit spawn/stop; caller controls lifecycle. Best for services and infrastructure.
- Grains β Identity-addressed; framework manages activation and passivation. Best for entity-per-identity patterns.