Get a quote

استراتيجيات التخزين المؤقت باستخدام Redis لواجهات برمجة SaaS عالية القراءة في Go

إضافة Redis إلى نظام Go الخلفي أمر بسيط. إتقان إبطال التخزين المؤقت ومنع cache stampede وعزل بيانات المستأجرين في الذاكرة المؤقتة هو ما يحرق معظم الفرق.

التخزين المؤقت باستخدام Redis هو واحد من أعلى التغييرات في البنية التحتية عائداً على الاستثمار يمكنك إجراؤها على نظام Go SaaS الخلفي. طبقة تخزين مؤقت مصممة جيداً تقلل الحمل على قاعدة البيانات بنسبة 60 إلى 80%، وتخفض أوقات استجابة API من 80 ميلي ثانية إلى أقل من 10 ميلي ثانية لنقاط النهاية كثيفة القراءة.

لكن Redis ليس مجرد مخزن مفاتيح-قيم بسيط يمكن توصيله بسهولة. الحصول على التخزين المؤقت بشكل صحيح في منتج SaaS متعدد المستأجرين يتطلب تصميماً دقيقاً للمفاتيح، ومنطق إبطال دقيق، وكوداً دفاعياً للسيناريوهات التي تظهر فقط في الحجم الكبير.

متى تضيف Redis إلى نظام Go SaaS الخلفي

ليس كل خدمة Go تحتاج Redis. إضافة التخزين المؤقت مبكراً جداً يزيد من التعقيد التشغيلي بدون فائدة تناسبية. الوقت المناسب لإضافة Redis هو عندما يكون لديك مشكلة قابلة للقياس.

بيانات المستخدم والمنظمة. معظم طلبات SaaS تصادق مقابل سجل المستخدم وتتحقق من صلاحيات المنظمة. هذه السجلات تتغير نادراً لكنها تُجلب في كل طلب.

بيانات feature flags والإعدادات. تُقرأ بشكل متكرر وتتغير نادراً. TTL مدته خمس دقائق على هذه القيم يلغي معظم حمل قراءة قاعدة البيانات التي تولدها.

nتائج استعلامات التجميع. استعلامات لوحات المعلومات التي تلخص النشاط عبر نوافذ زمنية مكلفة الحساب. التخزين المؤقت للنتيجة مع TTL يطابق القبول بعدم الحداثة هو النهج الصحيح.

Cache-aside مقابل Write-through: أيهما لـ SaaS

النمطان الرئيسيان لدمج Redis في مسار قراءة SaaS هما cache-aside (التحميل الكسول) و write-through (التحميل المبكر).

Cache-aside هو النمط القياسي للأنظمة الخلفية لـ SaaS. التطبيق يقرأ من Redis أولاً. عند miss، يقرأ من قاعدة البيانات، يخزن النتيجة في Redis، ويعيدها للمُستدعي. عند الكتابة، يُحدّث التطبيق قاعدة البيانات ويحذف أو يُحدّث إدخال الذاكرة المؤقتة.

Write-through يحافظ على الذاكرة المؤقتة دائمة التحديث بالكتابة إلى كل من قاعدة البيانات و Redis بشكل متزامن في كل تحديث. هذا يلغي cache misses بعد التحميل الأول لكنه يزيد من كمون الكتابة وتعقيدها.

تسمية مفاتيح متعددة المستأجرين في Redis

منتجات SaaS متعددة المستأجرين تخزن بيانات لمنظمات متعددة في نفس قاعدة البيانات. يجب أن يكون الأمر كذلك في ذاكرة Redis المؤقتة. إذا كان مفتاح الذاكرة المؤقتة لبيانات منظمة مستأجر ما org:123:config، فهو يعمل. لكن إذا انتهى مستأجران بنفس نطاق المعرف الداخلي، أو إذا كان تصادم المفاتيح ممكناً بأي آلية أخرى، يمكن تقديم بيانات مستأجر واحد لمستأجر آخر. هذا تسريب للبيانات.

الدفاع هو تسمية صريحة للمستأجر في كل مفتاح ذاكرة مؤقتة.

أنماط المفاتيح المحددة بنطاق المنظمة تجعل الإبطال الجماعي عملياً أيضاً. عندما تغير منظمة خطتها أو يُحدَّث إعدادها، إبطال جميع المفاتيح بالبادئة org:{orgID}: يمسح ذاكرة ذلك المستأجر المؤقتة فقط.

تصميم TTL: استراتيجية TTL لكل كيان

تعيين نفس TTL لكل قيمة مخزنة مؤقتاً هو النهج الخاطئ. يجب أن يعكس TTL مقبولية عدم الحداثة لكل نوع من البيانات وتكلفة cache miss.

بيانات الملف الشخصي للمستخدم. تتغير مرات قليلة في الجلسة على الأكثر. TTL مدته 10 إلى 30 دقيقة معقول.

إعدادات المنظمة. تتغير في أحداث الفواتير أو الإجراءات الإدارية. TTL مدته 30 دقيقة إلى ساعتين.

Feature flags. تتغير فقط عند النشر أو الإجراء الإداري. TTL مدته 5 إلى 10 دقائق.

nتائج استعلامات التجميع. مقبول أن تكون غير محدّثة من 1 إلى 5 دقائق لمعظم المقاييس.

Cache Stampede: القطيع الرعد الموزع

يحدث cache stampede عندما تنتهي صلاحية إدخال ذاكرة مؤقتة شائعة ومطلوبة كثيراً، وتفوّت عدة طلبات متزامنة الذاكرة المؤقتة في وقت واحد، وتذهب جميعها إلى قاعدة البيانات، وتحاول جميعها ملء الذاكرة المؤقتة في الوقت ذاته.

الدفاعان الرئيسيان هما الانتهاء المبكر الاحتمالي والقفل الموزع.

الانتهاء المبكر الاحتمالي يُحدّث إدخال الذاكرة المؤقتة قبل انتهاء صلاحيته قليلاً بناءً على احتمال عشوائي يزداد مع اقتراب الانتهاء. هذا يوزع حمل التحديث عبر الزمن بدلاً من تركيزه في لحظة الانتهاء.

قاطع الدائرة: ماذا يحدث عندما ينهار Redis

عدم توفر Redis يجب ألا يُوقف API. قراءات وكتابات الذاكرة المؤقتة يجب دائماً أن تكون مغلفة في معالجة الأخطاء التي تنتقل إلى قاعدة البيانات عند إخفاق Redis.

النظام الخلفي دائماً يعود إلى قاعدة البيانات كمصدر حقيقة عند إخفاق الذاكرة المؤقتة. هذا يعني أن انتهاء صلاحية Redis لا يحطم API، فقط يزيد الحمل على قاعدة البيانات مؤقتاً.

الدروس الرئيسية من بيئة الإنتاج

دائماً ضع اسم مفاتيح الذاكرة المؤقتة بـ tenant ID في SaaS متعدد المستأجرين. تصادم المفاتيح بين المستأجرين هو تسريب بيانات.

TTL هو شبكة أمان، لا الآلية الأساسية للإبطال. دائماً أبطل عند الكتابة.

Cache-aside مع fallback سلس لـ Redis هو الافتراضي الصحيح لتخزين واجهة برمجة SaaS المؤقت.

صمّم للـ stampede عند أي نقطة نهاية يُوصل إليها بشكل متكرر ومكلفة الحساب.

العودة إلى المدونة
Chat on WhatsApp