`ClusterRouter` (#50) ships with round-robin / random / consistent-hashing / broadcast. The v1 commit explicitly noted smallest-mailbox as out-of-scope because it requires pull-based mailbox-size queries per routee per message.
Why it's useful: uneven workloads. Some routees are slow (slow downstream, GC pause) — round-robin keeps piling messages on them. Smallest-mailbox queries every routee's queue depth and picks the shortest.
Implementation idea:
- Each routee actor exposes `MailboxDepthRequest` system message → replies with its current size.
- Router caches per-routee mailbox-depth with a TTL (e.g. 100ms).
- For a route decision: serve from cache if fresh; else send concurrent depth queries with a short timeout (50ms), pick the smallest.
- Cross-node depth queries ride the cluster transport — accept some overhead in exchange for better load balance.
Trade-off: added latency per route decision when cache is cold. Document that round-robin is still the right default for evenly-balanced workloads.
Estimate: 2-3 days.
`ClusterRouter` (#50) ships with round-robin / random / consistent-hashing / broadcast. The v1 commit explicitly noted smallest-mailbox as out-of-scope because it requires pull-based mailbox-size queries per routee per message.
Why it's useful: uneven workloads. Some routees are slow (slow downstream, GC pause) — round-robin keeps piling messages on them. Smallest-mailbox queries every routee's queue depth and picks the shortest.
Implementation idea:
Trade-off: added latency per route decision when cache is cold. Document that round-robin is still the right default for evenly-balanced workloads.
Estimate: 2-3 days.