PRODEgemen Avrupa BaaS platformuKontrol Panelini Aç →

Performans · 11 dk. okuma

PostgREST: üretimde referans ve gerçek sınırlar

Affane Daylami · Fondateur · 18 Mayıs 2026

Bloga geri dön

PostgREST'in kendisi neredeyse hiçbir zaman darboğaz değildir. Özel Aurabase bulut sunucularında bir kopya, 50 ila 250 milicore CPU ve 64 ila 128 MB RAM ile çalışır. HTTP isteklerini SQL'e çeviren hafif bir Haskell ikili programıdır, başka bir şey değil. Üretimde ortaya çıkan gerçek sınırlar başka yerlerdedir. Bunlardan dördü en sık karşımıza çıkıyor: kopyalarının tükettiği Postgres bağlantıları için bütçe ve MVCC kapsamındaki kesin COUNT maliyeti. Her şema geçişinden sonra bir gecikme penceresi olabileceği gibi, yanıt kesilmesi de başlıklarda görünmez kalabilir.

Bu İngilizce metin, Fransızca orijinalinden otomatik olarak oluşturulmuştur ve henüz incelenmemiştir.
Bu sayfa otomatik olarak çevrildi. İngilizce versiyonu yetkilidir.

PostgREST uyumluluğu hakkındaki makalemiz, sunucunun işlevsel olarak neleri kapsadığını (filtreler, yerleştirme, RPC, RLS) ve size neleri bıraktığını ayrıntılarıyla anlatır. Bu başka bir yerden geliyor. Aurabase kodu ve resmi PostgREST belgelerini kaynak olarak kullanarak, PostgREST'in gerçekte nerede ve neden durakladığını belgeliyor. Burada kendimiz çalıştırmadığımız bir yük bankasını yeniden üretmiyoruz. kıyaslama metodolojimiz, yayınlanmış bir protokol olmadan izole edilmiş bir rakamın neden bize güvenilir görünmediğini açıklıyor.

Temeller

  • PostgREST'in kendisi hafiftir: Özel Aurabase bulut sunucularında kopya başına 50 - 250 milicore CPU, 64 - 128 MB RAM. Ham HTTP verimi neredeyse hiçbir zaman üretimde sınırlayıcı faktör değildir.
  • Gerçek tavan Postgres bağlantı bütçesidir: PGRST_DB_POOL × kopyalar. Aurabase koduyla doğrulanmıştır: Özel düzeyde (10×2) proje başına 20 bağlantı, paylaşılan düzeyde (2×2) 4 bağlantı. Bu, aynı max_connectionsüzerine daha fazla kiracı sığdırmak için kasıtlı bir seçimdir.
  • Prefer: count=exact büyük tablolarda pahalı MVCC taramasını zorlar. PostgREST iki daha ucuz alternatifi belgeliyor: count=planned ve count=estimated, yaklaşık toplam maliyet.
  • Bir db-max-rows tavanı (Aurabase'de varsayılan olarak 1000 satır), bir yanıtı Content-Range'de rapor etmeden keser (gerçek koşullarda ölçülür, aşağıda ayrıntıları verilmiştir).
  • DDL geçişinden sonra PostgREST şema önbelleği eşzamansız olarak yeniden yüklenir. Aurabase ağ geçidi, vazgeçmeden önce 8 defaya kadar (en kötü durumda kümülatif olarak yaklaşık 3,5 saniye) yeniden dener; bu, doğrudan kodda belgelenen bir davranıştır.
#
Metodoloji

PostgREST karşılaştırma ölçütü neyi ölçer ve neyi ölçmez?

PostgREST'teki bir HTTP çıktı testi esas olarak Postgres'i ölçer, nadiren PostgREST'i ölçer. Sunucu, tabanın önünde ince bir çeviri katmanıdır. Gerçek dünyadaki yüklerin büyük çoğunluğunda yanıt süresine, onu oluşturan süreç değil, yürütülen SQL sorgusu hakimdir.

PostgREST projesi, GitHub üzerinde bu konu için özel bir depo tutar: PostgREST/postgrest-benchmark; bu, yalıtılmış bir pazarlama rakamı yayınlamak yerine sürümden sürüme üretim değişimlerini izler. Burada ne gerçekleştirdik ne de yeniden yayınladık. Sonuçları, donanıma, şematik boyuta ve test edilen senaryoya, yani kendi kıyaslama protokolümüzün bir rakamı belirtmeden önce belgelenmesini gerektirdiği değişkenlere bağlıdır.

PostgREST'in altında, gerçekten önemli olan katmanı ölçen pgbench bulunur: Eş zamanlı yük altında SQL işlem süresi. Bu, resmi PostgreSQL kıyaslama aracıdır (postgresql.org/docs/current/pgbench.html, 24 Ağustos 2026'da erişildi). Bu protokolü burada tekrarlamak yerine, bu makale PostgREST'in üretimdeki dört somut mimari sınırlamasını belgeliyor; bunların her biri Aurabase kaynak kodunda veya resmi proje belgelerinde doğrulanıyor.

