Database Engineering

كسر حاجز أداء قواعد البيانات الخالية من الخوادم: قوة تجميع الاتصالات كخدمة

في عالم الحوسبة الخالية من الخوادم، غالباً ما تكون عمليات البدء البارد (Cold Starts) هي المشكلة البارزة، لكنها ليست القاتل الوحيد للأداء الكامن في بنيتك المعمارية. بالنسبة للعديد من المطورين، فإن الاختناق الصامت هو عبء اتصال قاعدة البيانات. تحافظ خوادم التطبيقات التقليدية على اتصالات مستمرة، لكن الدوال الخالية من الخوادم تكون مؤقتة. قد يؤدي كل استدعاء لإطلاق حاوية جديدة، مما يعني أن كل استعلام لقاعدة البيانات يتطلب غالباً مصافحة TCP جديدة ومصادقة. يمكن أن تزيد هذه التبادلات البروتوكولية "المثرثرة" من زمن الاستجابة بشكل كبير، محولةً عملية تستغرق أجزاء من الألف من الثانية إلى تأخير يصل إلى عشرات الأجزاء من الألف من الثانية.

لحل هذه المشكلة دون إدارة بنية معقدة، تتحول الصناعة نحو تجميع الاتصالات كخدمة (Connection Pooling as a Service - CPaaS). تستكشف هذه المقالة كيف يمكن دمج طبقات التجميع المُدارة في تقليل زمن الاستجابة وتحسين الكفاءة من حيث التكلفة في البيئات الخالية من الخوادم.

مشكلة الاتصالات المؤقتة

منصات الحوسبة الخالية من الخوادم مثل AWS Lambda و Azure Functions و Google Cloud Functions تقوم بتوسيع النطاق بشكل عدواني. عندما ترتفع حركة المرور، تقوم المنصة بتشغيل آلاف مثيلات الدوال. إذا قام كل مثيل بفتح اتصال مباشر بقاعدة بيانات PostgreSQL أو MySQL، فستواجه مشكلتين حاسمتين:

  1. ارتفاع في زمن الاستجابة: يستغرق إنشاء اتصال TCP جديد ومصادقة قاعدة البيانات وقتاً. في بنية الخدمات المصغرة ذات الخطوات المتعددة، يتراكم هذا الوقت بسرعة.
  2. إرهاق قاعدة البيانات: تمتلك قواعد البيانات حدوداً لعدد الاتصالات المتزامنة. يمكن أن يؤدي الانفجار المفاجئ في استدعاءات الخوادم الخالية من الخوادم إلى استنفاد تجميع الاتصالات على خادم قاعدة البيانات، مما يؤدي إلى أخطاء "عدد الاتصالات كبير جداً" وانهار التطبيقات.

كيف يعمل تجميع الاتصالات كخدمة

تقع حلول CPaaS (مثل AWS Aurora Proxy، و Supavisor، أو PgBouncer-as-a-Service) بين دوالك الخالية من الخوادم وقاعدة البيانات الخاصة بك. فهي تحافظ على مجموعة ثابتة من الاتصالات المستمرة مع قاعدة البيانات، بغض النظر عن عدد الدوال التي تعمل. عندما تحتاج الدالة إلى استعلام قاعدة البيانات، يقوم الوكيل بتوجيه الطلب عبر اتصال خامل موجود مسبقاً.

يفصل هذا النهج عدد مثيلات التطبيق عن عدد اتصالات قاعدة البيانات. حتى لو كان لديك 1000 دالة Lambda تبدأ من حالة التبريد، فقد ترى قاعدة البيانات فقط 50 اتصالاً نشطاً قادمة من الوكيل.

استراتيجية التنفيذ

يتطلب تنفيذ طبقة الوكيل تغييرات طفيفة في الكود. ما عليك سوى تحديث نقطة نهاية قاعدة البيانات لتشير إلى اسم المضيف الخاص بالوكيل بدلاً من نقطة نهاية قاعدة البيانات مباشرة. ومع ذلك، هناك ممارسات مثلى لضمان الكفاءة.

مثال على الكود: Node.js مع وكيل PgBouncer

يوضح أدناه مثالاً عملياً للاتصال بقاعدة البيانات عبر وكيل تجميع في دالة خالية من الخوادم تعمل بـ Node.js. لاحظ أن التكوين يظل مشابهاً، لكن المضيف يشير إلى الوكيل.


const { Pool } = require('pg');

// التكوين يشير الآن إلى وكيل تجميع الاتصالات
const pool = new Pool({
  user: 'dbuser',
  password: 'securepassword',
  host: 'proxy-endpoint.supabase.co', // يشير إلى الوكيل، وليس قاعدة البيانات
  port: 6543, // منفذ PgBouncer القياسي
  database: 'myserverlesdb',
  ssl: { rejectUnauthorized: false },
  // مهلة الخمول حاسمة للخوادم الخالية من الخوادم لإطلاق الاتصالات مرة أخرى إلى التجميع
  idleTimeoutMillis: 30000, 
  connectionTimeoutMillis: 2000,
});

exports.handler = async (event) => {
  const client = await pool.connect();
  try {
    const result = await client.query('SELECT now()');
    return {
      statusCode: 200,
      body: JSON.stringify({ time: result.rows[0].now }),
    };
  } finally {
    // دائماً قم بإطلاق العميل مرة أخرى إلى التجميع
    client.release();
  }
};

اعتبارات التكوين الرئيسية

عند استخدام وكلاء التجميع، يجب ضبط idleTimeoutMillis في مكتبة العميل الخاصة بك. إذا كانت هذه القيمة عالية جداً، فإن الاتصالات الخاملة تتراكم في تجميع جانب العميل، مما يهدر الموارد. وإذا كانت منخفضة جداً، فإنك تتكبد تكلفة إعادة الاتصال بشكل متكرر جداً. عادةً ما يكون التوازن بين 30 إلى 60 ثانية مثالياً لأحمال العمل الخالية من الخوادم.

فوائد التكلفة وزمن الاستجابة

بالإضافة إلى الأداء، توفر CPaaS وفورات في التكلفة. تفرض العديد من محركات قواعد البيانات الخالية من الخوادم رسوماً بناءً على وحدات الإدخال/الإخراج المخصصة (IOPS) أو عدد الاتصالات. من خلال تحديد الحد الأقصى لعدد الاتصالات، يمكنك ضبط حجم مثيل قاعدة البيانات الخاصة بك بشكل أكثر جرأة. بالإضافة إلى ذلك، يؤدي تقليل زمن الاستجابة إلى تسريع أوقات تنفيذ الدالة، مما يخفض بشكل مباشر تكلفة الحوسبة في نماذج الدفع حسب الاستخدام.

الخاتمة

تجميع الاتصالات كخدمة ليس مجرد رفاهية للتطبيقات ذات حركة المرور العالية؛ بل هو ممارسة مثلى لأي بنية خوادم خالية من الخوادم جادة. من خلال تجريد طبقة إدارة الاتصالات، تضمن أن يظل تطبيقك سريع الاستجابة وقابلاً للتوسع وفعالاً من حيث التكلفة. عند تصميم مشروعك الخالي من الخوادم التالي، فكر في إضافة وكيل تجميع إلى مجموعة البنية التحتية الخاصة بك. إنه تغيير معماري صغير ذو تأثير هائل على تجربة المستخدم واستقرار النظام.

Share: