Ця документація була автоматично перекладена штучним інтелектом.
У середовищі з одним вузлом плагіни зазвичай можуть виконувати свої завдання за допомогою внутрішньопроцесного стану, подій або завдань. Однак у кластерному режимі той самий плагін може одночасно працювати на кількох екземплярах, стикаючись з такими типовими проблемами:
Ядро NocoBase надає на рівні застосунку різні інтерфейси проміжного програмного забезпечення, щоб допомогти плагінам використовувати єдині можливості в кластерному середовищі. Нижче, з посиланням на вихідний код, ми розглянемо використання та найкращі практики кешування, синхронних повідомлень, черг повідомлень та розподілених блокувань.
Для даних, які потрібно зберігати в пам'яті, рекомендується використовувати вбудований компонент кешування системи.
app.cache.Cache надає базові операції, такі як set/get/del/reset, а також підтримує wrap та wrapWithCondition для інкапсуляції логіки кешування, а також пакетні методи, такі як mset/mget/mdel.ttl, щоб уникнути втрати кешу при перезапуску екземпляра.Приклад: Ініціалізація та використання кешу в plugin-auth
Якщо стан у пам'яті не може бути керований за допомогою розподіленого кешу (наприклад, його неможливо серіалізувати), то при зміні стану внаслідок дій користувача необхідно сповіщати про ці зміни інші екземпляри за допомогою синхронного сигналу, щоб підтримувати узгодженість стану.
sendSyncMessage, який внутрішньо викликає app.syncMessageManager.publish та автоматично додає префікс рівня застосунку до каналу, щоб уникнути конфліктів каналів.publish може вказувати transaction; повідомлення буде надіслано після фіксації транзакції бази даних, забезпечуючи синхронізацію стану та повідомлень.handleSyncMessage для обробки повідомлень, що надходять від інших екземплярів. Підписка на етапі beforeLoad дуже підходить для сценаріїв, таких як зміни конфігурації та синхронізація схеми.Широкомовна розсилка повідомлень є базовим компонентом синхронних сигналів і також підтримує пряме використання. Коли вам потрібно транслювати повідомлення між екземплярами, ви можете використовувати цей компонент.
app.pubSubManager.subscribe(channel, handler, { debounce }) можна використовувати для підписки на канал між екземплярами; опція 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, щоб запобігти виникненню нових піків трафіку у виняткових ситуаціях.Завдяки цим можливостям плагіни можуть безпечно обмінюватися станом, синхронізувати конфігурації та планувати завдання між різними екземплярами, відповідаючи вимогам стабільності та узгодженості в сценаріях розгортання кластера.