Geyser gRPC En İyi Uygulamalar
Bu kılavuz sağlam, üretim hazır uygulamaları ile ilgili temel kalıpları kapsar Geyser gRPC. Solana Stream SDK destek destekliyor Geyser gRPC.
Başlanmaya başladı
- Basit başlayın: karmaşık filtreler eklemeden önce akışla tanıdık almak için slot abonelikleri ile başlayın.
- Filtreleri akıllıca kullanın: yalnızca bant genişliğini azaltmak için ihtiyacınız olan şeye abone olun /CPUOy işlemleri - trafik% 70'i - onlara ihtiyacınız olup olmadığını unutmayın.
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()
}Bağlantı yönetimi
- Otomatik yeniden bağlantı: ağ sorunları bekleyin; üstel arka ile yeniden bağlantı kurun.
- Ping/pong kullanımı: Yellowstone gRPC sunucular ping gönderir. Her zaman pong veya sunucu ile yanıt verir (~30s bağlantılarının nedeni).
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: kullanımı
from_slotVeri kaybından kaçınmak için yeniden bağlantı kurmak (uygunlar kabul edilebilir).
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
};Mimari modeller
- Ayrı ingress ve işlem kanallarla iş mantığından çift ağ IO'yu silme ve geri baskı ekleyebilme.
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- Bağlanmış kanallar kullanın: işlem hızı ve veri kaybına dayanan kapasite seçin (daha az bellek, daha fazla damla; daha fazla bellek, daha az damla).
Performans ve resiliency
- Eşlerin aşıldığı zaman geç saatler ve log işleme.
- Batch DB yazıyor; toplu boyutta veya aralığın üzerine dökün.
- Dış çağrılar için birsync IO kullanın; işçi görevleri / hazırlıkları için ağır hesaplamayı bırakın.
- Payları azaltmak için yeniden kullanım abonelik talepleri.
Hata işleme
- Hata türlerini (sabah vs kanalı) bozmak.
- Exponential backoff yeniden bağlantıda (küçük, makul bir maxda kap)
- Log/metric yavaş-konsumer koşullarını takip etmek için güncellemelerini bıraktı.
Data management Data management
- Kullandığında tekrarları
from_slot(Zamana bağlı önbellek veya DB kısıtlamaları). - Kullanım durumunda taahhüt alın:
- İşlendi: En hızlı panjurlar geri dönebilir
- Doğrulandı: çoğu uygulama /indexers için iyi varsayılan
- Sonlandırılmış: mutlak kesinlik gerektiğinde
Dinamik abonelikler
Takip eden abonelikleri güncellemek için iki yönlü akış kullanın (hot-swap filtreleri, geniş kapsama) yeniden bağlantı kurmadan.
Prodüksiyon checklist
- Auto yeniden bağlantıya üst üste geri dönüş ile bağlantı
- Gap kurtarma using using
from_slot - Ping/pong kullanımı (30'lardan kaçının)
- Ayrı ingress ve sınırlı kanallar / geri baskı ile işleme
- Hata Girişi ve metrik /
- ✅ İşleme geçncy takip
- Duplicate handle and filter optimizasyon
- Batch yazıyor (eğer devam ederse)
- Grace Graceful kapatılması ve sağlık kontrolleri
Ek kaynaklar
- Solana Stream SDK (İngilizce)Geyser gRPC Destek): https://github.com/ValidatorsDAO/solana-stream