System architecture
Prism RPC sits between your application and every Robinhood Chain provider you would otherwise integrate one at a time. This is what happens inside.
Layers
Edge
- TLS termination in every region you call from
- API key validation and method allowlisting
- Per-key token buckets and burst allowances
- JSON-RPC envelope and batch parsing
Balancer core
- Routing engine with four selectable strategies
- Per-provider circuit breakers with half-open probing
- Retry policy with exponential backoff and full jitter
- In-flight deduplication and deterministic-result cache
Transport
- Keep-alive HTTP pools per upstream
- WebSocket manager with automatic reconnection
- Subscription registry replayed after a reconnect
- Response validation and block-height drift checks
Upstreams
- Commercial providers: Alchemy, QuickNode, Ankr, Chainstack
- Public Robinhood Chain nodes as overflow capacity
- Optional private nodes you bring yourself
- Independent health state per upstream and per region
Request flow
A cache miss on a read, routed to the fastest healthy upstream. Timings are representative of a warm pool.
- 10.08 ms
Request received
Key validated, method allowlist checked
- 20.04 ms
Cache lookup
Deterministic results answered immediately
- 30.02 ms
Dedupe
Identical in-flight read joined instead of re-sent
- 40.11 ms
Provider selected
Healthy upstreams ranked by rolling p50
- 538 ms
Upstream call
JSON-RPC forwarded, response validated
- 60.03 ms
Metrics recorded
Latency, status and breaker state updated
Failure isolation
Each upstream carries its own breaker. One provider degrading never becomes your outage.
Closed
Traffic flows. Prism counts failures in a rolling window.
5 failures in 30s →
Open
The provider is removed from the pool. Requests reroute instantly.
after 15s cooldown →
Half-open
A single probe request is allowed through to test recovery.
probe succeeds → Closed
Retries and breakers share one rule: a request is only replayed when replaying it is safe. Reads are retried across providers freely; anything that submits a transaction is sent exactly once, to one upstream, and its failure is returned to you verbatim rather than being silently duplicated.
{
"retry": {
"maxAttempts": 3,
"baseDelayMs": 120,
"maxDelayMs": 2000,
"jitter": "full",
"retryOn": ["timeout", "5xx", "429", "connection-reset"],
"neverRetry": ["eth_sendRawTransaction"]
},
"breaker": {
"failureThreshold": 5,
"windowMs": 30000,
"cooldownMs": 15000,
"halfOpenProbes": 1
}
}Observability
Every routing decision is recorded. The same numbers Prism uses to pick a provider are the ones you see.
Provider health
live| Provider | p50 | p99 | Success | Share |
|---|---|---|---|---|
| Alchemy | 41 ms | 118 ms | 99.98% | 34% |
| QuickNode | 38 ms | 104 ms | 99.99% | 38% |
| Ankr | 52 ms | 191 ms | 99.81% | 19% |
| Chainstackbreaker open | - | - | 87.40% | 0% |
| Public node | 96 ms | 402 ms | 99.20% | 9% |