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()
}

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?;
}
  • Recuperación de gap: uso from_slot despué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
};

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 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