Geyser gRPC - أفضل الممارسات
يغطي هذا الدليل الأنماط الأساسية لبناء تطبيقات قوية وجاهزة للإنتاج باستخدام Geyser gRPC. يدعم Solana Stream SDK بروتوكول Geyser gRPC.
البدء
- ابدأ ببساطة: ابدأ باشتراكات الخانات للتعرف على البث قبل إضافة مرشحات معقدة.
- استخدم المرشحات بحكمة: اشترك فقط في ما تحتاجه لتقليل النطاق الترددي/CPU. تمثل معاملات التصويت ~70% من حركة المرور — احذفها إذا لم تكن بحاجة إليها.
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()
}إدارة الاتصال
- إعادة الاتصال التلقائي: توقع مشاكل الشبكة؛ أعد الاتصال مع تراجع أسي (exponential backoff).
- معالجة ping/pong: ترسل خوادم Yellowstone gRPC إشارات ping. رد دائمًا بـ pong وإلا يمكن للخادم إغلاق الاتصال (سبب شائع لانقطاعات ~30s).
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?;
}- استرداد الفجوات: استخدم
from_slotبعد إعادة الاتصال لتجنب فقدان البيانات (التكرارات مقبولة).
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
};أنماط البنية
- افصل الاستقبال (ingress) عن المعالجة باستخدام القنوات لفصل عمليات الإدخال/الإخراج الشبكية عن منطق الأعمال وإضافة ضغط عكسي (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- استخدم قنوات محدودة السعة: اختر السعة بناءً على سرعة المعالجة ومدى تحمل فقدان البيانات (الأصغر = ذاكرة أقل وحالات إسقاط أكثر؛ الأكبر = ذاكرة أكثر وحالات إسقاط أقل).
الأداء والمرونة
- راقب زمن استجابة المعالجة وسجّل عند تجاوز العتبات.
- جمّع عمليات الكتابة في قاعدة البيانات؛ نفّذ flush عند بلوغ حجم الدفعة أو الفاصل الزمني.
- استخدم الإدخال/الإخراج غير المتزامن للنداءات الخارجية؛ انقل الحسابات الثقيلة إلى مهام/خيوط عاملة.
- أعد استخدام طلبات الاشتراك لتقليل التخصيصات.
معالجة الأخطاء
- ميّز بين أنواع الأخطاء (التدفق مقابل المعالجة مقابل القناة).
- تراجع أسي عند إعادة الاتصال (ابدأ صغيرًا، وضع حدًا أقصى معقولًا).
- سجّل/قِس التحديثات المسقطة لتتبع حالات المستهلك البطيء.
إدارة البيانات
- تعامل مع التكرارات عند استخدام
from_slot(ذاكرة تخزين مؤقت محدودة زمنيًا أو قيود قاعدة البيانات). - اختر مستوى الالتزام (commitment) حسب حالة الاستخدام:
- processed: الأسرع للوحات المعلومات، وقد يتم التراجع عنه
- confirmed: افتراضي جيد لمعظم التطبيقات/المفهرسات
- finalized: عندما تكون اليقينية المطلقة مطلوبة
الاشتراكات الديناميكية
استخدم التدفق ثنائي الاتجاه لتحديث الاشتراكات أثناء التشغيل (تبديل المرشحات دون انقطاع، توسيع التغطية) دون إعادة الاتصال.
قائمة تحقق الإنتاج
- ✅ إعادة اتصال تلقائية مع تراجع أسي
- ✅ استرداد الفجوات باستخدام
from_slot - ✅ معالجة ping/pong (تجنب انقطاعات 30s)
- ✅ فصل الاستقبال عن المعالجة بقنوات محدودة السعة/ضغط عكسي
- ✅ تسجيل الأخطاء والمقاييس/التنبيه
- ✅ تتبع زمن استجابة المعالجة
- ✅ معالجة التكرارات وتحسين المرشحات
- ✅ الكتابات المجمعة (إن كنت تحفظ البيانات)
- ✅ الإغلاق السلس وفحوصات الصحة
موارد إضافية
- Solana Stream SDK (يدعم Geyser gRPC): https://github.com/ValidatorsDAO/solana-stream






