Dokumen ini diterjemahkan oleh AI. Untuk ketidakakuratan apa pun, silakan lihat versi bahasa Inggris
Dalam lingkungan single-node, plugin biasanya dapat memenuhi kebutuhan melalui status dalam proses, event, atau tugas. Namun, dalam mode cluster, plugin yang sama mungkin berjalan secara bersamaan di beberapa instance, menghadapi masalah-masalah umum berikut:
Inti NocoBase menyediakan berbagai antarmuka middleware pada lapisan aplikasi untuk membantu plugin menggunakan kembali kemampuan terpadu di lingkungan cluster. Bagian selanjutnya akan menjelaskan penggunaan dan praktik terbaik untuk caching, pesan sinkron, antrean pesan, dan distributed lock, disertai referensi kode sumber.
Untuk data yang perlu disimpan dalam memori, disarankan untuk menggunakan komponen cache bawaan sistem untuk pengelolaannya.
app.cache.Cache menyediakan operasi dasar seperti set/get/del/reset, dan juga mendukung wrap serta wrapWithCondition untuk membungkus logika caching, serta metode batch seperti mset/mget/mdel.ttl secara wajar untuk mencegah hilangnya cache saat instance di-restart.Contoh: Inisialisasi dan penggunaan cache di plugin-auth
Jika status dalam memori tidak dapat dikelola dengan cache terdistribusi (misalnya, tidak dapat di-serialize), maka ketika status berubah karena tindakan pengguna, perubahan tersebut perlu diberitahukan ke instance lain melalui sinyal sinkron untuk menjaga konsistensi status.
sendSyncMessage, yang secara internal memanggil app.syncMessageManager.publish dan secara otomatis menambahkan prefix tingkat aplikasi ke channel untuk menghindari konflik channel.publish dapat menentukan transaction, dan pesan akan dikirim setelah transaksi basis data di-commit, memastikan sinkronisasi status dan pesan.handleSyncMessage. Berlangganan pada fase beforeLoad sangat cocok untuk skenario seperti perubahan konfigurasi dan sinkronisasi schema.Contoh: plugin-data-source-main menggunakan pesan sinkron untuk menjaga konsistensi schema di berbagai node
Pesan siaran adalah komponen dasar dari sinyal sinkron dan juga dapat digunakan secara langsung. Ketika Anda perlu menyiarkan pesan antar instance, Anda dapat menggunakan komponen ini.
app.pubSubManager.subscribe(channel, handler, { debounce }) dapat digunakan untuk berlangganan channel antar instance; opsi debounce digunakan untuk menghilangkan debounce, menghindari callback yang sering disebabkan oleh siaran berulang.publish mendukung skipSelf (defaultnya true) dan onlySelf, digunakan untuk mengontrol apakah pesan dikirim kembali ke instance ini.Contoh: plugin-async-task-manager menggunakan PubSub untuk menyiarkan event pembatalan tugas
Antrean pesan digunakan untuk menjadwalkan tugas asinkron, cocok untuk menangani operasi yang memakan waktu lama atau dapat dicoba ulang (retryable).
app.eventQueue.subscribe(channel, { idle, process, concurrency }). process mengembalikan Promise, dan Anda dapat menggunakan AbortSignal.timeout untuk mengontrol timeout.publish akan secara otomatis menambahkan prefix nama aplikasi dan mendukung opsi seperti timeout, maxRetries, dll. Secara default, ini mengadaptasi antrean dalam memori, tetapi dapat dialihkan ke adaptor yang diperluas seperti RabbitMQ sesuai kebutuhan.Contoh: plugin-async-task-manager menggunakan EventQueue untuk menjadwalkan tugas
Ketika Anda perlu menghindari operasi race condition, Anda dapat menggunakan kunci terdistribusi untuk men-serialize akses ke sumber daya.
local berbasis proses. Anda dapat mendaftarkan implementasi terdistribusi seperti Redis; kontrol konkurensi melalui app.lockManager.runExclusive(key, fn, ttl) atau acquire/tryAcquire.ttl digunakan sebagai pengaman untuk melepaskan kunci, mencegah kunci ditahan selamanya dalam kasus pengecualian.Contoh: plugin-data-source-main menggunakan kunci terdistribusi untuk melindungi proses penghapusan field
app.cache, app.syncMessageManager, dll., untuk menghindari implementasi ulang logika komunikasi antar-node dalam plugin.transaction.afterCommit (syncMessageManager.publish sudah terintegrasi) untuk menjamin konsistensi data dan pesan.timeout, maxRetries, dan debounce secara wajar untuk mencegah lonjakan lalu lintas baru dalam situasi pengecualian.Dengan kemampuan di atas, plugin dapat dengan aman berbagi status, menyinkronkan konfigurasi, dan menjadwalkan tugas antar instance yang berbeda, memenuhi persyaratan stabilitas dan konsistensi dalam skenario deployment cluster.