Geyser gRPC - أفضل الممارسات

يغطي هذا الدليل الأنماط الأساسية لبناء تطبيقات قوية وجاهزة للإنتاج باستخدام Geyser gRPC. يدعم Solana Stream SDK بروتوكول Geyser gRPC.

البدء

  • ابدأ ببساطة: ابدأ باشتراكات الخانات للتعرف على البث قبل إضافة مرشحات معقدة.
  • استخدم المرشحات بحكمة: اشترك فقط في ما تحتاجه لتقليل النطاق الترددي/CPU.
rust
SubscribeRequestFilterTransactions {
    vote: Some(false),   // Exclude 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 عند بلوغ حجم الدفعة أو الفاصل الزمني.
  • استخدم الإدخال/الإخراج غير المتزامن للنداءات الخارجية؛ انقل الحسابات الثقيلة إلى مهام/خيوط عاملة.
  • أعد استخدام طلبات الاشتراك لتقليل التخصيصات.

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

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

أصلح قبل إعادة المحاولة واستخدم تراجعًا يراعي الإيقاف المؤقت

احتفظ بخطأ gRPC الأول قبل أن تستبدله حلقة إعادة الاتصال. سجّل حالته ورسالته، مع أي بيانات وصفية متاحة هي x-erpc-error-code وx-erpc-error-reason وx-erpc-doc-url وx-erpc-retry-after-seconds وx-erpc-retry-at. قد يبدو إغلاق الاتصال المبكر كخطأ نقل عام، ولذلك قد لا يتضمن كل الـ trailers.
أصلح طلبًا غير صالح أو شكل فلتر مرفوض أو اختلافًا في تسجيل IP قبل إعادة المحاولة. عند إيقاف ERPC المؤقت، انتظر الموعد المعاد؛ فهو أدق من تراجع محلي. استخدم تراجعًا أسيًا محدودًا عند أخطاء التوافر والاستجابات الأخرى القابلة لإعادة المحاولة. لا تكرر طلبًا غير متغير لمجرد أنه أعاد حالة غير صفرية.

استخدام الموارد وقدرة المعالجة

تمنع وسائل حماية Shared حمولة واحدة من استهلاك سعة التسليم التي يحتاج إليها عملاء ERPC الآخرون. قد يصبح التدفق بطيئًا بسبب عرض النطاق الفعلي أو CPU أو الذاكرة أو قائمة انتظار المستهلك أو عمليات كتابة قاعدة البيانات أو النداءات الخارجية. يجب أن تناسب الموارد الحمل؛ فالمستقبِل البطيء لا يحدد وحده موضع القيد.
قِس أعلى معدل بيانات عند المستهلك. حوّل MB/s إلى Mbps باستخدام MB/s × 8 واترك هامشًا فوق الذروة المقاسة. لا يوجد حد أدنى ثابت من دون قياس. اجعل عمل الاستقبال قصيرًا، وسلّم التحديثات إلى قائمة انتظار محدودة، ووسّع أو قلّل الاشتراك إن لم تستطع المعالجة المواكبة. تحد القائمة المحدودة من الذاكرة، لكنها لا تحل مشكلة مستهلك بطيء باستمرار.

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

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

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

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

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

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

موارد إضافية