تمت ترجمة هذه الوثائق تلقائيًا بواسطة الذكاء الاصطناعي.
في بيئة العقدة الواحدة، يمكن للإضافات عادةً تلبية المتطلبات من خلال الحالة الداخلية للعملية، الأحداث، أو المهام. ولكن في وضع المجموعات (cluster)، قد تعمل الإضافة نفسها على عدة نُسخ في وقت واحد، مما يواجه المشكلات النموذجية التالية:
يوفر جوهر NocoBase واجهات برمجية وسيطة متعددة على مستوى التطبيق لمساعدة الإضافات على إعادة استخدام القدرات الموحدة في بيئة المجموعات. ستتناول الأقسام التالية استخدام أفضل الممارسات للتخزين المؤقت (caching)، والرسائل المتزامنة، وقوائم انتظار الرسائل، والأقفال الموزعة، مع الإشارة إلى الشيفرة المصدرية.
للبيانات التي تحتاج إلى التخزين في الذاكرة، يُنصح باستخدام مكون التخزين المؤقت المدمج في النظام لإدارتها.
app.cache.Cache عمليات أساسية مثل set/get/del/reset، ويدعم أيضًا wrap و wrapWithCondition لتغليف منطق التخزين المؤقت، بالإضافة إلى طرق الدفعات مثل mset/mget/mdel.ttl مناسب لمنع فقدان التخزين المؤقت عند إعادة تشغيل النُسخ.مثال: تهيئة التخزين المؤقت واستخدامه في إضافة-المصادقة (plugin-auth)
إذا تعذر إدارة الحالة الموجودة في الذاكرة باستخدام تخزين مؤقت موزع (على سبيل المثال، لا يمكن تسلسلها)، فعندما تتغير الحالة بسبب إجراءات المستخدم، يجب بث التغيير إلى نُسخ أخرى عبر إشارة متزامنة للحفاظ على اتساق الحالة.
sendSyncMessage، والذي يستدعي داخليًا app.syncMessageManager.publish ويضيف تلقائيًا بادئة على مستوى التطبيق للقناة لتجنب التعارضات.publish تحديد transaction، وسيتم إرسال الرسالة بعد التزام معاملة قاعدة البيانات، مما يضمن مزامنة الحالة والرسالة.handleSyncMessage لمعالجة الرسائل الواردة من نُسخ أخرى. الاشتراك خلال مرحلة beforeLoad مناسب جدًا لسيناريوهات مثل تغييرات التكوين ومزامنة المخطط (Schema).يُعد بث الرسائل المكون الأساسي للإشارات المتزامنة ويمكن استخدامه مباشرةً. عندما تحتاج إلى بث رسائل بين النُسخ، يمكنك استخدام هذا المكون.
app.pubSubManager.subscribe(channel, handler, { debounce }) للاشتراك في قناة عبر النُسخ؛ يُستخدم خيار debounce لمنع الاستدعاءات المتكررة الناتجة عن البث المتكرر.publish خياري skipSelf (الافتراضي هو true) و onlySelf للتحكم فيما إذا كانت الرسالة ستُعاد إرسالها إلى النسخة الحالية.مثال: إضافة-مدير-المهام-غير-المتزامنة (plugin-async-task-manager) تستخدم PubSub لبث أحداث إلغاء المهام
تُستخدم قائمة انتظار الرسائل لجدولة المهام غير المتزامنة، وهي مناسبة للتعامل مع العمليات طويلة الأمد أو التي يمكن إعادة محاولتها.
app.eventQueue.subscribe(channel, { idle, process, concurrency }). تعيد process كائن Promise، ويمكنك استخدام AbortSignal.timeout للتحكم في المهلة.publish تلقائيًا بادئة اسم التطبيق ويدعم خيارات مثل timeout و maxRetries. وهو يتكيف افتراضيًا مع قائمة انتظار في الذاكرة، ولكن يمكن التبديل إلى محولات موسعة مثل RabbitMQ حسب الحاجة.مثال: إضافة-مدير-المهام-غير-المتزامنة (plugin-async-task-manager) تستخدم EventQueue لجدولة المهام
عندما تحتاج إلى تجنب شروط التنافس، يمكنك استخدام قفل موزع لتسلسل الوصول إلى مورد ما.
local المستند إلى العملية، ويمكن تسجيل تطبيقات موزعة مثل Redis؛ استخدم app.lockManager.runExclusive(key, fn, ttl) أو acquire/tryAcquire للتحكم في التزامن.ttl كضمان لتحرير القفل، مما يمنع احتجازه إلى أجل غير مسمى في الحالات الاستثنائية.مثال: إضافة-مصدر-البيانات-الرئيسي (plugin-data-source-main) تستخدم قفلًا موزعًا لحماية عملية حذف الحقول
app.cache و app.syncMessageManager لتجنب إعادة تنفيذ منطق الاتصال عبر العقد في الإضافات.transaction.afterCommit (وهو مدمج في syncMessageManager.publish) لضمان اتساق البيانات والرسائل.timeout و maxRetries و debounce لمنع حدوث ذروات حركة مرور جديدة في الحالات الاستثنائية.من خلال هذه القدرات، يمكن للإضافات مشاركة الحالة بأمان، ومزامنة التكوينات، وجدولة المهام عبر نُسخ مختلفة، مما يلبي متطلبات الاستقرار والاتساق في سيناريوهات نشر المجموعات.