Geyser gRPC - Buenas Prácticas
Esta guía cubre patrones esenciales para la construcción de aplicaciones robustas y de producción con Geyser gRPC. Solana Stream SDK admite Geyser gRPC.
Comienzo
- Comience simple: comience con las suscripciones de slot para familiarizarse con el streaming antes de añadir filtros complejos.
- Use filtros sabiamente: suscríbase sólo a lo que necesita para reducir ancho de banda/CPU. Las transacciones de voto son ~70% de tráfico - gotearlas si no las necesita.
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()
}Gestión de conexiones
- Reconexión automática: esperar problemas de red; reconectarse con retroceso exponencial.
- Ping/pong manipulación: Los servidores de gRPC de Yellowstone envían ping. Siempre responde con pong o el servidor puede cerrar la conexión (causa común de ~30s desconecta).
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?;
}- Recuperación de gap: uso
from_slotdespués de reconectarse para evitar la pérdida de datos (los duplicados son aceptables).
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
};Patrones de arquitectura
- Separe la entrada y el procesamiento con canales para desacoplar la E/S de red de la lógica empresarial y añadir backpressure.
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- Utilizar canales atados: elegir la capacidad basada en la velocidad de tratamiento y la tolerancia de pérdida de datos (smaller = menos memoria, más gotas; mayor = más memoria, menos gotas).
Rendimiento y resiliencia
- Monitoreo de latencia y registro cuando los umbrales se exceden.
- Batch DB escribe; deslizar sobre el tamaño o intervalo de lote.
- Usar IO asinc para llamadas externas; descargar carga pesada para tareas de trabajo/threads.
- Reutilizar las solicitudes de suscripción para reducir las asignaciones.
Manejo de errores
- Tipos de error distinguidos (stream vs procesador vs canal).
- Atraso exponencial en la reconexión (inicio pequeño, tapa a un máx razonable).
- Log/metric dejó las actualizaciones para rastrear las condiciones de consumo lento.
Gestión de datos
- Manija duplicados al usar
from_slot(con limitaciones de caché a tiempo o DB). - Elija compromiso por caso de uso:
- procesado: más rápidos dashboards, puede volver a rodar
- confirmado: buen predeterminado para la mayoría de las aplicaciones/indexers
- finalizado: cuando se requiere certeza absoluta
Suscripciones dinámicas
Utilice el flujo bidireccional para actualizar las suscripciones en tiempo de ejecución (filtros de intercambio caliente, ampliar la cobertura) sin volver a conectar.
Lista de verificación de la producción
- ✅ Auto reconexión con retroceso exponencial
- ✅ recuperación de gap utilizando
from_slot - Entendido Ping/pong manejo (evitar 30s desconecta)
- ✅ Ingreso separado y tratamiento con canales enmarcados/backpressure
- ✅ Registro de errores y métricas/alerting
- ✅ Procesamiento de seguimiento de latencia
- ✅ Manejo duplicado y optimización de filtros
- ✅ Batch escribe (si persiste)
- Escucho el cierre y cheques de salud gratos
Recursos adicionales
- Solana Stream SDK (Geyser gRPC support): https://github.com/ValidatorsDAO/solana-stream