تخزين MCP Server مؤقتًا: ما تعلمته بعد 87 انقطاعًا للخدمة
كنت أعتقد أن MCP server الخاص بي لا يحتاج إلى التخزين المؤقت (caching).
كانت قاعدة المعرفة الخاصة بي تحتوي على بضعة آلاف من المدخلات فقط. كانت الاستعلامات سريعة. لكنني كنت مخطئًا.
بعد 87 انقطاعًا في بيئة الإنتاج وثلاثة أيام من تصحيح أخطاء مهلات الانتظار (timeouts)، تعلمت درسًا قاسيًا. كل MCP server يحتاج إلى التخزين المؤقت، حتى الصغير منها.
إليكم ما حدث.
كان الخادم يستخدم البحث الدلالي (semantic search) للعثور على الملاحظات. في معظم الأوقات، كان الأمر يعمل بشكل جيد. ولكن بعد ذلك، بدأت الأمور تتعطل.
- انقطعت الاتصالات في منتصف الطلب.
- انتهت مهلة Claude Desktop بعد 60 ثانية.
- أعاد Nginx خطأ 504 Gateway Timeouts.
الجزء الأسوأ؟ كان ذلك يحدث فقط عند تكرار الاستعلامات.
عندما يطرح المستخدم نفس السؤال مرتين، قد يظل الاتصال في حالة خمول بينما يفكر الذكاء الاصطناعي. عندها يقوم البروكسي (proxy) بقطع الاتصال. يقوم Claude بإعادة محاولة الطلب تلقائيًا. والآن، أصبح لديك بحثان متطابقان يعملان في وقت واحد.
عندما تحدث محاولات إعادة متعددة، تنفد مجموعة اتصالات قاعدة البيانات (database connection pool). ويتوقف كل شيء عن العمل.
أدركت أنه لا ينبغي لي تخزين استجابة الذكاء الاصطناعي النهائية مؤقتًا، فهذا أمر معقد للغاية بالنسبة لـ MCP. بدلاً من ذلك، كان عليّ تخزين الجزء الثقيل مؤقتًا: البحث الدلالي وجلب المحتوى.
انتقلت إلى استراتيجية تخزين مؤقت ثنائية المستويات:
• المستوى 1: تخزين مؤقت في الذاكرة (In-memory cache) للاستعلامات المتكررة. هذا سريع للغاية. • المستوى 2: تخزين Redis مؤقتًا للبيانات المشتركة عبر عمليات إعادة التشغيل.
اتبعت أيضًا هذه القواعد لضمان عملها:
- توحيد الاستعلامات (Normalize queries): أقوم بتحويل الاستعلامات إلى أحرف صغيرة وإزالة المسافات الزائدة. هذا يزيد من معدل نجاح التخزين المؤقت (cache hits).
- تخزين النتائج مؤقتًا وليس التدفقات (streams): أقوم بتخزين نتائج البحث فقط مؤقتًا. البحث يستغرق 95% من الوقت.
- التدهور التدريجي (Graceful degradation): إذا توقف Redis عن العمل، سيظل الخادم يعمل، ولكنه سيتوجه مباشرة إلى قاعدة البيانات. التخزين المؤقت هو عملية تحسين وليس شرطًا لنجاح الطلب.
كانت النتائج هائلة.
انخفض متوسط وقت البحث لدي من 320 مللي ثانية إلى 12 مللي ثانية. هذا أسرع بـ 27 مرة. معدل نجاح التخزين المؤقت الإجمالي لدي هو 73%. معظم الاستعلامات لا تصل إلى قاعدة البيانات الخاصة بي على الإطلاق.
إذا كنت تبني MCP server، فافعل ما يلي:
- للاستخدام الشخصي: استخدم تخزينًا مؤقتًا في الذاكرة (in-memory cache). فهو يمنع مهلات الانتظار العشوائية.
- للخدمات العامة: استخدم نهج المستويين مع Redis. فهو يمنع الانهيارات ويحسن السرعة.
التخزين المؤقت يتعلق بالموثوقية. فهو يوقف دورة محاولات إعادة المحاولة وفشل الاتصال.
Optional learning community: https://t.me/GyaanSetuAi