#
Giriş kodu

Aurabase'deki bir PostgREST örneğinin gerçek kapladığı alan

Her Aurabase Postgres motoru projesi, kümesiyle aynı konumda bulunan iki özel PostgREST kopyası alır. Bunları dağıtan Kubernetes manifestosu mütevazı kaynaklar belirler.

50-250m
KOPYA BAŞINA CPU
istekler → sınırlar
64-128
KOPYA BAŞINA MB RAM
istekler → sınırlar
2
PROJEYE GÖRE KOPYALAR
yüksek kullanılabilirlik (P22)

Bu kopyaların gerçekte tükettiği şey CPU değildir: bunlar Postgres birinciline olan bağlantılardır. Her PostgREST örneği, kiracı için dağıtılan PgBouncer havuzlayıcısından geçmeden doğrudan birincil sunucuya (-rw) bağlanır. Bu seçim, PostgREST uyumluluğuhakkındaki makalemizde zaten ayrıntılı olarak açıklanmıştır: LISTEN/NOTIFY şema yeniden yükleme mekanizması, işlem modundaki bir havuz oluşturucuyla uyumlu olmayan kalıcı bir bağlantı gerektirir. Bu makale şunu ekliyor: Bağlantılar açısından gerçekte maliyeti ne kadar ve zirveye ulaştığı yerler.

Bu havuzun kopya başına boyutu (PGRST_DB_POOL), her proje için PostgREST bildirimini oluşturan k8s_tenant.rsişlevinde doğrulanan proje düzeyine bağlı olarak kasıtlı olarak farklılık gösterir:

RulmanPGRST_DB_POOL / kopyaKopyalarBağlantılar / uyanmış proje
Özel (premium, A1)10 (PostgREST varsayılanı)220
Paylaşılan (filo, ücretsiz/profesyonel/ekip)2 (Aurabase varsayılanı, düşürüldü)24
deploy/cnpg/tenant-postgrest.yaml (gerçek özüt, provizyon sağlayıcı tarafından ikame edilen değer)yaml
# Birincildeki kopya başına bağlantıların parmak izi.
env:
  - { name: PGRST_DB_POOL, value: "PGRST_DB_POOL_VALUE" }  # 10 (özel) veya 2 (paylaşılan)

Tahsis edilmiş düzeyde kısıtlama gevşetilmiştir: Bir projenin kendi CNPG kümesi vardır, dolayısıyla kendi max_connectionsve yedek komşuları yoktur. Paylaşılan düzeyde, aynı kuruluştan çeşitli projeler tek bir kümeyi paylaşır: aşağıdaki bölümde geliştirilen bağlantı bütçesini belirleyici kılan bu bağlamdır.

#
Gerçek tavan

Bağlantı bütçesi aynı anda kaç kiracının çalıştırılacağına karar verir

Paylaşılan bir Postgres kümesinde, aynı anda etkin olan projelerin sayısını sınırlayan şey HTTP verimi değildir. Bu, mevcut max_connectionsile karşılaştırıldığında PostgREST örneklerinin birincilde açık tuttuğu bağlantıların sayısıdır.

Aurabase bu bütçeyi doğrudan fleet.rs: (max_connections − réserve superuser/CNPG − connexions réservées au pooler) ÷ connexions par projet éveilléolarak işaretlenen gerçek küme sınırlarından, 1. kattan alır. Sabit rezerv 10 bağlantıdır (süper kullanıcı, CNPG bulut sunucusu yöneticisi, ölçüm aktarıcısı, hazırlayıcı yönetici marjı). Teslim edilen kusurlara göre (çoğaltma başına 2 havuz, 2 kopya veya uyandırılan proje başına 4 bağlantı), hesaplama, kümenin boyutlandırma düzeyine bağlı olarak üç farklı bütçe verir.

