מסמך זה תורגם על ידי בינה מלאכותית. לכל אי דיוק, אנא עיין בגרסה האנגלית
בסביבת צומת יחיד, תוספים יכולים בדרך כלל למלא דרישות באמצעות מצב בתוך התהליך, אירועים או משימות. עם זאת, במצב אשכול, אותו תוסף עשוי לפעול על מספר מופעים בו-זמנית, ונתקל בבעיות טיפוסיות הבאות:
ליבת NocoBase מספקת מראש מגוון ממשקי תווכה (middleware) בשכבת היישום כדי לעזור לתוספים לעשות שימוש חוזר ביכולות אחידות בסביבת אשכול. הסעיפים הבאים יציגו את השימוש והשיטות המומלצות עבור שמירה במטמון (caching), הודעות סינכרוניות, תורי הודעות ומנעולים מבוזרים, יחד עם הפניות לקוד המקור.
עבור נתונים שיש לאחסן בזיכרון, מומלץ להשתמש ברכיב המטמון המובנה של המערכת לצורך ניהול.
app.cache.Cache מספק פעולות בסיסיות כמו set/get/del/reset, ותומך גם ב-wrap וב-wrapWithCondition לעטיפת לוגיקת שמירה במטמון, וכן בשיטות אצווה כמו mset/mget/mdel.ttl סביר כדי למנוע אובדן מטמון בעת הפעלה מחדש של מופע.דוגמה: אתחול ושימוש במטמון ב-plugin-auth
אם לא ניתן לנהל מצב בזיכרון באמצעות מטמון מבוזר (לדוגמה, אם לא ניתן לבצע לו סדרתיות), אזי כאשר המצב משתנה כתוצאה מפעולות משתמש, יש לשדר את השינוי למופעים אחרים באמצעות אות סנכרון כדי לשמור על עקביות המצב.
sendSyncMessage, אשר קוראת פנימית ל-app.syncMessageManager.publish ומוסיפה אוטומטית קידומת ברמת היישום לערוץ כדי למנוע התנגשויות ערוצים.publish יכול לציין transaction, וההודעה תישלח לאחר ביצוע טרנזקציית מסד הנתונים, מה שמבטיח סנכרון בין המצב להודעה.handleSyncMessage כדי לעבד הודעות ממופעים אחרים. הרשמה בשלב beforeLoad מתאימה מאוד לתרחישים כמו שינויי תצורה וסנכרון סכימה.דוגמה: plugin-data-source-main משתמש בהודעות סנכרון כדי לשמור על עקביות סכימה בין מספר צמתים
שידור הודעות הוא רכיב הבסיס של אותות סנכרון וניתן להשתמש בו גם ישירות. כאשר אתם צריכים לשדר הודעות בין מופעים, תוכלו לממש זאת באמצעות רכיב זה.
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 כדי לשלוט בזמני קצוב (timeouts).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 כדי למנוע עומסי תנועה חדשים במצבים חריגים.באמצעות יכולות אלו, תוספים יכולים לשתף בבטחה מצב, לסנכרן תצורות ולתזמן משימות בין מופעים שונים, ובכך לעמוד בדרישות היציבות והעקביות של תרחישי פריסת אשכול.