Questa documentazione è stata tradotta automaticamente dall'IA.
In un ambiente a nodo singolo, i plugin possono solitamente soddisfare i requisiti attraverso lo stato in-process, gli eventi o le attività. Tuttavia, in modalità cluster, lo stesso plugin può essere eseguito contemporaneamente su più istanze, affrontando i seguenti problemi tipici:
Il core di NocoBase fornisce diverse interfacce middleware a livello di applicazione per aiutare i plugin a riutilizzare capacità unificate in un ambiente cluster. Le sezioni seguenti presenteranno l'utilizzo e le migliori pratiche per la cache, la messaggistica sincrona, le code di messaggi e i lock distribuiti, con riferimenti al codice sorgente.
Per i dati che devono essere memorizzati in memoria, si consiglia di utilizzare il componente cache integrato nel sistema per la loro gestione.
app.cache.Cache fornisce operazioni di base come set/get/del/reset, e supporta anche wrap e wrapWithCondition per incapsulare la logica di caching, oltre a metodi batch come mset/mget/mdel.ttl ragionevole per prevenire la perdita della cache in caso di riavvio dell'istanza.Esempio: Inizializzazione e utilizzo della cache in plugin-auth
Se lo stato in memoria non può essere gestito con una cache distribuita (ad esempio, non può essere serializzato), allora quando lo stato cambia a causa delle azioni dell'utente, la modifica deve essere trasmessa ad altre istanze tramite un segnale di sincronizzazione per mantenere la consistenza dello stato.
sendSyncMessage, che internamente chiama app.syncMessageManager.publish e aggiunge automaticamente un prefisso a livello di applicazione al canale per evitare conflitti.publish può specificare una transaction, e il messaggio verrà inviato dopo il commit della transazione del database, garantendo la sincronizzazione dello stato e del messaggio.handleSyncMessage per elaborare i messaggi provenienti da altre istanze. L'iscrizione durante la fase beforeLoad è molto adatta per scenari come modifiche alla configurazione e sincronizzazione dello schema.La trasmissione di messaggi è il componente sottostante dei segnali sincroni e può essere utilizzata anche direttamente. Quando ha bisogno di trasmettere messaggi tra istanze, può utilizzare questo componente.
app.pubSubManager.subscribe(channel, handler, { debounce }) può essere utilizzato per iscriversi a un canale tra le istanze; l'opzione debounce viene utilizzata per prevenire callback frequenti causate da trasmissioni ripetute.publish supporta skipSelf (il valore predefinito è true) e onlySelf per controllare se il messaggio viene inviato all'istanza corrente.Esempio: plugin-async-task-manager utilizza PubSub per trasmettere eventi di annullamento delle attività
La coda di messaggi viene utilizzata per pianificare attività asincrone, adatta per gestire operazioni a lunga esecuzione o che possono essere ritentate.
app.eventQueue.subscribe(channel, { idle, process, concurrency }). process restituisce una Promise, e può utilizzare AbortSignal.timeout per controllare i timeout.publish aggiunge automaticamente il prefisso del nome dell'applicazione e supporta opzioni come timeout e maxRetries. Per impostazione predefinita, utilizza un adattatore di coda in memoria, ma può essere commutato ad adattatori estesi come RabbitMQ, se necessario.Esempio: plugin-async-task-manager utilizza EventQueue per pianificare le attività
Quando ha bisogno di evitare condizioni di competizione, può utilizzare un lock distribuito per serializzare l'accesso a una risorsa.
local basato su processo. Può registrare implementazioni distribuite come Redis. Utilizzi app.lockManager.runExclusive(key, fn, ttl) o acquire/tryAcquire per controllare la concorrenza.ttl viene utilizzato come salvaguardia per rilasciare il lock, impedendo che venga mantenuto indefinitamente in casi eccezionali.app.cache e app.syncMessageManager per evitare di re-implementare la logica di comunicazione tra nodi nei plugin.transaction.afterCommit (syncMessageManager.publish lo ha integrato) per garantire la consistenza dei dati e dei messaggi.timeout, maxRetries e debounce per prevenire nuovi picchi di traffico in situazioni eccezionali.Con queste capacità, i plugin possono condividere in modo sicuro lo stato, sincronizzare le configurazioni e pianificare le attività tra diverse istanze, soddisfacendo i requisiti di stabilità e consistenza degli scenari di deployment in cluster.