Eş zamanlı aktif projelerin seviyeye göre bütçesi, paylaşılan Postgres kümesiSerbest seviye: 5 eşzamanlı aktif proje (max_connections 50, havuzlayıcı 20). Profesyonel seviye: 7 (max_connections 100, havuzlayıcı 60). Takım seviyesi: 10 (max_connections 200, havuzcu 150). Aurabase kodundan (fleet.rs::derive_wake_budget) türetilen formül, 10 bağlantılık sabit rezerv, uyanık proje başına 4 bağlantı.024681012ücretsiz (max_connections 50)5 projepro (max_connections 100)7 projeekip (max_connections 200)10 proje

Kaynak: fleet.rs::derive_wake_budget ve wake_budget_for_org_planAurabase kodundan türetilmiştir, 24 Ağustos 2026'da yeniden okunmuştur.

Bu bütçe, sahip olunan projelerin kotası değildir: bir team kuruluşu, çoğu atıl durumda olan 50 projeye sahip olabilir. Bu bir eşzamanlılık sınırıdır: birincilde aynı anda açık bağlantıları tutabilen projelerin sayısı. Bütçenin aşılmasıyla uyanma başarısız olmaz; kardeş bir proje aynı dosyada kontrol edilerek uyku durumuna dönene kadar ertelenir. max_connections boyutlandırma konusu, max_connectionsayarı ve tahsis edilmiş ve paylaşımlı taban'de bir bütün olarak tahsis edilmiş/karşılıklılaştırılmış değiş tokuş hakkındaki makalemizde genişletilmiştir.

#
Gizli maliyet

Neden Tercih Edilir: count=exact büyük bir tablodaki sorguyu yavaşlatır

Tam bir toplam istemek, Postgres'i her sorguda filtrelenen sonucun görünür satırlarını saymaya zorlar; bu, ücretsiz bir işlem değil, tabloyla birlikte artan bir maliyettir.

PostgreSQL, herhangi bir indekslenmiş satır sayacını kullanıma hazır tutmaz. MVCC'de bir satırın görünürlüğü onu okuyan işleme bağlıdır. Bu nedenle tam bir COUNT(*) önceden hesaplanmış bir değeri okumak yerine aday satırları ziyaret etmelidir. Bu, kendi yaklaşık sayaçlarını Postgres işlem davranışıyla karşılaştıran ClickHouse gibi analiz sağlayıcıları da dahil olmak üzere Postgres ekosisteminde iyi belgelenmiş bir yapısal sınırlamadır.

terminalbash
# Büyük bir tabloda pahalıdır: filtrelenen sonucun MVCC taramasını zorlar
curl "https://<gateway>/v1/db/<project_id>/orders?status=eq.paid" \
  -H "apikey: <clé>" -H "Prefer: count=exact"

# PostgREST tarafından belgelenen daha ucuz alternatifler
  -H "Prefer: count=planned"   # planlayıcı aracılığıyla tahmin
  -H "Prefer: count=estimated" # bir eşiğin ötesinde planlanmış, tam altında

