Skip to content

Feat: Per-method label-balancing overrides route methods like debug_* to a premium/archive group #249

Description

@EvanTedesco

Problem

label-balancing.order applies to all traffic on a chain. methods.enable/disable only allow/deny a method per upstream. There's no way to say "this method should prefer a specific label group." That forces all-or-nothing: send everything to premium (expensive), or let methods only archive/premium nodes serve reliably fall onto public upstreams, where they fail, return null, or hit pruned state.

This is acute in non-production where you want cheap public upstreams for ordinary traffic, but a handful of methods (debug_traceBlockByNumber, trace_*, wide eth_getLogs, historical eth_call/eth_getBalance) must reach archive. Today the workaround is routing the whole app at premium, or keeping a separate provider outside nodecore which undercuts adopting nodecore as the single ingress.

Proposal

Add a per-method override of label-balancing order, matched by method name/pattern (consistent with rate-limit rule matching), definable globally and per-chain:


upstream-config:
  label-balancing:
    order: [public, premium]
  method-label-balancing:
    - pattern: "debug_.*|trace_.*"
      order: [premium]          # prefer premium for these methods
      pass-on-error: false      # stay within premium; don't fall back to public
Matching methods use the overridden order; everything else uses the default. pass-on-error reuses existing fallthrough semantics so operators choose prefer-vs-pin.

nodecore already lets methods influence upstream selection: sticky routing pins filter methods to their creating upstream, and methods carry a logical group field. This proposal extends those existing constructs with a group/label target.

Why it matters

nodecore becomes the single ingress for mixed public/premium infra without app-side provider routing: public-tier cost on the ~95% of traffic that's fine there, guaranteed archive/premium for the few methods that require it.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions