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.