Dit document is vertaald door AI. Voor onnauwkeurigheden, raadpleeg de Engelse versie
In een omgeving met één node kunnen plugins doorgaans voldoen aan vereisten via in-process status, gebeurtenissen of taken. In een clustermodus kan dezelfde plugin echter gelijktijdig op meerdere instanties draaien, wat leidt tot de volgende typische problemen:
De NocoBase-kern biedt op applicatieniveau verschillende middleware-interfaces om plugins te helpen uniforme functionaliteiten te hergebruiken in een clusteromgeving. Hieronder bespreken we, met verwijzingen naar de broncode, het gebruik en de best practices van caching, synchrone berichten, berichtenwachtrijen en gedistribueerde vergrendelingen.
Voor gegevens die in het geheugen moeten worden opgeslagen, raden we u aan de ingebouwde cache-component van het systeem te gebruiken voor het beheer.
app.cache.Cache biedt basisbewerkingen zoals set/get/del/reset, en ondersteunt ook wrap en wrapWithCondition om cachinglogica te encapsuleren, evenals batchmethoden zoals mset/mget/mdel.ttl in te stellen om cacheverlies bij het herstarten van instanties te voorkomen.Voorbeeld: Cache-initialisatie en -gebruik in plugin-auth
Als de in-memory status niet kan worden beheerd met een gedistribueerde cache (bijvoorbeeld omdat deze niet kan worden geserialiseerd), dan moet, wanneer de status verandert door gebruikersacties, deze wijziging via een synchroon signaal aan andere instanties worden doorgegeven om de statusconsistentie te behouden.
sendSyncMessage geïmplementeerd, die intern app.syncMessageManager.publish aanroept en automatisch een applicatieniveau-prefix aan het kanaal toevoegt om kanaalconflicten te voorkomen.publish kan een transaction specificeren; het bericht wordt dan pas verzonden nadat de databasetransactie is voltooid, wat de synchronisatie van status en bericht garandeert.handleSyncMessage om berichten van andere instanties te verwerken. Abonneren tijdens de beforeLoad-fase is zeer geschikt voor scenario's zoals configuratiewijzigingen en schema-synchronisatie.Berichtenuitzending is de onderliggende component van synchrone signalen en kan ook direct worden gebruikt. Wanneer u berichten tussen instanties moet uitzenden, kunt u dit via deze component realiseren.
app.pubSubManager.subscribe(channel, handler, { debounce }) kunt u zich abonneren op een kanaal tussen instanties; de debounce-optie wordt gebruikt om 'debouncing' toe te passen, wat frequente callbacks door herhaalde uitzendingen voorkomt.publish ondersteunt skipSelf (standaard true) en onlySelf om te bepalen of het bericht teruggestuurd wordt naar de huidige instantie.Voorbeeld: plugin-async-task-manager gebruikt PubSub om gebeurtenissen voor taakannulering uit te zenden
De berichtenwachtrij wordt gebruikt voor het plannen van asynchrone taken en is geschikt voor het verwerken van langlopende of opnieuw uit te voeren bewerkingen.
app.eventQueue.subscribe(channel, { idle, process, concurrency }). process retourneert een Promise, en u kunt AbortSignal.timeout gebruiken om timeouts te beheren.publish voegt automatisch de applicatienaam-prefix toe en ondersteunt opties zoals timeout en maxRetries. Standaard gebruikt het een in-memory wachtrijadapter, maar u kunt naar behoefte overschakelen naar uitgebreide adapters zoals RabbitMQ.Voorbeeld: plugin-async-task-manager gebruikt EventQueue om taken te plannen
Wanneer u racecondities wilt voorkomen, kunt u een gedistribueerde vergrendeling gebruiken om de toegang tot een resource te serialiseren.
local-adapter geleverd. U kunt gedistribueerde implementaties zoals Redis registreren. Gebruik app.lockManager.runExclusive(key, fn, ttl) of acquire/tryAcquire om gelijktijdigheid te beheren.ttl wordt gebruikt als vangnet om de vergrendeling vrij te geven, zodat deze in uitzonderlijke gevallen niet voor onbepaalde tijd wordt vastgehouden.app.cache en app.syncMessageManager om te voorkomen dat u cross-node communicatielogica opnieuw implementeert in plugins.transaction.afterCommit gebruiken (syncMessageManager.publish heeft dit ingebouwd) om consistentie van gegevens en berichten te garanderen.timeout, maxRetries en debounce om nieuwe verkeerspieken in uitzonderlijke situaties te voorkomen.Met deze mogelijkheden kunnen plugins veilig status delen, configuraties synchroniseren en taken plannen tussen verschillende instanties, wat voldoet aan de stabiliteits- en consistentievereisten van clusterimplementatiescenario's.