Yüksek kaliteli Ortamlarda Kaynak Havuzları için Singleton Desenini Uygulamayı Uygulayın
Table of Contents
Kaynak Yönetiminin Takma Yöntemi
Eş zamanlı istekler ile çalışan her üretim uygulaması sonunda aynı şişeyle yüzleşiyor: Her istek için sonlu, pahalı kaynaklar verimli bir şekilde nasıl yönetilebilir. Veritabanı bağlantıları, ağ soketleri, işadamları ve API müşterileri, tüm kaynak toplama, kullanım kolaylığı, yüksek çözünürlükte dikkatli yaşam döngüsü gerektirir.
Ortak bir çözüm iki iyi kurulmuş desenleri içerir: AMAFLT:0)Singleton modeli) ve [[Dönemli havuzlar[Dönemler) ve pratik ticaret noktaları, her bir desen farklı bir endişeye kapsadığında, kombinasyonlar ölçeklenebilir, öngörülebilir sistemler için sağlam bir temel sağlar.Bu makale, her iki desenin arkasındaki teoriyi keşfeder, Java ve TypeScript'ta üretim-okuyuşturucu uygulamaları gösterir ve pratik ticaret-off mimarlar, tekton-managed kaynakları dağıtmayı yaparken dikkate almalıdır.
Singleton Desen: Kontrollü Erişim Vakfı
Singleton modeli, bir sınıfın uygulamanın yaşam boyu tam olarak bir örnek oluşturduğunu ve bu örneğin küresel bir erişim noktası sağladığını uygular.In its saf form, pattern control both creation and access, any code road from yanlışlıkla anındaiating a second copy of the resource manager.
Singletons, gizli küresel durumu tanıtmak için sık sık eleştirilir, ancak altyapı endişeleri vemdash'e uygulandığında; bağlantı fabrikaları, iplik havuz yöneticileri veya yapılandırma kayıtları ve mescidleri gibi; uygulama şu anda kullandığı bir kontrol noktası, izleme ve giriş yapmak için basitleştirir ve artık bağımlılık zincirleriyle havuz referanslarını azaltmanız gerekir.
Ancak, Singleton modeli tek hazır kodda önemsiz olan bir gereksinimi ortaya koyar, ancak eşzamanlı sistemlerde karşılıklı olarak bilgilendirilmelidir: singleton örneği tüm threadlere güvenle yayınlanmalıdır. Uygun senkronizasyon olmadan, iki thread, tekrarlanan örnek veya bozulmuş iç devletin farklı eyaletlerini gözlemleyebilir.
Bir Performans Stratejisi Olarak Kaynak Yüzmek
Kaynak havuzları farklı bir probleme hitap eder: kaynak satın alma ve yırtılma maliyeti. Yeni bir veritabanı bağlantısı oluşturmak ağ elhakları, kimlik doğrulama değişimleri ve hafıza tahsisini içerir. Yüksek ücretli bir sistemde, yüzlerce istekte ikinci olarak, yükleme bağlantılarının maliyeti toplam yanıt süresine hükmedebilir.
Bir havuz, ödünç alınan ve yok edilen ve geri dönen bir birincil kaynak koleksiyonu korur. Havuz, hangi kaynakların kullanımında olduğunu takip eder, hangi kaynakların mevcut olduğunu ve kaynakların sabit veya hataları nedeniyle tahliye edilmelidir. Anahtar parametreler ilk havuz boyutunu, en yüksek havuzu içerir, boş zamanı ve evsel politikayı içerir.
Uber ve Netflix gibi şirketlerdeki araştırma, veri toplamanın veri tabanını en üst yük altında % 40-60 azaltabileceğini gösteriyor ve özellikle bağlantı kurma süresini ortadan kaldırarak, havuz mevcut kaynakları yeniden kullanarak patlama trafiğini absorbe ediyor ve aksi takdirde yüzlerce bağlantıyı kapatabilecek şekilde koordineli bir müşteri tarafından kesintiye uğratıldığını gösteriyor.
Tekton ve Kaynak Havuzları
Bir kaynak havuzu ile Singleton modelini birleştirmek, tüm ipliklerin sürekli olarak kullandığı tek bir havuz yaratır. Bu yaklaşım, tekton olmadan, her bileşen kendi havuzunu oluşturabilir, kaynak içeriğine yol açabilir, tekrarlanan bir yük ve öngörülemeyen sistem davranışıyla.
Tekton havuzu üç sorumlulukla ele almalıdır:
- [FONT:0) Güvenli başlangıçlama — havuz bir kez yaratılmalıdır, hatta erişim yöntemine uygun çağrılar altında.
- [FONT:0]Gön güvenli kaynak erişim[[Dönetici:0] vemdash; Borrow ve serbest bırakılma işlemleri veri yarışlarını önlemek için atom veya düzgün bir şekilde senkronize edilmelidir.
- [FONT:0)Yaşam döngüsü yönetimi[Dönetici: 1] — Tekton, sabit bağlantıların ve zarif kapatmanın kaynaklanması gerekir.
Her sorumluluk, performansı, güvenilirliğini etkileyen tasarım kararlarını ve gözlemlenebilirliği sunar.
Singleton Resource Pools'taki Thread Safety
En basit iplik güvenli singleton, ortak öğreticilerde gösterilen bir senkronize erişim yöntemi kullanır. Bu yaklaşım doğru şekilde bir şişenck sunar: havuz örneği satın almak için her çağrı bir kilit alır, hatta ilkleştirmeden sonra bile.
Geliştirilen bir yaklaşım, Java'da, örnek alana yazıp giden tüm ipliklere görünür hale gelir, çift kontrolli ilk kilitleme uygulamaları için senkronizasyonu azaltır ve önbellekli bir alan kullanır.In Java, [[D:0) anahtar kelime, tüm ipliklere göre görünür olmasını sağlar, çift kontrol edilen uygulamaları erken kontrol eden böcekleri önler.
Atomun ilkliğini destekleyen diller için, Java'nın “DÜSÜSÜSÜ:2) delege, uygulama hem güvenli hem de manuel senkronizasyon olmadan performans gösterir.
Alternatif İlkleştirme Stratejileri
İlk erişimde tektonu baştan başlatmadan ziyade, birçok üretim sistemi tercih ediyor:0)eager başlangıç işlemi sırasında genellikle sunucu-side uygulamaları kabul edilebilir olan bir başlangıç zamanı.
Mikro hizmet mimarilerinde yaygın olan üçüncü bir strateji, tekton yaşam döngüsünü yönetmek için bir hizmet taşıyıcısı veya bağımlılık enjeksiyon konteynerini kullanır. Spring, Micronaut veya Quarkus, havuza bağımlı fasulyeye enjekte edebilir ve yaşam döngüsü kancaları aracılığıyla lütuflu bir kapanış sağlayabilir.Bu yaklaşım, havuzları testlerden yönetmesine izin vererek daha kolay test eder.
Üretim-Okuy Java Uygulama
Aşağıdaki örnek, iş parçacığı güvenliğini, performansını ve gözlemlenebilirliği dengelemek için bir kaynak havuzu gösteriyor.Hazırdalık havuz için bir sınırlanmış blok ve süresiz beklemeleri önlemek için bir süre mekanizması kullanır.
Interface Design
public interface Pool<T> {
T borrow() throws InterruptedException, PoolExhaustedException;
void release(T resource);
void invalidate(T resource);
int availableCount();
int borrowedCount();
void shutdown();
}
Bu arayüz, uygulamadan havuz sözleşmesini ayırıyor, farklı stratejilere izin veriyor (bloğa, engellenme, öncelik temelli) ihtiyaçlar olarak takas edilecek.
Core Implementation
public class ResourcePool<T> implements Pool<T> {
private final BlockingQueue<T> available;
private final AtomicInteger borrowedCount = new AtomicInteger(0);
private final AtomicBoolean shutdown = new AtomicBoolean(false);
private final ResourceFactory<T> factory;
private final int maxSize;
public ResourcePool(int coreSize, int maxSize, ResourceFactory<T> factory) {
this.maxSize = maxSize;
this.factory = factory;
this.available = new LinkedBlockingQueue<>(maxSize);
for (int i = 0; i < coreSize; i++) {
available.offer(factory.create());
}
}
@Override
public T borrow() throws InterruptedException, PoolExhaustedException {
if (shutdown.get()) {
throw new PoolExhaustedException("Pool is shut down");
}
T resource = available.poll(5, TimeUnit.SECONDS);
if (resource == null) {
throw new PoolExhaustedException("No resources available within timeout");
}
borrowedCount.incrementAndGet();
return resource;
}
@Override
public void release(T resource) {
if (resource != null) {
available.offer(resource);
borrowedCount.decrementAndGet();
}
}
@Override
public void invalidate(T resource) {
if (resource != null) {
factory.destroy(resource);
borrowedCount.decrementAndGet();
// optionally replenish the pool
}
}
@Override
public void shutdown() {
shutdown.set(true);
available.forEach(factory::destroy);
available.clear();
}
// Accessor methods omitted for brevity
}
Bu uygulama mevcut havuz için bir süre boyunca, bu, bir kaynağın kırılması ve geri dönmemesi için uygun bir teklif ve anket işlemleri sağlar.TheurFLT:6) yöntemi, havuz tükendiğinde, beklemeden işlerden kaçınmayı sağlar.TheurFLT:7, çağrıcılara bir kaynağın kırılması ve geri dönmeleri gerektiğini işaret eder.
Yapı ve Tuning
Havuz performansı üç konfigürasyon parametresine bağlıdır:
- [FONT:0]Core havuz büyüklüğü[Dönetici:0] — Başlangıçta yaratılan kaynakların sayısı. Bu durumu beklenen temel tutarlılık seviyesine ayarlayın.
- [0]Maximum havuz büyüklüğü[Dönetici:0] vemdash; Üst sınır kaynakları üzerinde. alt uç sistemle ilgili en fazla sayıda eşzamanlı işlem için bunu ayarlayabiliyor.
- [FONT:0)Borrow timeout[Dönetici:0] — Bir konu bir kaynak için ne kadar uzun zamandır bekler.Bu, genel işlem için başvuru zamanlarından biraz daha düşük olmalıdır.
Veritabanı bağlantı havuzları için ortak bir başlangıç noktası, uygulama ipliklerinin sayısına ve temelin üzerindeki 10-20% 10'luk maksimum boyuta eşittir. Monitor bağlantı süreleri ve boş havuz büyüklüğü, üretimde ve buna göre ayarlanır.
Java'nın Ötesinde: Diğer Dillerde Singleton Pools
Aynı model ekosistemler arasında geçerlidir, ancak uygulama detayları dil yeterlilikleri ilkellere göre farklıdır.
TipScript / Node.js Örnek
Node.js açık ipliklerden ziyade bir olay döngüsü kullanıyor, ancak kaynak havuzu veritabanı bağlantılarını yönetmek için kritik kalıyor, HTTP müşterileri ve dış API işleriyle uğraşıyor. Node.js'deki tekton modeli doğal olarak modül kalibrasyonu ile destekleniyor: bir havuz örneği tüm süreç için tekton olarak çalışır.
import { createPool, Pool } from 'generic-pool';
const factory = {
create: async () => {
const client = await createDatabaseClient();
return client;
},
destroy: async (client) => {
await client.close();
}
};
const pool = createPool(factory, {
min: 5,
max: 20,
acquireTimeoutMillis: 3000,
idleTimeoutMillis: 30000
});
export default pool;
Bu modül seviyesi tekton, her ithalatın aynı havuz örneğini aldığını garanti eder.TheurFLT:9) Kütüphane iç senkronizasyonu, kaynak doğrulamayı ve evlendirme mantığını idare eder. Borrowers OLFLT:10). ve havuzla etkileşime girmek için kullanılır.
Node.js ortamlarda, tekton havuzu, Java'da aynı faydaları sağlar: merkezileştirilmiş kaynak yönetimi, bağlantı yükü azaltılır ve alt üst düzey hizmetler üzerinde kontrol edilir. birincil fark, işlemlerin gerçek bir / bekleme kalıpları ile değiştirilmesidir ve zamanout işlemi söz yaşam döngüsünin bir parçası haline gelir.
Ortak Pitfalls ve Them'dan Nasıl Kaçırmak
İyi basitleştirilmiş tekton havuzları bile üretimde başarısız olabilir. Başarısız modları inşa etmek için gereklidir.
Unreturned Kaynaklardan Bellek Leaks
Çoğu şüpheli konu bir konu bir konu satın aldığında meydana gelir, ancak geri dönmez. Bu, istisnalar, erken geri dönüşler veya geliştirici gözetimi nedeniyle olabilir. Zamanla, havuz sıfıra gider ve sonraki tüm istekler blok veya zaman dışarı çıkar.
- BÖRTÜNÜŞÜNÜŞÜNÜŞÜNÜ (Java) veya [[DÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜ (C#, TypeSenarya)
- Otomatik olarak yakın veya elden geri dönen proxy nesnelerdeki yuvarlanma kaynakları
- Sonlu engellemeyi önlemek için maksimum satın alma süresi ayarlama süresi
- Kaynakları periyodik sağlık kontrolleri yoluyla algılamayı uygulama
Havuz Eğlenme ve Cascading Başarısızlık
Havuz maksimum boyutuna ulaştığında, yeni talepler beklemeli veya başarısız olmalıdır. alt uç sistem yavaşsa, iplikler kaynakları daha uzun süre tutabilir, bu bir cascade yaratabilir: havuz egzozları, talep süresi, müşteriler yeniden deneme, ve yeniden yazılabilir.
Havuz egzozunu azaltmak için, uygulayın:
- Son zamanlarda engellemeden ziyade açık bir hatayla hızlı-fail davranışı
- Başarısız bir aşağı uçak için istek göndermeyi durdurmayı engelleyen devre kalıpları
- Dinamik havuz, ağır yük altında büyüyebilen ve boş dönemler sırasında küçültülebilir
Stale Resource
Veritabanı bağlantıları gibi kaynaklar ağ bölümleri, güvenlik zamanları veya sunucu-yaka ayrımları nedeniyle durulabilir. Boş kaynakları geri dönen bir havuz, teşhis etmek zor olan geçici başarısızlıklara neden olur. Solutions şunları içerir:
- Onları bir borç verene geri dönmeden önce kaynakları doğrulama
- Koşu süresiz ev ödevi bu test boş kaynakları alır ve başarısız olanları ortadan kaldırır.
- Bu otomatik olarak çok uzun zamandır boş olan kaynakları yok eden bir boş zaman ayarlayın
Performans Benchmarks ve Real-World Influence
Birçok üretim vaka çalışmaları tekton yönetilen kaynak havuzlarının değerini doğrulamaktadır. İyi niyetli bir örnekte, finansal hizmetler uygulama veritabanı bağlantılarını % 62 azalttı ve bağlantı ile ilgili zaman aralıklarını tekton-managed bir havuza geçiş yaparak ortadan kaldırdı.
Performans artışı iki kaynaktan geliyor. Birincisi, bağlantı fırtınaları tarafından boğulan veritabanını oluşturmakta ve bağlantı fırtınaları ile kesintiye uğratmaktadır.İkinci olarak, havuz doğal bir yük seviyesi olarak hareket eder ve veritabanını bağlantı fırtınaları ile kesintiye uğratmayı önler.
Tipik bir bağlantı havuzu uygulama şovunu işaret ediyor:
- Ortalama ödünç süresi: 0.3 milisaniye (barış) vs. 85 milisaniye (yeni bağlantı)
- Yüzde 99'u ödünç zaman: 1.2 milisaniye (parça) vs. 320 milisaniye (yeni bağlantı)
- CPU eki: azalan bağlam geçiş ve çöp toplama nedeniyle% 40 daha düşük
Bu rakamlar havuzun yüksek kod sistemlerinde standart bir model olduğunu ve bu havuzların tekton yönetimi tutarlılığı korumak için kritik olduğunu göstermektedir.
Sonuç: Singleton Resource Pooling Kullanırken
Singleton deseninin ve kaynak havuzunun kombinasyonu güçlü bir mimari araçtır, ancak bu yaklaşımı evrensel olarak uygun değildir:
- Kaynakların yaratmak ve yok etmek pahalı
- Birden fazla bileşen veya iplikler sonlu bir kaynak kümesine uygun bir erişime ihtiyaç duyar
- Kaynak kullanımı üzerinde merkezileştirilmiş izleme ve kontrol gerektirir
- Downstream sistemleri yük seviyesinden ve throttling ile bağlantıdan yararlanır
Kaynakların oluşturmak için ucuz olduğu zaman tekton havuzlarından kaçının, mimarlık zaten bağlantıları yöneten bir hizmet örgüsü veya yankar kullanır veya çok katmanlı bir sistemde kiracıları izole etmeniz gerektiğinde (Onant başına ayrı havuzlar tercih edilebilir).
Üretim havuz stratejileri hakkında daha fazla okuma için, dağıtılan sistemlerde Singleton deseni[Döneticileri için] [Döneticileri üzerinde yer alan dersler için [Döneticileri # 1 ) ve [[Döneticileri için|Döneticileri ve önerileri ile ilgili bilgi ve önerileri sunar.
Sonuçta, tekton kaynak havuzu, öngörülebilir gecikme ve kaynak kullanımı devam ederken ikinci kez binlerce talepte bulunan kanıtlanmış bir modeldir.