Geyser gRPC - Best Practices

Deze handleiding behandelt essentiele patronen voor het bouwen van robuuste, productieklare applicaties met Geyser gRPC. Solana Stream SDK ondersteunt Geyser gRPC.

Aan de slag

  • Begin eenvoudig: start met slot-abonnementen om vertrouwd te raken met streaming voordat u complexe filters toevoegt.
  • Gebruik filters verstandig: abonneer alleen op wat u nodig heeft om bandbreedte/CPU te verminderen. Vote-transacties vormen ~70% van het verkeer — laat ze vallen als u ze niet nodig heeft.
rust
SubscribeRequestFilterTransactions {
    vote: Some(false),   // Exclude ~70% vote txs
    failed: Some(false), // Exclude failed txs
    ..Default::default()
}

Verbindingsbeheer

  • Automatische herverbinding: verwacht netwerkproblemen; herverbind met exponential backoff.
  • Ping/pong-afhandeling: Yellowstone gRPC-servers sturen een ping. Reageer altijd met pong, anders kan de server de verbinding sluiten (veelvoorkomende oorzaak van ~30s disconnects).
rust
if matches!(update.update_oneof, Some(UpdateOneof::Ping(_))) {
    subscribe_tx.send(SubscribeRequest {
        ping: Some(SubscribeRequestPing { id: 1 }),
        ..Default::default()
    }).await?;
}
  • Gap recovery: gebruik from_slot na herverbinding om gegevensverlies te voorkomen (duplicaten zijn acceptabel).
rust
subscribe_request.from_slot = if tracked_slot > 0 {
    Some(tracked_slot) // Optionally subtract a small buffer to dodge reorgs
} else {
    None
};

Architectuurpatronen

  • Scheid inkomend verkeer en verwerking met channels om netwerk-IO los te koppelen van bedrijfslogica en backpressure toe te voegen.
rust
let (tx, rx) = mpsc::channel::<SubscribeUpdate>(10_000);
// ingress task reads stream and tx.send(...)
// processing task consumes rx and does business logic
  • Gebruik bounded channels: kies capaciteit op basis van verwerkingssnelheid en tolerantie voor gegevensverlies (kleiner = minder geheugen, meer drops; groter = meer geheugen, minder drops).

Prestaties en veerkracht

  • Monitor verwerkingslatentie en log wanneer drempelwaarden worden overschreden.
  • Batch DB-schrijfacties; flush op batchgrootte of interval.
  • Gebruik async IO voor externe aanroepen; verplaats zware berekeningen naar worker-taken/threads.
  • Hergebruik subscription requests om allocaties te verminderen.

Foutafhandeling

  • Onderscheid fouttypen (stream vs verwerking vs channel).
  • Exponential backoff bij herverbinding (begin klein, begrens op een redelijk maximum).
  • Log/meet gedropte updates om slow-consumer-condities te volgen.

Gegevensbeheer

  • Behandel duplicaten bij gebruik van from_slot (tijdgebonden cache of DB-constraints).
  • Kies commitment per use case:
    • processed: snelste dashboards, kan worden teruggedraaid
    • confirmed: goede standaard voor de meeste apps/indexers
    • finalized: wanneer absolute zekerheid vereist is

Dynamische abonnementen

Gebruik de bidirectionele stream om abonnementen tijdens runtime bij te werken (hot-swap filters, dekking uitbreiden) zonder opnieuw te verbinden.

Productiechecklist

  • ✅ Automatische herverbinding met exponential backoff
  • ✅ Gap recovery met from_slot
  • ✅ Ping/pong-afhandeling (voorkom 30s disconnects)
  • ✅ Gescheiden inkomend verkeer en verwerking met bounded channels/backpressure
  • ✅ Foutlogging en metrics/alerting
  • ✅ Verwerkingslatentie-tracking
  • ✅ Duplicaatafhandeling en filteroptimalisatie
  • ✅ Batch writes (bij persistentie)
  • ✅ Graceful shutdown en health checks

Aanvullende bronnen