Summary
Shared Solana RPC pools many users behind common endpoints, so you get fast setup and low cost but contend for throughput, rate limits, and WebSocket slots. Dedicated Solana nodes give your workload its own resources, predictable capacity, and room for archive, trace, and subscription-heavy patterns. This article breaks down the tradeoffs, the workload signals that push you toward one model, and how to evaluate providers such as OnFinality for either path.
Solana's throughput profile makes RPC access a different problem than on EVM chains. Blocks land quickly, transactions are dense, and clients often need both HTTP polling and WebSocket subscriptions at the same time. That is why the dedicated-versus-shared question comes up so often: the answer changes what you can build, not just what you pay.
Quick recommendation
Use this short guide before you read the rest. It maps the most common situations to a starting model.
- Prototypes, hackathon builds, and low-traffic dashboards: start with shared access. You get a working endpoint immediately and can validate product logic before spending on infrastructure.
- Production apps with steady read traffic and occasional bursts: start shared, but measure. If you see throttling, elevated error rates, or subscription drops during peak windows, plan a move.
- Trading bots, indexers, and anything that depends on WebSocket reliability: lean toward dedicated. Shared pools can drop or rotate subscriptions under load, which is hard to debug from the client side.
- Archive queries, large
getProgramAccountsscans, or heavygetSignaturesForAddresspagination: dedicated nodes with archive support are usually the right fit because these calls are expensive and long-running. - Teams that need predictable capacity for a specific SLA: dedicated, with a clear capacity plan and a failover endpoint.
If you are unsure, the practical path is to run shared access in staging, instrument it, and use that data to justify dedicated capacity. OnFinality offers both models, so you can compare them under the same tooling. See RPC pricing and supported RPC networks for current options.
What "shared" and "dedicated" actually mean on Solana
Shared access means your requests go to a pool of Solana nodes that many customers use. The provider handles load balancing, health checks, and node upgrades. You get an endpoint, a rate limit, and whatever transport the provider exposes. The upside is zero operational work. The downside is that your traffic competes with everyone else's, and the provider decides how to prioritize it.
Dedicated access means a node (or a small cluster) is reserved for your workload. You are not sharing CPU, disk I/O, or network bandwidth with unrelated tenants. That matters on Solana because certain RPC methods are genuinely heavy: getProgramAccounts with filters, getSignaturesForAddress over long ranges, and getBlock on large slots can consume significant memory and disk. On a shared pool, those calls are usually rate-limited or restricted. On a dedicated node, they are a capacity planning question instead of a policy question.
A useful mental model: shared access optimizes for breadth and cost, dedicated access optimizes for depth and predictability.
Where shared access breaks down
Shared Solana RPC is not a toy. For many apps it is the correct choice for a long time. But there are recognizable failure patterns that show up as you grow.
| Symptom you observe | Likely cause on shared access | What to do next |
|---|---|---|
| HTTP 429 responses during peak hours | Pool-wide rate limit shared across tenants | Add backoff, cache reads, or move heavy calls to a dedicated node |
| WebSocket subscriptions silently stop | Connection rotation or slot limits on the shared pool | Reconnect logic plus a dedicated WebSocket endpoint |
getProgramAccounts returns errors or times out | Method restricted or capped on shared tiers | Move scans to a dedicated node with archive data |
| Latency spikes with no code change | Noisy-neighbor load on the shared pool | Measure p95/p99, then evaluate dedicated capacity |
Inconsistent getBlock results for old slots | Node pruned older ledger data | Use a dedicated archive-capable node |
None of these are reasons to avoid shared access entirely. They are signals that your workload has outgrown the model.
Workload signals that justify a dedicated Solana node
Rather than guessing, look at your own telemetry. These are the signals that most reliably point to dedicated capacity:
- Sustained request volume near your rate limit. If you routinely hit 60-80% of your allowance, you have no headroom for traffic spikes.
- Subscription-heavy architecture. If your app keeps hundreds or thousands of WebSocket subscriptions open, shared pools may cap or rotate them.
- Heavy read patterns. Indexers, analytics dashboards, and wallet backends that paginate through signatures or scan program accounts benefit from dedicated disk and memory.
- Latency sensitivity. Trading and liquidation logic cares about tail latency, not averages. Dedicated nodes remove noisy-neighbor variance.
- Compliance or isolation requirements. Some teams need to know exactly which node serves their traffic.
If two or more of these apply, dedicated access is usually cheaper than the engineering time spent working around shared limits.
Connecting to Solana RPC: a quick reference
Before comparing providers, confirm your client config is correct. Solana uses JSON-RPC over HTTP plus a separate WebSocket endpoint for subscriptions.
# HTTP request against a Solana RPC endpoint
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "getLatestBlockhash",
"params": [{"commitment": "confirmed"}]
}'
// WebSocket subscription with @solana/web3.js
import { Connection } from "@solana/web3.js";
const connection = new Connection(
"https://solana.api.onfinality.io/public",
{ wsEndpoint: "wss://solana.api.onfinality.io/public-ws" }
);
const subId = connection.onSlotChange((slotInfo) => {
console.log("slot", slotInfo.slot);
});
These public endpoints are fine for development and light traffic. For production, you will typically move to a keyed endpoint or a dedicated node. The Solana network page lists the current endpoints and transports OnFinality supports, and Solana Devnet is available if you need a test environment.
How to evaluate providers for either model
When you compare providers, the questions are different depending on the model you are buying. Use this matrix as a checklist.
| Evaluation area | What to ask for shared access | What to ask for dedicated access |
|---|---|---|
| Rate limits | Requests per second and per method, and how bursts are handled | Node specs, expected throughput, and how capacity is sized |
| Method support | Which heavy methods are allowed, capped, or blocked | Whether archive, trace, and full method set are enabled |
| WebSocket behavior | Connection and subscription limits, rotation policy | Dedicated WS endpoint and subscription capacity |
| Failover | Whether the pool has redundant nodes behind it | Redundancy options and how failover is configured |
| Observability | Status page, error reporting, and usage dashboards | Per-node metrics and access to logs or alerts |
| Support | Response channels and escalation path | Named support and onboarding help |
| Pricing model | Per-request or tiered plans | Per-node or reserved capacity pricing |
OnFinality appears in both columns: shared RPC API access through the API service, and reserved capacity through dedicated nodes. Competitors in this space generally offer similar splits, so the differentiators are usually method support, WebSocket handling, and how transparent the capacity model is.
Cost and risk tradeoffs
Shared access has low fixed cost and variable performance. Dedicated access has higher fixed cost and more predictable performance. The decision is rarely about raw price; it is about what a bad request costs you.
Consider a trading bot. If a dropped WebSocket subscription causes a missed liquidation, the cost of that failure dwarfs the monthly difference between shared and dedicated. Now consider a read-only analytics dashboard. If a slow query just means a spinner for two extra seconds, shared access is fine and dedicated capacity is overkill.
A practical middle path: run shared access as your default, and route only the expensive or latency-sensitive calls to a dedicated node. This keeps costs down while protecting the paths that matter.
Migration checkpoints
If you decide to move from shared to dedicated, treat it as a controlled migration rather than a switch.
- Inventory your methods. List every RPC method your app calls and how often. Flag the heavy ones.
- Baseline your metrics. Record p50, p95, and p99 latency, error rates, and subscription stability on shared access.
- Provision the dedicated node. Confirm archive needs, WebSocket capacity, and transport support before cutover.
- Run in parallel. Point a percentage of traffic at the dedicated node and compare against the baseline.
- Cut over by workload. Move the heaviest or most latency-sensitive calls first, then the rest.
- Keep a fallback. Retain a shared endpoint as a failover target and document the switch logic.
A simple monitoring probe helps confirm the new endpoint behaves as expected:
# Lightweight health probe for a Solana RPC endpoint
for i in $(seq 1 5); do
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" \
https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}'
done
Key Takeaways
- Shared Solana RPC is the right starting point for most teams: fast to set up, low fixed cost, and adequate for steady read traffic.
- Dedicated Solana nodes matter when you hit rate limits, depend on WebSocket reliability, run heavy scans, or need predictable tail latency.
- The clearest signal to move is your own telemetry, not a provider's marketing. Watch p95/p99 latency, 429 rates, and subscription drops.
- You can mix models: shared for general reads, dedicated for expensive or latency-sensitive calls.
- Evaluate providers on method support, WebSocket behavior, failover, observability, and how transparent their capacity model is.
- OnFinality offers both shared RPC API access and dedicated node capacity for Solana, so you can compare them under the same tooling.
Frequently Asked Questions
Is shared Solana RPC good enough for production?
For many read-heavy apps, yes. It becomes a problem when you approach rate limits, rely on long-lived WebSocket subscriptions, or run heavy methods like getProgramAccounts.
What is the main difference between dedicated and shared Solana nodes? Shared nodes serve many tenants from a common pool; dedicated nodes reserve resources for your workload. The practical difference shows up in rate limits, method support, WebSocket stability, and tail latency.
Do I need a dedicated node for WebSocket subscriptions? Not always, but subscription-heavy apps benefit from one. Shared pools may cap or rotate connections, which is hard to diagnose from the client side.
Can I use both models at the same time? Yes. A common pattern is shared access for general reads and a dedicated node for expensive or latency-sensitive calls.
How do I know when to migrate? When your metrics show sustained high utilization, frequent 429s, subscription drops, or latency spikes that correlate with load rather than your own code.
Does OnFinality support both shared and dedicated Solana access? Yes. You can start with the shared RPC API and move to dedicated capacity as your workload grows. Check RPC pricing and the Solana network page for current details.