Geyser · Solana Streaming
Resilience & keepalive
Keepalive & idle detection
The nastiest failure is the silent one. A half-open stream — where your side still believes the socket is up but no bytes are arriving — delivers no data and fires no error event. You sit there waiting forever.
Defend on two layers. At the transport, turn on gRPC/HTTP2 keepalive so the channel probes the connection and surfaces a dead socket. At the application, run an idle-timeout watchdog: record the timestamp of every update and reconnect if nothing has arrived within your window. Pair the watchdog with a low-volume subscription — a slots or blocksMeta feed makes a cheap, steady heartbeat even when your real filters are quiet.
The proxy also exposes an app-level Ping you can write into the request channel; the server answers with a Pong. It is a request-channel heartbeat for streams that are otherwise silent.
Reconnect & gap recovery
A reconnect gives you a fresh live stream — it does not replay what you missed while you were gone. Closing that gap is on you, and the right tool depends on whether you hold an API key.
With a key, persist the last slot you fully processed and set fromSlot on the next request to replay from there. Before you trust that slot, call SubscribeReplayInfo to learn the earliest slot still available — if your gap predates the replay window, replay can't reach it.
Without a key — or when the gap is older than the replay window — fromSlot isn't available. Fall back to tracking the last processed slot and backfilling the gap with getSignaturesForAddress on standard JSON-RPC, then resume the live stream from the head.
Backpressure
gRPC has flow control. If your consumer reads slower than the server pushes, the window fills and the stream stalls — and a stalled stream looks a lot like an idle one. Keep the read loop thin: pull updates off the wire and hand them to a queue or worker, do the heavy work elsewhere. Watch your lag by comparing the slot on the last update you processed against the chain head from a cheap slots feed. A lag that only grows means your consumer can't keep up, not that the network is slow.
Error handling
Handle gRPC status codes on the stream and retry transient ones with backoff. The first error many people hit is a permission one: keyless public requests may not set the commitment or fromSlot filters. Set either without a key and the proxy returns gRPC PermissionDenied:
Commitment filter is not supported for public requests. Consider registering and creating an API key.The fix is an API key: it unlocks commitment selection and fromSlot replay in one move. Until then, drop those two filters and the stream runs at the default commitment, live-only.
Limits
Connection counts, packs, the trial, and crypto activation are all spelled out on the Geyser product page. This page covers the operational side — how to keep one connection healthy.