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()
}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?;
}if matches!(update.update_oneof, Some(UpdateOneof::Ping(_))) {
subscribe_tx.send(SubscribeRequest {
ping: Some(SubscribeRequestPing { id: 1 }),
..Default::default()
}).await?;
}- Gap recovery: gebruik
from_slotna 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
};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 logiclet (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
- Solana Stream SDK (Geyser gRPC-ondersteuning): https://github.com/ValidatorsDAO/solana-stream