كيفية إصلاح LIMIT_EXCEEDED في عمليات نشر Salesforce

وصلت اختبارات Apex الخاصة بعملية النشر، أو تحميل البيانات وراءها، إلى أحد حدود الحاكم أو الحدود على مستوى المؤسسة في Salesforce.

يظهر أثناء: تنفيذ اختبارات Apex أو عمليات البيانات الجماعية، وليس أثناء التحقق من صحة نشر البيانات الوصفية نفسها

المعنى

يغطي LIMIT_EXCEEDED مجموعة من حدود Salesforce، وأكثرها شيوعًا حدود حاكم Apex مثل استعلامات SOQL، أو عبارات DML، أو وقت المعالج، التي يتم الوصول إليها أثناء تنفيذ الاختبارات التي تتطلبها عملية النشر. قد يعني أيضًا أن حدًا على مستوى المؤسسة، مثل عدد استدعاءات API اليومية أو مستلمي البريد الجماعي، قد تم تجاوزه بواسطة أتمتة تُشغّلها عملية النشر.

تُعاد حدود الحاكم لكل معاملة (100 استعلام SOQL، 150 عبارة DML، 10,000 ميلي ثانية من وقت المعالج بشكل متزامن) عند كل معاملة، لذا يشير هذا في الغالب إلى كود غير مُجمّع بكفاءة داخل معاملة واحدة، لا إلى سقف سعة حقيقي على المؤسسة.

التشخيص

الأسباب الشائعة

إعداد بيانات اختبار Apex يقوم بالكثير في معاملة واحدة
تُدرج طريقة اختبار كميات كبيرة من السجلات أو تُشغّل أتمتة متسلسلة تدفع استخدام SOQL أو DML أو المعالج إلى ما بعد حد المعاملة الواحدة.
تحميل البيانات الجماعي يتجاوز التجميع (bulkification)
تعالج عملية ترحيل البيانات السجلات واحدًا تلو الآخر، أو في دفعات صغيرة، فتُشغّل مشغلاً لم يُكتب للتعامل بكفاءة مع الأحجام الجماعية.
تم استهلاك حد API أو البريد اليومي بالفعل
استهلكت تكاملات أخرى أو مهام مجدولة في المؤسسة معظم حد يومي مشترك قبل تشغيل عمليات عملية النشر نفسها.

الحل

  1. طبّق التجميع (bulkify) على مسار الكود الذي يصل إلى الحد
    أعد كتابة المشغل أو الفئة أو الاختبار للعمل على مجموعات بدلاً من سجلات فردية، مما يقلل استدعاءات SOQL وDML لكل معاملة.
    // Bad: SOQL inside a loop
    for (Account a : accounts) {
        List<Contact> cons = [SELECT Id FROM Contact WHERE AccountId = :a.Id];
    }
    
    // Good: one query outside the loop
    Map<Id, List<Contact>> conMap = new Map<Id, List<Contact>>();
    for (Contact c : [SELECT Id, AccountId FROM Contact WHERE AccountId IN :accountIds]) {
        if (!conMap.containsKey(c.AccountId)) conMap.put(c.AccountId, new List<Contact>());
        conMap.get(c.AccountId).add(c);
    }
  2. قلّل حجم بيانات الاختبار إلى الحد الأدنى المطلوب
    قلّص إعداد اختبار Apex إلى أصغر مجموعة بيانات لا تزال تُشغّل المنطق قيد الاختبار.
  3. تحقق من حدود المؤسسة قبل عمليات النشر الكبيرة
    راجع حدود API والحدود اليومية الأخرى في Setup قبل تشغيل تحميل بيانات جماعي أو عملية نشر تضيف إلى الاستخدام المُستهلك بالفعل ذلك اليوم.
من واقع الاستخدام

إزاي Serpent بتمنع ده

يحتفظ Serpent بمؤسسات تجريبية مُجهّزة مسبقًا لعمليات التشغيل الاختباري، بحيث يواجه اختبار جماعي أو تحميل بيانات مجموعة نظيفة من الحدود بدلاً من التنافس مع كل ما يعمل بالفعل في بيئة تجريبية مشتركة. راجع مكتبة أخطاء نشر Salesforce.

لوحة الإصدارات مع تنبيهات التعارض في Serpent

الوقاية

اكتب كل مشغل آمنًا للعمل الجماعي من السطر الأول، لا كإصلاح لاحق
استعلم ونفّذ DML على مجموعات افتراضيًا في المشغلات الجديدة، بحيث يكون الأمان الجماعي هو التصميم الأولي، لا إصلاحًا يُطبّق بعد أول فشل LIMIT_EXCEEDED.
اختبر الأحمال بأحجام دفعات واقعية قبل الإنتاج
شغّل سكربتات الترحيل والتحميل الجماعي مقابل أحجام بيانات بحجم الإنتاج في مؤسسة تجريبية أو بيئة تجريبية قبل جدولة التحميل الفعلي.
راقب الحدود على مستوى المؤسسة، لا حدود المعاملة الواحدة فقط
تتبّع استخدام استدعاءات API والبريد الجماعي اليومي بمرور الوقت، حتى لا تكون عمليات النشر نفسها هي التي تتسبب أخيرًا في تجاوز حد مشترك.
أسئلة شائعة

LIMIT_EXCEEDED، تمت الإجابة

هل LIMIT_EXCEEDED هو نفسه استثناء حد الحاكم في Apex؟
هما مرتبطان ارتباطًا وثيقًا. تُطلق حدود الحاكم استثناء System.LimitException داخل Apex، ما يظهر كفشل اختبار؛ أما LIMIT_EXCEEDED فهو خطأ API أوسع لتجاوز الحدود على مستوى المؤسسة مثل استدعاءات API أو مستلمي البريد الجماعي.
هل تُعاد حدود الحاكم بين Test.startTest() و Test.stopTest()؟
نعم. يمنح Test.startTest() الكود الذي يليه مجموعة جديدة من حدود الحاكم، منفصلة عما استهلكه إعداد الاختبار نفسه، ولهذا يهم نقل الإعداد الثقيل قبله.
هل حدود الحاكم متماثلة عبر جميع إصدارات Salesforce؟
معظم حدود Apex لكل معاملة متماثلة عبر الإصدارات، لكن بعض الحدود على مستوى المؤسسة، مثل استدعاءات API يوميًا، تتغير حسب الإصدار وعدد تراخيص المستخدمين، لذا يمكن لمؤسستين الوصول إلى REQUEST_LIMIT_EXCEEDED عند أحجام مختلفة تمامًا.

ابدأ مجانًا. بدون بطاقة ائتمان، وبدون تثبيت، وبدون التزام.

يتم الإعداد في أقل من 15 دقيقة. لا حاجة لتوظيف متخصص DevOps.

هل تريد معرفة كيف يمكنكم الشحن أسرع قبل البدء؟ لنتحدث

بدون التزام.