PostgREST bu üç sayma stratejisini yerel olarak belgelemektedir (postgrest.org, 24 Ağustos 2026'da erişilmiştir). exact stratejisi, tarama fiyatı üzerinden bir toplamı garanti eder. planned sorgu planlayıcıdan neredeyse ücretsiz bir tahmin döndürür. estimated bir eşiğe bağlı olarak ikisi arasında otomatik olarak geçiş yapar. Seçim kozmetik değildir: Birkaç milyon satırdan oluşan bir tabloda count=exact gerektiren bir sayfalandırma, kullanıcı sonuncuya hiç başvurmasa bile her sayfada bu taramanın bedelini öder.

#
Gerçekte ölçüldü

db-max-rows'un kesilmesi count=exact olmadan görünmez

Satır sınırı, açıkça kesin bir toplam talep edilmediği sürece, gövdede veya başlıklarda herhangi bir belirti olmadan PostgREST yanıtını kesebilir. Bunu varsayılan değil, özel bir Aurabase örneğinde gerçek koşullarda ölçtük.

PGRST_DB_MAX_ROWS=5içeren 10 satırlık bir test tablosunda PostgREST v12.2.3, iki farklı durum için tam olarak aynı Content-Range başlığını işler:

Sorguİşlenen çizgilerİçerik Aralığımeta (Aurabase)
?limit=50 (sayısız)5/10 gerçek0-4/*{}
?limit=50&count=kesin5/10 gerçek0-4/10{toplam: 10}

count=exactolmadan, 5 satırın yanıtı, gerçekte yalnızca 5 içeren bir tablodan ayırt edilemez: Content-Range: 0-4/*, hiçbir zaman sınır uygulanmadan, oluşturulan satırları açıklar. Bu durumda, doğrudan Aurabase SDK'nın PostgREST yolunda ölçülen gerçek sınır, hiçbir yerde görünmez.

PostgREST'teki herhangi bir sayfalamanın sonucu

PostgREST dağıtımınız bir db-max-rows ayarlarsa (Aurabase varsayılan olarak 1000'dir), tam sayfayı algılamak için data.length'yi istenen sınırla karşılaştıran bir istemci hatalı olabilir. Hata, sunucu tavanı bu sınırın altına düştüğünde ortaya çıkar. Tek güvenilir sinyal, alınan satır sayısını count=exacttarafından döndürülen total ile karşılaştırmaktır; bu da önceki bölümde açıklanan maliyet dengesini doğrudan devreye sokar.

#
Ertelenmiş gecikme

Taşıma işleminden sonra şema önbelleğini yeniden yükleme

PostgREST, Postgres şemasını başlangıçta bellekte tutar. Bir DDL'den (tablo oluştur, sütun ekle) sonra, yeni rota yanıt vermeden önce bu önbelleğin yeniden yüklenmesi gerekir ve bu yeniden yükleme eşzamansızdır.

Bu pencereye gelen bir yazma işlemi, tablo Postgres tarafında mevcut olsa bile geçici bir 404 (önbellek henüz güncel değil) alabilir. Aurabase ağ geçidi bunu, postgrest_proxy.rsile doğrulanan sınırlı bir yeniden deneme döngüsüyle karşılar: 8 denemeye kadar, artan geri çekilme (250 ms artı deneme başına 100 ms), en kötü durumda kümülatif 3,5 saniye. Bu mekanizma yalnızca yazma işlemlerini etkiler, asla okumayı etkilemez.

Kodun kendisinin belgelediği bir ayrıntı

Ağ geçidi herhangi bir yeniden yükleme sinyali göndermez; yalnızca bekler. Tek gerçek tetikleyici, veritabanı hizmeti tarafından DDL yolunda yayınlanan bir pg_notify('pgrst', 'reload schema')'dir. Bir geçiş yolu bu sinyali göndermeyi unutursa, 8 deneme hiçbir zaman değişmeyecek bir önbellek üzerinde tükenir; bu risk, kod yorumunda olduğu gibi belgelenir, gizlenmez.

Şirket içinde barındırılan PostgREST dağıtımı için ders genelleştirilir. Uygulamanızdaki her DDL yolu, işleme NOTIFY veya bir SIGUSR1 sinyali aracılığıyla yeniden yüklemeyi tetiklemelidir. Aksi takdirde, bir geçiş, dağıtımdan hemen sonra aralıklı hatalar olarak gizlenen bir p99 gecikme artışına neden olur.

#
Özet

Ham iş hacmi değil, mimarinin dilimlediği şey

Burada belgelenen dört sınırlamanın ortak bir yanı vardır: hiçbiri yalıtılmış bir HTTP üretim testinde görülmez, ancak dördü de PostgREST dağıtımının üretime ölçeklenip ölçeklenmeyeceğini belirler.

  • Bağlantı bütçesi: kiracı başına aktarım hızına bakılmaksızın, paylaşılan bir kümede aynı anda etkin olan kiracıların sayısını sınırlar.
  • Kesin COUNT maliyeti: yüke göre değil tabloya göre artar; planned/estimatedile atlanır.
  • Sessiz kesme: doğru şekilde yapılandırılmış bir satır sınırı, yetersiz şekilde düzenlenmiş sayfalamayı yine de bozabilir.
  • Şema yeniden yükleme: her geçişten sonra bir gecikme penceresi; yeniden yükleme sinyali iyi bağlanmışsa sınırlanır, aksi halde sınırsızdır.

İster şirket içinde barındırılan PostgREST, ister Hasura tarzı bir GraphQL katmanı veya özel bir API arasında seçim yapıyor olun, bu dört eksen, yalıtılmış bir istek/s rakamından daha iyi bir karşılaştırma noktasıdır. Karşılaştırmamıza bakın PostgREST vs Hasura vs özel API. Veritabanınızın önünde duran havuzlayıcının seçimi de aynı derecede önemlidir: karşılaştırmamız PgBouncer vs Supavisor vs PgCat PostgREST'in neden işlem modunda bir havuzlayıcıdan geçemediğini ayrıntılarıyla anlatır.

#
Sıkça Sorulan Sorular

SSS

PostgREST büyük ölçekli üretim için yeterince hızlı mı?+
PostgREST'in kendisi hafif bir süreçtir. Özel Aurabase bulut sunucularında, projenin Kubernetes bildiriminde de doğrulandığı gibi, bir kopya 50 ila 250 mili çekirdekli CPU ve 64 ila 128 MB RAM ile çalışır. Ham HTTP verimi neredeyse hiçbir zaman üretimde sınırlayıcı faktör değildir. Her şeyin ölçeklenip ölçeklenemeyeceğini belirleyen yalnızca PostgREST ikili dosyasının hızı değil, Postgres bağlantı bütçesi, tam COUNT maliyeti ve şema önbelleğidir.
PostgREST yanıtımın db-max-rows tarafından kesilip kesilmediğini nasıl anlarım?+
PostgREST tarafından döndürülen Content-Range başlığı bunu asla söylemez. db-max-rows başına 5 satırla sınırlanan bir yanıt, özel bir Aurabase örneğinde gerçek koşullarda ölçülen, gerçekte yalnızca 5 satır içeren bir tablodan ayırt edilemez. Bunu tespit etmenin tek güvenilir yolu, alınan satır sayısını Prefer: count=exact tarafından döndürülen toplamla karşılaştırmaktır, bu başlık olmadan kesme görünmez kalır.
Kesin COUNT her zaman PostgREST isteğini yavaşlatır mı?+
Tercih: count=exact, Postgres'i her sorguda filtrelenen sonucun görünür satırlarını saymaya zorlar; bu, MVCC nedeniyle tablo boyutuyla birlikte artan bir maliyettir. Postgres, dizine alınmış bir satır sayacını kullanıma hazır tutmaz. PostgREST, resmi belgelerinde belgelenen, count=planned (zamanlayıcı aracılığıyla tahmin) ve count=estimated (bir eşiğin ötesine otomatik geçiş) olmak üzere daha ucuz iki alternatif sunar.
PostgREST kaç Postgres bağlantısı tüketir?+
Tamamen PGRST_DB_POOL'un kopya sayısıyla çarpımına bağlıdır. Aurabase koduyla doğrulanmıştır: Özel bir örnek (premium katman) varsayılan olarak kopya başına 10 bağlantı veya 2 kopya üzerinden toplamda 20 bağlantı açar. Paylaşılan düzey, paylaşılan kümenin aynı max_connections bütçesinde daha fazla kiracı barındırabilmek için bu havuzu gönüllü olarak kopya başına 2'ye veya uyandırılan proje başına 4 bağlantıya düşürür.
Resmi bir PostgREST kriteri var mı?+
Proje, GitHub üzerinde ayrı bir pazarlama rakamı yayınlamak yerine sürümden sürüme üretim değişimlerini izleyen özel bir depo olan PostgREST/postgrest-benchmark'ı sürdürüyor. Burada ne gerçekleştirdik ne de yeniden yayınladık. Bu makale, kendi ürettiğimiz bir tezgahı değil, kodumuzdaki ve resmi PostgREST belgelerindeki doğrulanmış mimari sınırlamaları belgelemektedir.
#
Sonuç

Hatırlanması gerekenler

PostgREST tek başına HTTP yükü altında neredeyse hiçbir zaman bozulmaz: mimarisi bunun için çok basittir. Üretimde kesintiye uğrayan şey, onu çevreleyen şeydir: kopyalarının kaç bağlantıyı açık tuttuğu, toplam maliyetin tam olarak ne kadar olduğu. Bu aynı zamanda bir kesmenin görünür kalıp kalmayacağını ve geçişten sonra pencerenin ne kadar süreceğini de içerir.

Bu dört sınırlama Aurabase'e özel değildir: Kendi kendine barındırılan veya yönetilen tüm PostgREST dağıtımları için geçerlidir. Bu kodun gösterdiği şey, çok kiracılı dağıtımın bunları üretimde şaşırtıcı bırakmak yerine nasıl açık hale getirdiğidir.

DAĞITILMAYA HAZIR MISINIZ?

Beş dakika içinde arka ucunuz.

Kredi kartı gerekmez · 500 MB ücretsiz · 50.000 MAU