نظرة عامة
تقبل واجهة برمجة التطبيقات Twenty 500 طلب في الدقيقة لكل تسجيل تطبيق للطلبات التي يجريها تطبيق باسمه الخاص: عمليات تشغيل لا يقف وراءها شخص (cron وWebhooks وخطافات التثبيت) والعملاء الذين تم إنشاؤهم باستخدامrunAs: 'application'. تتم مشاركة الميزانية بين كل مساحة عمل ثبّتت التطبيق، وتُرفض الطلبات التي تتجاوزها مع 429. تُحتسب الطلبات المقدمة بصفتك الشخص الذي بدأ عملية تشغيل ضمن حدود ذلك الشخص بدلًا من ذلك. تحافظ الممارسات أدناه على التطبيق ضمن تلك الميزانية مع نمو عدد عمليات تثبيته، وضمن حدود الخدمات التي يستدعيها.
- وزّع مهام كرون الشاملة باستخدام تأخير عشوائي. يبدأ مشغّل كرون في كل مساحة عمل في الدقيقة نفسها، لذا يستنزف كل تثبيت الميزانية المشتركة دفعة واحدة. اجعل معالج كرون مقتصرًا على إدراج مهمة في قائمة الانتظار، مع
delayMsعشوائي عبر نافذة كبيرة مثل ساعة واحدة. يُحدَّد أيضًا إدراج المهام في قائمة الانتظار بحد أقصى قدره 2,000 في الدقيقة لكل تسجيل تطبيق، ويتم تخطي نبضة كرون التي تتجاوز هذا الحد في مساحات العمل المتبقية، لذا اجعل عملية المسح متكررة آمنة ودع النبضة التالية تلحق بها.
src/logic-functions/enqueue-nightly-sweep.ts
-
جمّع مشغلات أحداث قاعدة البيانات على دفعات. تؤدي عملية كتابة مجمعة مثل مزامنة صندوق البريد إلى إصدار حدث واحد لكل سجل، أي آلاف الأحداث خلال ثوانٍ، وتعني عملية تشغيل واحدة لكل حدث طلبًا واحدًا لكل سجل. عيّن
batchMode: true، وعرّفupdatedFields، وقلّص الدفعة إلى سجلات مميزة قبل استدعاء واجهة API. راجع تجميع أحداث قاعدة البيانات على دفعات. -
قدّم طلبًا واحدًا لكل دفعة، وليس لكل سجل. يحتسب الحد الطلبات لا السجلات: إن
createManyمعupsert: trueيحمل 200 سجل هو طلب واحد، بينما 200 تحديث منفرد هي 200 طلب. اقرأ باستخدام عوامل التصفيةinواكتب باستخدامcreateManyأوupdateMany. -
اجمع التدفقات المفاجئة في مهمة واحدة مؤجلة. عندما تكشف الأحداث عن عمل أكبر من الحدث نفسه، فإن إدراجه في قائمة الانتظار مرة لكل حدث يضاعفه بحجم التدفق المفاجئ. أدرج مهمة واحدة في قائمة الانتظار باستخدام
delayMsوjobIdحتمي يتضمن نافذة زمنية؛ تتجاهل قائمة الانتظار معرّفًا تحتفظ به بالفعل. راجع اختيار معرّف المهمة الخاص بك. -
نظّم التوزيع المتشعب باستخدام
delayMs. تصبح المهام المُدرجة في قائمة الانتظار دون تأخير مؤهلة كلها دفعة واحدة وتستنفد الميزانية في الدقيقة نفسها. جمّعها في خانات لكل دقيقة وأخّر الصفحة التالية بعدد الخانات المستخدمة. راجع المهام في الخلفية. -
أعِد محاولة
429مع تراجع تدريجي، أو أعد إدراجها في قائمة الانتظار مع تأخير. تُطلق حزمة SDK للعميل استثناءً عند أي استجابة ليست 2xx، كما أن عملية التشغيل التي تنتظر في الداخل تستهلك مهلة الانتظار الخاصة بها. أعِد المحاولة بتراجع تدريجي أُسّي مع حد أقصى للمحاولات، أو أعد العمل إلى قائمة الانتظار مع تأخير. - خزّن مؤقتًا ما لا يتغير. يتطلب البحث في كل حدث طلبًا لقيمة ثابتة عند وقت الاتصال، مثل هوية أو معرّف فريق. خزّنه في مخزن المفتاح والقيمة عند تسجيل الاتصال.
-
جمّع الطلبات إلى واجهات API الخارجية على دفعات. للخدمة الخارجية حد معدل خاص بها، وللوظيفة المنطقية مهلة انتظار، لذا فإن
nطلبات لكل عملية تشغيل تضاعف كليهما. عندما يوفّر المزوّد نقطة نهاية للدفعات، أرسل طلبًا واحدًا للدفعة بأكملها بدلًا من طلب واحد لكل سجل، وقسّم الدفعة إلى أجزاء وفق الحد الأقصى للمزوّد. - اجعل المعلمات الافتراضية قابلة للتحرير من قبل المستخدم. تناسب القيمة المُضمّنة في التعليمات البرمجية ضمن وظيفة منطقية أو سير عمل، مثل عتبة أو حجم دفعة أو خيار افتراضي، مساحة عمل واحدة وتفرض إصدارًا جديدًا لكل مساحة عمل أخرى. عرّفها كمتغير تطبيق ذي قيمة افتراضية واقرأها وقت التشغيل، كي يتمكن مسؤولو مساحة العمل من ضبطها من إعدادات التطبيق. راجع تهيئة التطبيق.