Connection Pool Bitince Ne Oldu
Bekleyen istek, açık transaction, yeni pod

API 30 saniye 500 verdi. Log: timeout waiting for connection from pool. Max=20 idi, 3 poda 60. Postgres max_connections=100, migration ve admin de orada. Pool'u 50 yapmak 3×50=150 ederdi. Sayı yetmezliği değil, iade etmeme vardı.
Bağlantıyı kim tutuyor
Bir endpoint transaction açıp HTTP ile dış servisi bekliyordu. 800 ms dış çağrı, bağlantı açık. 20 eşzamanlı istek havuzu bitirdi. idle in transaction pg_stat_activity'de göründü; ben önce 'Postgres yavaş' dedim.
await using var connection = await dataSource.OpenConnectionAsync(ct);
await using var tx = await connection.BeginTransactionAsync(ct);
var draft = await LoadDraftAsync(connection, id, ct);
var html = await renderer.RenderAsync(draft.Body, ct); // ağ, bağlantı açık
await SaveHtmlAsync(connection, id, html, ct);
await tx.CommitAsync(ct);
Render'ı transaction dışına aldım. Bağlantı sadece Load/Save'de açılıyor. Pool timeout bitti. pg_stat_activity'de idle in transaction sıfıra yakın. Pool size'ı artırmadım.
Multiplex sandığım şey
Npgsql multiplexing bazı beklemeleri gizler, transaction ve listen'ı gizlemez. 'Havuzu 100 yap' bir pod için çalışır, HPA ile çarpılınca sunucu reddeder. Önce kim iade etmiyor, sonra tavan. Tavan en son.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap