Geyser gRPC - Best Praktek

Panduan ini mencakup pola penting untuk membangun kuat, produksi - aplikasi siap dengan Geyser gRPC. Solana Dukungan Stream SDK Geyser gRPC.

Memulai

  • Mulai sederhana: dimulai dengan langganan slot untuk familiar dengan streaming sebelum menambahkan penyaring kompleks.
  • Gunakan penyaring dengan bijak: langganan hanya untuk apa yang Anda butuhkan untuk mengurangi bandwidth /CPUVote transaksi adalah ~ 70% lalu lintas - drop mereka jika Anda tidak membutuhkannya.
rust
SubscribeRequestFilterTransactions {
    vote: Some(false),   // Exclude ~70% vote txs
    failed: Some(false), // Exclude failed txs
    ..Default::default()
}

Manajemen koneksi

  • Otomatis menyambung kembali: mengharapkan isu jaringan; berhubungan kembali dengan latar belakang eksponensial.
  • Penanganan Ping / pong: Yellowstone gRPC server mengirim ping. Selalu merespon dengan pong atau server dapat menutup sambungan (penyebab umum dari ~ 30s terputus).
rust
if matches!(update.update_oneof, Some(UpdateOneof::Ping(_))) {
    subscribe_tx.send(SubscribeRequest {
        ping: Some(SubscribeRequestPing { id: 1 }),
        ..Default::default()
    }).await?;
}
  • Pemulihan Gap: gunakan from_slot setelah menghubungkan kembali untuk menghindari kehilangan data (duplikasi diterima).
rust
subscribe_request.from_slot = if tracked_slot > 0 {
    Some(tracked_slot) // Optionally subtract a small buffer to dodge reorgs
} else {
    None
};

Pola arsitektur

  • Memisahkan masuk dan memproses dengan saluran untuk memisahkan jaringan IO dari logika bisnis dan menambahkan tekanan balik.
rust
let (tx, rx) = mpsc::channel::<SubscribeUpdate>(10_000);
// ingress task reads stream and tx.send(...)
// processing task consumes rx and does business logic
  • Gunakan saluran yang terbatas: pilih kapasitas berdasarkan proses kecepatan dan toleransi data-kehilangan (lebih kecil = kurang memori, lebih banyak tetes; lebih besar = lebih banyak memori, lebih sedikit tetes).

Performance and suribility

  • Monitor pemrosesan latensi dan log ketika batas-batas dilampaui.
  • Batch DB menulis; flush pada ukuran batch atau interval.
  • Gunakan async IO untuk panggilan eksternal; offload kompute berat ke tugas-tugas kerja / benang.
  • Gunakan permintaan berlangganan untuk mengurangi alokasi.

Kendali galat

  • Tipe kesalahan distinguble (stream vs processing vs channel).
  • Penguncian eksponensial saat menyambung (mulai kecil, tutup pada maksimal yang wajar).
  • Log / metrik menjatuhkan pemutakhiran untuk melacak kondisi lambat-konsumen.

Manajemen data

  • Menangani duplikat ketika menggunakan from_slot (waktu-bunded cache atau batasan DB).
  • Pilih komitmen per kasus:
    • diproses: dasbor tercepat, mungkin menggulung kembali
    • dikonfirmasi: baku baik untuk kebanyakan aplikasi / indexers
    • finalized: ketika kepastian mutlak dibutuhkan

Subscriptions dinamis

Gunakan arus bidirectional untuk memperbarui langganan pada waktu-jalan (filter hot- swap, memperluas cakupan) tanpa menghubungkan kembali.

Daftar cek produksi

  • Koneksi otomatis dengan latar belakang eksponensial
  • Pembenahan Gap menggunakan from_slot
  • Penanganan PLING / pong (hindari 30-an tidak terhubung)
  • Dipisahkan ingress dan diproses dengan saluran yang terikat / tekanan belakang
  • Kesalahan saat log dan metrik / peringatan
  • Pelacakan latensi Processing
  • Gandakan penanganan dan optimasi filter
  • Ikhlas menulis (jika tetap bertahan)
  • Penutupan dan pemeriksaan kesehatan yang sangat baik

Sumber daya tambahan