Bir proxy hizmeti tarafından uygulandığında bağlantı havuzu, proxy'nin upstream backend sunucularına kullanıma hazır kalıcı bağlantılardan oluşan bir küme tutması anlamına gelir; böylece bağlantı kurma maliyeti azalır ve kaynak kullanımı iyileşir. Bu mekanizma, birden fazla istemci isteğinin backend hizmetlerine kurulmuş bağlantıları yeniden kullanmasına olanak tanır ve sık bağlantı açıp kapatmanın performansa etkisini hafifletir.
Bağlantı Havuzunun Temelleri
Bağlantı havuzu, bir uygulama veya hizmet tarafından tutulan veritabanı ya da ağ bağlantılarından oluşan bir önbellektir. Hizmet, her istek için yeni bir bağlantı açıp hemen ardından kapatmak yerine havuzdan bir bağlantı ister. Boşta bir bağlantı varsa hizmete verilir. Yoksa, yapılandırılmış üst sınıra kadar yeni bir bağlantı kurulur. İş bittiğinde bağlantı, yeniden kullanılmak üzere havuza geri döner.
Bağlantı Havuzu Neden Gerekli?
Yeni bir TCP bağlantısı kurmanın, TLS handshake yapmanın veya bir backend hizmetine (örneğin bir veritabanına) kimlik doğrulamanın getirdiği maliyet ciddi olabilir. Bu maliyet şunları içerir:
* Gecikme: TCP üç yönlü el sıkışması ve TLS anlaşması için ağ gidiş-dönüşleri.
* Kaynak tüketimi: Kriptografik işlemler için CPU döngüleri, bağlantı durumu için bellek.
* Backend yükü: Her yeni bağlantı, backend sunucusunda kaynak tüketir.
Bağlantı havuzu bu sorunları şöyle çözer:
| Özellik | Havuzsuz | Havuzlu |
|---|---|---|
| Bağlantı kurma maliyeti | Yüksek, istek başına | Düşük, çok sayıda isteğe yayılmış |
| Gecikme | Kurulum maliyeti nedeniyle daha yüksek | Daha düşük, bağlantılar önceden kurulu |
| Kaynak kullanımı | Verimsiz, bağlantılar sık sık açılıp kapanıyor | Verimli, bağlantılar yeniden kullanılıyor |
| Backend dayanıklılığı | Bağlantı fırtınalarına açık | Kontrollü bağlantı limitleriyle korunuyor |
| Verim | Ek yük nedeniyle daha düşük | Azalan ek yük ve hazır bağlantılar sayesinde daha yüksek |
Bağlantı Havuzları Nasıl Çalışır
Tipik bir bağlantı havuzu, bağlantıları çeşitli durumlar ve parametreler üzerinden yönetir:
* Başlatma: Havuz, açılışta minimum sayıda bağlantıyı önceden kurabilir.
* Ödünç alma: Bir hizmetin bağlantıya ihtiyacı olduğunda havuzdan bir bağlantı ister.
* Oluşturma: Boşta bağlantı yoksa ve havuzun maksimum boyutuna henüz ulaşılmamışsa yeni bir bağlantı kurulur.
* Geri verme: Kullanımdan sonra bağlantı havuza döner ve genellikle boşta olarak işaretlenir.
* Doğrulama: Bağlantılar, hâlâ etkin ve sağlıklı olduklarından emin olmak için düzenli olarak doğrulanabilir (örneğin bir PING komutu veya basit bir sağlık kontrolüyle).
* Tahliye: Bayatlamış, bozulmuş veya aşırı uzun süre boşta kalan bağlantılar havuzdan çıkarılır.
Temel işletim parametreleri şunlardır:
* Minimum havuz boyutu: Havuzun her zaman açık tutmaya çalıştığı bağlantı sayısı.
* Maksimum havuz boyutu: Etkin ve boştaki bağlantıların toplamı için üst sınır.
* Boşta kalma zaman aşımı: Boştaki bir bağlantının kapatılmadan önce havuzda kalabileceği süre.
* Bağlantı ömrü: Herhangi bir bağlantının maksimum yaşı; bu süre dolduğunda bağlantı, etkinliğinden bağımsız olarak kapatılır ve yeniden oluşturulur.
* Edinme zaman aşımı: Bir isteğin, bir bağlantı kullanılabilir hâle gelene kadar bekleyeceği maksimum süre.
Proxy'ler ve Bağlantı Havuzu
Bir proxy hizmeti genellikle aracı olarak çalışır: istemcilerden istekleri alır ve bunları upstream backend sunucularına iletir. Bu mimaride proxy'nin kendisi backend hizmetlerinin istemcisi hâline gelir ve bu backend'lerle olan etkileşimlerini optimize etmek için bağlantı havuzundan yararlanabilir.
Upstream İstemcisi Olarak Proxy
Bir istemci proxy'ye bağlandığında, proxy hedeflenen backend'e bir bağlantı kurar veya mevcut bir bağlantıyı yeniden kullanır. Proxy bağlantı havuzu uyguluyorsa, yapılandırılmış her upstream sunucu veya sunucu grubu için kendi bağlantı havuzunu tutar.
Örneğin, birden fazla backend uygulama sunucusuna gelen istekleri işleyen bir HTTP ters proxy'si, her ayrı backend uç noktası için ayrı bağlantı havuzları tutar. Bu sayede proxy, uygulama sunucularına olan kendi bağlantılarını yeniden kullanarak çok sayıda gelen istemci isteğini verimli biçimde karşılayabilir.
Bir proxy'nin istekleri bir backend hizmetine yönlendirecek şekilde yapılandırıldığı bir senaryoyu düşünün:
# Upstream hizmeti için proxy yapılandırma parçası
upstream_service:
hosts:
- backend-server-1:8080
- backend-server-2:8080
connection_pool:
max_connections: 100
min_connections: 10
idle_timeout_seconds: 60
max_lifetime_seconds: 300
Bu yapılandırmada proxy, backend-server-1:8080 için en fazla 100 bağlantılık bir havuzu ve backend-server-2:8080 için en fazla 100 bağlantılık başka bir havuzu yönetir.
Bağlantı Çoğullama ve İstek Yönlendirme
Bir proxy'nin bağlantı havuzunun temel avantajı, istemci isteklerini daha küçük ve kalıcı bir backend bağlantı kümesi üzerinde çoğullayabilmesidir. HTTP/1.1 keep-alive gibi protokollerde, backend'e giden tek bir havuz bağlantısı birden fazla ardışık istemci isteğini karşılayabilir. HTTP/2 veya gRPC gibi protokollerde ise alttaki tek bir TCP bağlantısı, eşzamanlı birden fazla istek akışını taşıyabilir.
Proxy'nin dâhili mantığı, gelen istemci isteklerinin havuzdaki uygun bağlantılara eşlenmesini yönetir. Bir istek geldiğinde:
1. Proxy hedef backend'i belirler.
2. İlgili backend'in havuzundan uygun bir bağlantı alır.
3. İstek iletilir.
4. Backend yanıt verdiğinde bağlantı havuza bırakılır ve başka bir istek için hazır hâle gelir.
Bu çoğullama, backend sunucularında gereken toplam etkin bağlantı sayısını azaltarak ölçeklenebilirliklerini artırır ve kaynak tüketimlerini düşürür.
Havuz Yönetimi ve Backend Sağlığı
Bir proxy'nin bağlantı havuzu, genel sağlık kontrolü ve yük dengeleme mekanizmalarıyla bütünleşik çalışır.
* Sağlık kontrolleri: Proxy, backend sunucularının sağlığını sürekli izler. Bir backend sağlıksız kabul edilirse, havuzdaki o backend'e ait bağlantılar geçersiz olarak işaretlenebilir, boşaltılabilir veya proaktif biçimde kapatılabilir. Sağlıksız backend'lere yeni bağlantı kurulmaz.
* Yük dengeleme: Birden fazla sağlıklı backend varsa, proxy'nin yük dengeleme algoritması bir sonraki isteği hangi backend'in alacağını belirler. Bağlantı havuzu, seçilen backend'de uygun bir bağlantı bulunmasını ya da yenisinin verimli biçimde kurulabilmesini sağlar.
* Bağlantı tahliyesi: Proxy'nin havuz yöneticisi, boşta kalma zaman aşımlarına veya maksimum ömür ayarlarına göre bağlantıların tahliyesini yürütür. Bu, bağlantıların bayatlamasını veya gereksiz yere kaynak tutmasını önler. Ayrıca bağlantıların tazelenmesine yardımcı olarak uzun ömürlü bağlantılardaki sorunları (örneğin backend sunucularındaki bellek sızıntıları veya ağ cihazlarının zaman aşımları) hafifletir.
Yapılandırma Parametreleri ve En İyi Uygulamalar
Etkili bir bağlantı havuzu; backend özelliklerine, ağ koşullarına ve beklenen trafik desenlerine göre parametrelerin dikkatle ayarlanmasını gerektirir.
Temel Havuz Parametreleri
| Parametre | Açıklama | Etkisi |
|---|---|---|
| Maksimum havuz boyutu | Bağlantıların üst sınırını tanımlar. | Çok düşükse kuyruklanmaya ve istek gecikmesinin artmasına yol açabilir. Çok yüksekse backend'i boğabilir ve kaynaklarını tüketebilir. En uygun değer, backend kapasitesine ve beklenen istek eşzamanlılığına bağlıdır. |
| Minimum havuz boyutu | Havuzun sürdürmeye çalıştığı bağlantı sayısı. | Soğuk başlangıçları ve ilk bağlantı maliyetini önler. Çok yüksekse düşük trafik dönemlerinde gereksiz backend kaynağı tüketir. Çok düşükse trafik ani yükseldiğinde toplu bağlantı oluşturmaya yol açabilir. |
