Logo
New RPC users get 35% off their first monthView the offer
RPC Assistant

Dedicated vs shared node access for Solana RPC services: which should your app use?

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, or getTransaction calls 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.

SymptomWhat is usually happeningWhat to do next
429 responses during peak hoursGlobal or per-key rate limit shared with other tenantsAdd backoff, then evaluate dedicated capacity
WebSocket disconnects under loadConnection limits on a shared poolMove subscriptions to a dedicated endpoint
Slow getProgramAccounts scansHeavy scans compete for node CPU and memoryUse filtered queries, or run scans on dedicated nodes
Inconsistent latency at market openNoisy-neighbour traffic on shared nodesIsolate the trading path on dedicated nodes
Missing old transactionsNode is not archive-enabled or is prunedRequest 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. getProgramAccounts on 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.

WorkloadShared is usually fineDedicated is usually betterNotes
Wallet balance and token readsYesOptionalLow volume, cacheable
NFT mint or claim pageYes, with retriesFor launch spikesBursts are short but sharp
Trading bot / market makerNoYesLatency and WebSocket stability matter
Indexer or analytics pipelineNoYesHigh read volume, archive depth
dApp with user-facing RPCYesHybridDedicated primary, shared fallback
Devnet / testnet workYesRarelyUse 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.

  1. Transport support. Confirm HTTP and WebSocket availability. OnFinality's Solana network page lists the supported transports and endpoints.
  2. Rate limits and burst behaviour. Ask how limits are enforced and whether dedicated plans remove shared-pool contention.
  3. Archive and history depth. If you query old transactions, confirm archive support rather than assuming it.
  4. Method coverage. Check that the methods you depend on — including subscription methods — are supported on the plan you are buying.
  5. Failover options. Ask whether you can add a second endpoint or region for redundancy.
  6. Observability. Look for request metrics, error rates, and logs you can use in your own monitoring.
  7. 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.

  1. Baseline your traffic. Log request counts, method mix, error rates, and peak concurrency for at least a week.
  2. Identify the critical path. Separate latency-sensitive calls from background reads.
  3. Provision dedicated capacity. Start with the critical path only; leave the rest on shared endpoints.
  4. Dual-run. Send a percentage of traffic to the dedicated endpoint and compare error rates and latency.
  5. Add failover. Configure a secondary endpoint and test it by failing the primary deliberately.
  6. Cut over. Move the critical path fully, keep shared as fallback, and monitor for a full traffic cycle.
  7. 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 getProgramAccounts scans 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.

RPC Knowledge Base

Related RPC details

Never Worry about Infrastructure Again

OnFinality takes away the heavy lifting of DevOps so you can build smarter and faster.

Get Started