Tento dokument byl přeložen umělou inteligencí. V případě nepřesností se prosím obraťte na anglickou verzi
V prostředí s jedním uzlem mohou pluginy obvykle plnit své požadavky pomocí stavu v rámci procesu, událostí nebo úloh. Avšak v klastrovém režimu může stejný plugin běžet souběžně na více instancích, což s sebou nese následující typické problémy:
Jádro NocoBase poskytuje na aplikační vrstvě různé middleware rozhraní, která pomáhají pluginům využívat jednotné schopnosti v klastrovém prostředí. Následující sekce představí použití a osvědčené postupy pro cachování, synchronní zprávy, fronty zpráv a distribuované zámky, včetně odkazů na zdrojový kód.
Pro data, která je třeba ukládat do paměti, doporučujeme použít vestavěnou systémovou komponentu pro cachování.
app.cache.Cache poskytuje základní operace jako set/get/del/reset a také podporuje wrap a wrapWithCondition pro zapouzdření logiky cachování, stejně jako dávkové metody jako mset/mget/mdel.ttl, aby se zabránilo ztrátě cache při restartu instance.Příklad: Inicializace a použití cache v plugin-auth
Pokud stav v paměti nelze spravovat pomocí distribuované cache (např. nelze jej serializovat), pak v případě, že se stav změní v důsledku uživatelských akcí, je třeba tuto změnu oznámit ostatním instancím prostřednictvím synchronního signálu, aby byla zachována konzistence stavu.
sendSyncMessage, která interně volá app.syncMessageManager.publish a automaticky přidává prefix na úrovni aplikace k kanálu, aby se předešlo konfliktům.publish může specifikovat transaction, a zpráva bude odeslána po potvrzení databázové transakce, což zajišťuje synchronizaci stavu a zpráv.handleSyncMessage pro zpracování zpráv z jiných instancí. Přihlášení k odběru během fáze beforeLoad je velmi vhodné pro scénáře, jako jsou změny konfigurace a synchronizace schématu.Příklad: plugin-data-source-main používá synchronní zprávy k udržení konzistence schématu napříč více uzly
Vysílání zpráv je základní komponentou synchronních signálů a lze jej také přímo použít. Pokud potřebujete vysílat zprávy mezi instancemi, můžete tuto komponentu využít.
app.pubSubManager.subscribe(channel, handler, { debounce }) lze použít k přihlášení k odběru kanálu napříč instancemi; volba debounce slouží k potlačení opakovaných volání způsobených častým vysíláním.publish podporuje skipSelf (výchozí hodnota je true) a onlySelf pro řízení, zda se zpráva odešle zpět na aktuální instanci.Příklad: plugin-async-task-manager používá PubSub k vysílání událostí zrušení úloh
Fronta zpráv se používá k plánování asynchronních úloh, je vhodná pro zpracování dlouhotrvajících nebo opakovatelných operací.
app.eventQueue.subscribe(channel, { idle, process, concurrency }). process vrací Promise a pro řízení časových limitů můžete použít AbortSignal.timeout.publish automaticky přidává prefix názvu aplikace a podporuje volby jako timeout a maxRetries. Ve výchozím nastavení používá adaptér fronty v paměti, ale podle potřeby jej lze přepnout na rozšířené adaptéry, jako je RabbitMQ.Příklad: plugin-async-task-manager používá EventQueue k plánování úloh
Pokud potřebujete předejít podmínkám souběhu, můžete použít distribuovaný zámek k serializaci přístupu ke zdroji.
local založený na procesu. Můžete registrovat distribuované implementace, jako je Redis. Pro řízení souběhu použijte app.lockManager.runExclusive(key, fn, ttl) nebo acquire/tryAcquire.ttl slouží jako pojistka pro uvolnění zámku, čímž zabraňuje jeho trvalému držení v případě výjimečných situací.Příklad: plugin-data-source-main používá distribuovaný zámek k ochraně procesu mazání polí
app.cache a app.syncMessageManager, abyste se vyhnuli opakované implementaci logiky komunikace mezi uzly v pluginech.transaction.afterCommit (syncMessageManager.publish to má vestavěné), aby byla zajištěna konzistence dat a zpráv.timeout, maxRetries a debounce, abyste předešli novým špičkám provozu ve výjimečných situacích.Díky těmto schopnostem mohou pluginy bezpečně sdílet stav, synchronizovat konfigurace a plánovat úlohy napříč různými instancemi, čímž splňují požadavky na stabilitu a konzistenci v scénářích klastrového nasazení.