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

إدارة الاتصال

  • إعادة الاتصال التلقائي: توقع مشاكل الشبكة؛ أعد الاتصال مع تراجع أسي (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?;
}
  • استرداد الفجوات: استخدم from_slot بعد إعادة الاتصال لتجنب فقدان البيانات (التكرارات مقبولة).
rust
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 logic
  • استخدم قنوات محدودة السعة: اختر السعة بناءً على سرعة المعالجة ومدى تحمل فقدان البيانات (الأصغر = ذاكرة أقل وحالات إسقاط أكثر؛ الأكبر = ذاكرة أكثر وحالات إسقاط أقل).

الأداء والمرونة

  • راقب زمن استجابة المعالجة وسجّل عند تجاوز العتبات.
  • جمّع عمليات الكتابة في قاعدة البيانات؛ نفّذ flush عند بلوغ حجم الدفعة أو الفاصل الزمني.
  • استخدم الإدخال/الإخراج غير المتزامن للنداءات الخارجية؛ انقل الحسابات الثقيلة إلى مهام/خيوط عاملة.
  • أعد استخدام طلبات الاشتراك لتقليل التخصيصات.

معالجة الأخطاء

  • ميّز بين أنواع الأخطاء (التدفق مقابل المعالجة مقابل القناة).
  • تراجع أسي عند إعادة الاتصال (ابدأ صغيرًا، وضع حدًا أقصى معقولًا).
  • سجّل/قِس التحديثات المسقطة لتتبع حالات المستهلك البطيء.

إدارة البيانات

  • تعامل مع التكرارات عند استخدام from_slot (ذاكرة تخزين مؤقت محدودة زمنيًا أو قيود قاعدة البيانات).
  • اختر مستوى الالتزام (commitment) حسب حالة الاستخدام:
    • processed: الأسرع للوحات المعلومات، وقد يتم التراجع عنه
    • confirmed: افتراضي جيد لمعظم التطبيقات/المفهرسات
    • finalized: عندما تكون اليقينية المطلقة مطلوبة

الاشتراكات الديناميكية

استخدم التدفق ثنائي الاتجاه لتحديث الاشتراكات أثناء التشغيل (تبديل المرشحات دون انقطاع، توسيع التغطية) دون إعادة الاتصال.

قائمة تحقق الإنتاج

  • ✅ إعادة اتصال تلقائية مع تراجع أسي
  • ✅ استرداد الفجوات باستخدام from_slot
  • ✅ معالجة ping/pong (تجنب انقطاعات 30s)
  • ✅ فصل الاستقبال عن المعالجة بقنوات محدودة السعة/ضغط عكسي
  • ✅ تسجيل الأخطاء والمقاييس/التنبيه
  • ✅ تتبع زمن استجابة المعالجة
  • ✅ معالجة التكرارات وتحسين المرشحات
  • ✅ الكتابات المجمعة (إن كنت تحفظ البيانات)
  • ✅ الإغلاق السلس وفحوصات الصحة

موارد إضافية