Summary
Shared Solana RPC pools route many applications through the same node fleet, which keeps onboarding simple and cost low but leaves your throughput and latency exposed to other tenants' traffic. Dedicated node access gives your workload its own node capacity, so you control rate limits, WebSocket subscriptions, and archive or trace-heavy calls without competing for slots.
The right choice depends on your workload shape: prototypes, wallets, and low-volume reads usually run fine on shared endpoints, while trading bots, indexers, and high-frequency dApps typically need dedicated capacity or a hybrid setup with failover. This article breaks down the tradeoffs, the Solana-specific constraints that matter, and how to evaluate providers such as OnFinality for either model.
Quick recommendation
If you are still validating an idea, a shared Solana RPC endpoint is usually enough: you get a working URL, standard JSON-RPC methods, and no infrastructure to run. Move to dedicated node access when any of these are true:
- Your app sends bursts of
getProgramAccounts,getSignaturesForAddress, orgetTransactioncalls that compete with other tenants. - You rely on WebSocket subscriptions (
accountSubscribe,logsSubscribe,slotSubscribe) and need stable connection counts. - You need archive-depth history, trace-style debugging, or predictable throughput for a trading bot or indexer.
- You want isolation from noisy-neighbour traffic so one heavy caller cannot affect your latency.
A common pattern is hybrid: shared endpoints for read-only dashboards and fallbacks, dedicated capacity for the latency-sensitive path. OnFinality offers both RPC API access and dedicated nodes, so you can start shared and graduate to dedicated without changing your application code.
What "shared" and "dedicated" actually mean on Solana
On Solana, an RPC node is not just a proxy in front of a database. It maintains a view of the ledger, serves account and transaction queries, and can forward transactions to the validator network. How that node is allocated is what separates the two models.
Shared node access means your requests land on a pool of nodes used by many customers. The provider balances load, applies global or per-key rate limits, and may cache or route requests. You get a public or API-key endpoint such as:
curl https://solana.api.onfinality.io/public \
-X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"getSlot","params":[]}'
Dedicated node access means a node (or a small cluster) is reserved for your workload. You still connect over HTTP or WebSocket, but capacity, rate limits, and often the node version and configuration are yours to control. Dedicated access is usually paired with a private endpoint and, depending on the provider, a dedicated WebSocket URL.
Neither model changes the JSON-RPC interface. That is deliberate: you should be able to switch by changing a URL, not by rewriting your client.
Where shared access breaks down
Shared endpoints are not "bad" — they are a fit for a specific workload shape. They start to hurt when your request profile is expensive or bursty.
| Symptom | What is usually happening | What to do next |
|---|---|---|
| 429 responses during peak hours | Global or per-key rate limit shared with other tenants | Add backoff, then evaluate dedicated capacity |
| WebSocket disconnects under load | Connection limits on a shared pool | Move subscriptions to a dedicated endpoint |
Slow getProgramAccounts scans | Heavy scans compete for node CPU and memory | Use filtered queries, or run scans on dedicated nodes |
| Inconsistent latency at market open | Noisy-neighbour traffic on shared nodes | Isolate the trading path on dedicated nodes |
| Missing old transactions | Node is not archive-enabled or is pruned | Request archive access or a dedicated archive node |
If two or more of these apply to your production path, shared access is likely costing you more in retries and failed user actions than dedicated capacity would cost directly.
Solana-specific constraints that change the decision
Solana's account model and high slot rate make some RPC patterns more expensive than on EVM chains. These are the ones that most often force a move to dedicated nodes.
- Account scans are heavy.
getProgramAccountson a large program can return huge result sets. Filters (dataSlice,memcmp,dataSize) reduce load, but the query still consumes node resources. - WebSocket subscriptions are stateful. Each subscription holds server-side state. Shared pools cap concurrent subscriptions; dedicated nodes let you size that limit to your app.
- Slot and block history grow fast. Deep history queries may require an archive node rather than a standard node.
- Transaction forwarding matters. For trading and payments, the path from your RPC to the validator network affects confirmation behaviour. Dedicated nodes give you a more predictable path.
Decision guide: matching workload to access model
Use this table to map your workload to the right model before you talk to any provider.
| Workload | Shared is usually fine | Dedicated is usually better | Notes |
|---|---|---|---|
| Wallet balance and token reads | Yes | Optional | Low volume, cacheable |
| NFT mint or claim page | Yes, with retries | For launch spikes | Bursts are short but sharp |
| Trading bot / market maker | No | Yes | Latency and WebSocket stability matter |
| Indexer or analytics pipeline | No | Yes | High read volume, archive depth |
| dApp with user-facing RPC | Yes | Hybrid | Dedicated primary, shared fallback |
| Devnet / testnet work | Yes | Rarely | Use Solana Devnet |
A useful rule: if a failed RPC call causes a user-visible error or a missed trade, that call belongs on dedicated capacity.
How to evaluate a Solana RPC provider
Once you know which model you need, compare providers on the things that actually affect production.
- Transport support. Confirm HTTP and WebSocket availability. OnFinality's Solana network page lists the supported transports and endpoints.
- Rate limits and burst behaviour. Ask how limits are enforced and whether dedicated plans remove shared-pool contention.
- Archive and history depth. If you query old transactions, confirm archive support rather than assuming it.
- Method coverage. Check that the methods you depend on — including subscription methods — are supported on the plan you are buying.
- Failover options. Ask whether you can add a second endpoint or region for redundancy.
- Observability. Look for request metrics, error rates, and logs you can use in your own monitoring.
- Pricing model. Compare request-based and capacity-based pricing against your real traffic. See RPC pricing for how OnFinality structures plans.
If you are comparing providers more broadly, the RPC provider selection guide covers the general criteria; this article focuses on the Solana access-model decision.
Configuring your client for either model
Because both models speak JSON-RPC, switching is a configuration change. Keep the endpoint in an environment variable so you can move between shared and dedicated without a code deploy.
// Solana Web3.js example: swap the endpoint via env var
import { Connection } from "@solana/web3.js";
const endpoint = process.env.SOLANA_RPC_URL; // shared or dedicated URL
const wsEndpoint = process.env.SOLANA_WS_URL; // dedicated WebSocket URL
const connection = new Connection(endpoint, {
commitment: "confirmed",
wsEndpoint,
});
const slot = await connection.getSlot();
console.log("current slot", slot);
For WebSocket subscriptions, point wsEndpoint at a dedicated WebSocket URL when you move off shared access, and add reconnect logic with exponential backoff. Subscriptions do not survive a dropped socket, so re-subscribe on reconnect.
// Re-subscribe pattern for account changes
function subscribeToAccount(connection, publicKey) {
let subId;
const start = () => {
subId = connection.onAccountChange(publicKey, (info) => {
console.log("account changed", info.lamports);
}, "confirmed");
};
start();
connection._rpcWebSocket.on("close", () => {
setTimeout(start, 1000);
});
}
Migration checkpoints
Moving from shared to dedicated access is mostly operational, not architectural. Work through these checkpoints in order.
- Baseline your traffic. Log request counts, method mix, error rates, and peak concurrency for at least a week.
- Identify the critical path. Separate latency-sensitive calls from background reads.
- Provision dedicated capacity. Start with the critical path only; leave the rest on shared endpoints.
- Dual-run. Send a percentage of traffic to the dedicated endpoint and compare error rates and latency.
- Add failover. Configure a secondary endpoint and test it by failing the primary deliberately.
- Cut over. Move the critical path fully, keep shared as fallback, and monitor for a full traffic cycle.
- Review limits. Re-check rate limits and subscription caps against your new baseline.
Keep the shared endpoint in your config even after cutover. It is a cheap fallback and useful for non-critical jobs.
Common pitfalls
- Assuming shared endpoints have no limits. They do, and the limits are shared with other tenants.
- Treating WebSocket as fire-and-forget. Subscriptions need reconnect and re-subscribe logic regardless of model.
- Running heavy scans on the user-facing endpoint. Move
getProgramAccountsscans to a separate endpoint or a batch job. - Skipping archive checks. Confirm history depth before you build a feature that depends on old transactions.
- Forgetting devnet. Test configuration changes on Solana Devnet before touching mainnet.
Key Takeaways
- Shared Solana RPC is a good fit for low-volume reads, prototypes, and fallback paths.
- Dedicated node access is the right choice when latency, WebSocket stability, archive depth, or burst capacity affect user-visible outcomes.
- The JSON-RPC interface is the same in both models, so migration is mostly configuration and operations.
- Solana-specific patterns — account scans, stateful subscriptions, fast-growing history — are the main drivers of the decision.
- A hybrid setup with dedicated primary and shared fallback is a practical default for production apps.
- OnFinality provides both RPC API access and dedicated nodes, with Solana endpoints listed on the Solana network page.
Frequently Asked Questions
Is dedicated node access always faster than shared? Not automatically. Dedicated access removes contention from other tenants, which usually makes latency more consistent, but your own query patterns still determine performance. Measure both before and after migration.
Can I use the same code with shared and dedicated endpoints? Yes. Both use standard Solana JSON-RPC over HTTP, and WebSocket subscriptions use the same methods. Keep endpoints in environment variables so you can switch without code changes.
Do I need a dedicated node for WebSocket subscriptions? Not always, but shared pools often cap concurrent subscriptions. If your app holds many long-lived subscriptions, dedicated access gives you predictable capacity.
What about archive data? Archive depth depends on the node configuration, not the access model. Confirm archive support with your provider before building features that query old transactions.
Where can I see which Solana endpoints OnFinality supports? The Solana network page lists supported transports and endpoints, and RPC pricing covers plan options. You can also browse supported RPC networks for other chains.