PostgreSQL bağlantı havuzu: üretimde bağlantı tükenmesini önleme
Npgsql ile .NET uygulamalarında bağlantı havuzunun nasıl yapılandırılacağını ve birden fazla uygulama örneği çalıştığında PostgreSQL'in bağlantı sınırının nasıl aşılmadan planlanacağını anlatan bir rehber. Havuz boyutunun tek bir örnek değil tüm dağıtım üzerinden hesaplanması gerektiğini vurguluyor.
Kilit noktalar
- Npgsql'de bir NpgsqlDataSource oluşturup uygulama boyunca yeniden kullanın; her istekte yeni veri kaynağı açmayın.
- Toplam bağlantı üst sınırı, örnek sayısı × Maximum Pool Size ile hesaplanır; ölçeklendirmeyi bu hesaba dahil edin.
- max_connections değerini servisler, arka plan işçileri ve yönetim işlemleri arasında bütçelendirin ve bir miktar boş pay bırakın.
- Bağlantıları await using ile kapatın; havuzdan alınan ama dispose edilmeyen bağlantılar havuzu tüketir.
- pg_stat_activity üzerinde state ve application_name'e göre gruplama yaparak hangi servisin bağlantıları tükettiğini görün.
- PgBouncer gibi sunucu tarafı havuzlayıcıyı yalnızca uygulama tarafı havuzu yetersiz kaldığında ekleyin; transaction pooling oturum durumunu korumaz.
Üretimde PostgreSQL bağlantı tükenmesi genellikle trafik arttığında, arka plan işçileri paralel çalıştığında veya birden fazla uygulama örneği aynı anda bağlandığında ortaya çıkar. Her havuzun kendi sınırına uyması, toplam bağlantı sayısının veritabanı kapasitesini aşmayacağı anlamına gelmez; örnek sayısı çarpanı tek başına bu toplamı büyütür.
Yazı, NpgsqlDataSource'un bir kez oluşturulup yeniden kullanılmasını, Maximum Pool Size ve Minimum Pool Size gibi bağlantı dizesi ayarlarını ve max_connections değerine göre servis bazında bütçe ayırmayı anlatıyor. Ayrıca pg_stat_activity ile bağlantı kullanımını izleme, application_name ile sahipliği belirleme ve açık kalan bağlantıları await using ile önleme konularına değiniyor. Son bölümde PgBouncer gibi sunucu tarafı havuzlayıcıların ne zaman gerektiği ve transaction pooling'in oturum durumu üzerindeki kısıtları ele alınıyor.
Gerçek dünyada kullanımı
- Üç API ve bir arka plan işçisinin aynı PostgreSQL sunucusunu paylaştığı bir üretim ortamında bağlantı bütçesi planlamak.
- Trafik artışında 'too many connections' hatası veren bir ASP.NET Core servisinde havuz ayarlarını ve sızıntıları incelemek.
- Yatay ölçeklenen konteyner tabanlı bir sistemde havuz boyutunu örnek sayısına göre sınırlamak.
Neden önemli
Yatay ölçeklendirme, aynı pool ayarını olduğu gibi bıraksanız bile veritabanındaki toplam bağlantı sayısını katlar. Bağlantı sayısını örnek sayısı üzerinden hesaplamak, üretimde kesinti yaşamadan kapasite planlamanın temelidir.