Bu belge AI tarafından çevrilmiştir. Herhangi bir yanlışlık için lütfen İngilizce sürümüne bakın
Tek düğümlü bir ortamda, eklentiler genellikle süreç içi durum, olaylar veya görevler aracılığıyla gereksinimleri karşılayabilir. Ancak, küme modunda, aynı eklenti birden fazla örnekte eş zamanlı olarak çalışabilir ve aşağıdaki tipik sorunlarla karşılaşabilir:
NocoBase çekirdeği, küme ortamında eklentilerin birleşik yetenekleri yeniden kullanmasına yardımcı olmak için uygulama katmanında çeşitli ara katman yazılımı arayüzleri sağlar. Aşağıda, önbellekleme, senkron mesajlaşma, mesaj kuyrukları ve dağıtılmış kilitlerin kullanımını ve en iyi uygulamalarını kaynak kod referanslarıyla birlikte inceleyeceğiz.
Bellekte saklanması gereken veriler için, sistemin yerleşik önbellek bileşenini kullanmanız önerilir.
app.cache aracılığıyla edinin.Cache, set/get/del/reset gibi temel işlemleri sunar ve önbellekleme mantığını kapsüllemek için wrap ve wrapWithCondition'ı, ayrıca mset/mget/mdel gibi toplu yöntemleri de destekler.ttl (yaşam süresi) ayarlamanız önerilir.Örnek: plugin-auth içindeki önbellek başlatma ve kullanımı
Bellekteki durum dağıtılmış bir önbellek ile yönetilemiyorsa (örneğin, serileştirilemiyorsa), durum kullanıcı eylemleri nedeniyle değiştiğinde, durum tutarlılığını korumak için bu değişikliğin senkron bir sinyal aracılığıyla diğer örneklere bildirilmesi gerekir.
sendSyncMessage'i zaten uygulamıştır. Bu yöntem dahili olarak app.syncMessageManager.publish'i çağırır ve kanal çakışmalarını önlemek için kanala otomatik olarak uygulama düzeyinde bir önek ekler.publish bir transaction belirtebilir ve mesaj, veritabanı işlemi tamamlandıktan sonra gönderilerek durum ve mesaj senkronizasyonu sağlanır.handleSyncMessage'i kullanın. Bu, beforeLoad aşamasında abone olunarak yapılandırma değişiklikleri ve şema senkronizasyonu gibi senaryolar için oldukça uygundur.Örnek: plugin-data-source-main senkron mesajları kullanarak birden çok düğümde şema tutarlılığını korur
Mesaj yayınlama, senkron sinyallerin temel bileşenidir ve doğrudan da kullanılabilir. Örnekler arasında mesaj yayınlamanız gerektiğinde bu bileşeni kullanabilirsiniz.
app.pubSubManager.subscribe(channel, handler, { debounce }) örnekler arasında bir kanala abone olmak için kullanılabilir; debounce seçeneği, tekrarlanan yayınlardan kaynaklanan sık geri aramaları önlemek için kullanılır.publish, mesajın mevcut örneğe geri gönderilip gönderilmeyeceğini kontrol etmek için skipSelf (varsayılan olarak true) ve onlySelf seçeneklerini destekler.Örnek: plugin-async-task-manager görev iptal olaylarını yayınlamak için PubSub kullanır
Mesaj kuyruğu, uzun süreli veya yeniden denenebilir işlemleri yönetmek için uygun olan eş zamansız görevleri planlamak için kullanılır.
app.eventQueue.subscribe(channel, { idle, process, concurrency }) ile bir tüketici tanımlayın. process bir Promise döndürür ve zaman aşımlarını kontrol etmek için AbortSignal.timeout kullanabilirsiniz.publish otomatik olarak uygulama adı önekini ekler ve timeout, maxRetries gibi seçenekleri destekler. Varsayılan olarak bellek içi kuyruk adaptörünü kullanır, ancak gerektiğinde RabbitMQ gibi genişletilmiş adaptörlere geçiş yapılabilir.Örnek: plugin-async-task-manager görevleri planlamak için EventQueue kullanır
Yarış koşullarını önlemeniz gerektiğinde, bir kaynağa erişimi serileştirmek için dağıtılmış bir kilit kullanabilirsiniz.
local adaptörü sunar. Redis gibi dağıtılmış uygulamaları kaydedebilirsiniz; eş zamanlılığı app.lockManager.runExclusive(key, fn, ttl) veya acquire/tryAcquire aracılığıyla kontrol edin.ttl, istisnai durumlarda kilidin süresiz olarak tutulmasını önlemek için bir güvenlik önlemi olarak kilidi serbest bırakmak için kullanılır.Örnek: plugin-data-source-main alan silme sürecini korumak için dağıtılmış bir kilit kullanır
app.cache ve app.syncMessageManager gibi birleşik yetenekleri kullanın.transaction.afterCommit (syncMessageManager.publish içinde yerleşik olarak bulunur) kullanmalısınız.timeout, maxRetries ve debounce değerleri ayarlayın.Bu yetenekler sayesinde eklentiler, farklı örnekler arasında durumu güvenli bir şekilde paylaşabilir, yapılandırmaları senkronize edebilir ve görevleri planlayabilir, böylece küme dağıtım senaryolarının kararlılık ve tutarlılık gereksinimlerini karşılayabilir.