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