sada

Cineva maliyet incelemesi — 25 Ekim 2026

İnceleme salt okunur yapıldı; canlı ayarlar ve uygulama davranışı değiştirilmedi.
Google Cloud Monitoring, Billing raporu, işlev/servis yapılandırmaları ve yerel
uygulama kaynakları incelendi. Kullanıcı içerikleri veya secret değerleri okunmadı.
MDBList bulgusu ayrıca yayındaki kaynak arşivinden ve servis erişim politikasından doğrulandı.

## Mevcut ölçümler

Ekim başından inceleme anına kadar alınan Monitoring sayaçları:

| Ölçüm | Değer |
| --- | ---: |
| tmdbGateway Cloud Run istekleri | 48.812 |
| tmdbGateway gönderilen ağ verisi | yaklaşık 1,24 GiB |
| Gateway'in ölçülen Cloud Run ağ çıkışındaki payı | %95,7 |
| getMdbListRatings Cloud Run istekleri | 1.671 |
| Firestore belge okumaları | 277.058 |
| Bunun QUERY türündeki bölümü | 260.768 |
| Firestore belge yazmaları | 13.527 |
| Firestore belge silmeleri | 4.770 |

Monitoring ağ sayaçları bütün çıkışları kapsar; faturalandırılan internet çıkışıyla
birebir aynı değildir. Billing raporunda internet çıkışı 1,19 GiB ve indirim sonrası
₺0,51 olarak görünüyor. Güncel toplam ₺6,41; bunun ₺5,89'u geçmiş secret saklama
kullanımı. Bugün yapılan secret temizliği geçmiş kullanım bedelini geri almaz.

Sayaçlar geliştirme, test, içe aktarma ve eski uygulama sürümlerini de kapsar.
Kayıtlı veya günlük aktif kullanıcı başına maliyet ölçülmedi. Bu yüzden bu
toplamları birkaç kullanıcıya bölerek büyüme faturası hesaplamak doğru değildir.
Günlük toplama pencereleri UTC inceleme saatine hizalı 24 saatlik pencerelerdir;
Firestore'un ücretsiz kotasının sıfırlandığı faturalandırma günleriyle aynı değildir.

## 1. Öncelikli düzeltme: MDBList çağrılarını korumak

Canlı `getMdbListRatings` servisinde `allUsers` çağırma izni var. Bu tek başına
Firebase callable işlevleri için olağandışı değildir; ancak canlı kaynak kodunda
`enforceAppCheck: false` ve `handleMdbListRatings` içinde oturum doğrulaması yok.
Kullanıcı/uygulama başına kalıcı istek kotası da bulunmuyor.

Sonuç: Geçerli biçimde hazırlanmış uygulama dışı çağrılar Cloud Run süresi,
veri aktarımı ve MDBList API kotası tüketebilir. Farklı film kimlikleriyle
çağrılar, aynı film için tutulan önbelleği de aşar. Kötüye kullanım gerçekleştiği
iddia edilmiyor; doğrulanan şey korumanın eksik olmasıdır.

Öneri: Uygulamanın misafir kullanım beklentisini koruyarak App Check desteğini
doğrulamak; uygun kimlik doğrulaması ve istek kotası eklemek. App Check'i eski
istemcilerin uyumluluğunu doğrulamadan zorunlu hale getirmemek.

## 2. Büyümede ana çarpan: takipçi başına bildirim

`functions/index.js` içindeki `onUserActivityUpdated`, yeni bir izleme etkinliği
için takipçileri okuyor ve her birinin bildirim koleksiyonuna bir belge yazıyor.
`onUserNotificationCreated`, bu belgeler için ayrıca tercih/cihaz okumaları,
bildirim gönderimi ve teslimat durumu yazması yapabiliyor.

Örnek: Bir kişinin 500 takipçisi varsa tek izleme etkinliği 500 bildirim belgesi
oluşturabilir. 1.000 günlük aktif kullanıcı × 5 etkinlik × 20 takipçi, yalnızca
bildirim oluşturma aşamasında 100.000 yazma/gün demektir. Teslimat durumu,
cihaz okumaları ve asıl kütüphane yazmaları buna dahil değildir. Bu bir senaryo,
mevcut kullanım ölçümü değildir.

Öneri: İzleme etkinliklerini kısa süreli özetlerde birleştirmek, aynı dizi için
art arda bölüm bildirimlerini tekilleştirmek ve bildirim kuyruğunu kontrollü
işlemek. Kullanıcının bildirim tercihlerini ürün davranışını koruyarak olabildiğince
erken değerlendirmek. Toplu yazma kullanmak belge başına ücreti kaldırmaz.

Canlı birinci nesil `onUserActivityUpdated` işlevinde `maxInstances=3000` var.
Diğer birçok ikinci nesil HTTP işlevinde üst sınır 20; credential tesliminde 10.
Bu sınırlar toplam aylık harcama sınırı değildir. Mevcut yük ölçülerek daha düşük
ve işlev bazında uygun üst sınırlar değerlendirilmeli.

## 3. Firestore: sorgu okumaları ve arkadaş akışı

Veritabanı Avrupa `eur3` bölgesinde. Ekim okumalarının yaklaşık %94'ü QUERY türünde.
Bu sayaçlar koleksiyon/ekran bazında dağılım vermiyor; hangi ekranın kaç belge
okuduğu yalnızca bu veriden kesinleştirilemez.

Yerel `FollowService.getFriendsRecentActivity`, beş dakikalık önbellek kaçırıldığında
en fazla 20 arkadaşın profil belgesini okuyabiliyor. Eski profil biçimleri için
kütüphane sorgularına ek dönüş yolu var. Takip özeti okuması da ayrıca devreye girebilir.
Yeni bildirim sağlayıcısı en son 30 kaydı canlı dinliyor ve beş dakika boyunca
bağlantıyı koruyabiliyor. Yeniden bağlantılar ve değişen kayıtlar okuma tüketir.

İyi mevcut önlemler: Kütüphane göstergelerinin çoğu yerel veritabanından besleniyor.
Senkronizasyonda on dakikalık bekleme, değişen belgeleri çekme ve ilk yüklemede
snapshot kullanma desteği var. Sınırsız görünen bazı listelemeler yerel SQLite
üzerinde; bunları Firestore maliyeti olarak saymamak gerekir.

Öneri: Önce gerçek kullanıcı oturumunda sunucu okumalarını ekran/işlem bazında
ölçmek; ardından arkadaş aktivite özetini ve eksik snapshot nedeniyle yapılan tam
yüklemeleri iyileştirmek. Gerçek zaman gerekmeyen ekranlarda kalıcı önbellek ve
sayfalama tercih etmek. Her kullanıcı verisini sürekli canlı dinlemeye çevirmemek.

Firestore ücretsiz hakları: günde 50.000 okuma, 20.000 yazma ve 20.000 silme;
ayda 10 GiB veri çıkışı, 1 GiB saklama. Örneğin kişi başına 100 gerçek sunucu
okuması/gün varsayımıyla 500 aktif kişi okuma hakkını tüketir; 500 okuma/gün
varsayımıyla bu sayı 100 olur. Bunlar kullanıcı başına ölçüm değildir ve başka
sunucu işlemleri için pay bırakmaz.

## 4. TMDB gateway: geçmişin en büyük veri çıkışı, yeni sürümde iyileşme var

Ekim ayında yaklaşık 49 bin gateway isteği ve 1,24 GiB ağ çıkışı ölçüldü.
Ancak 22 Ekim sonrasında gateway kullanımı belirgin düştü. Yerel güncel mobil
kodda normal TMDB çağrıları doğrudan TMDB'ye gidiyor; bellek/disk önbelleği ve
eşzamanlı aynı istekleri birleştirme var. Credential teslimi ayrı korumalı işlev.

Öneri: Kullanıcılardaki sürümleri doğrulamak, eski gateway kullanan istemcileri
güncellemek. Eski istemciler ve içe aktarma bağımlılıkları anlaşılmadan gateway'i
kapatmamak. Ekim toplamını yeni sürümün gelecekteki kullanımına doğrusal taşımamak.

## 5. Google Cloud dışında: Cloudinary

Profil ve kapak resimleri Cloudinary'ye doğrudan yükleniyor. Bu trafik Google
Cloud Billing'de görünmez. Cloudinary hesabının güncel kredi kullanımı bu incelemede
okunmadı; ücretli planı veya aşım bedeli hakkında sonuç çıkarılmadı.

Yerel kapak seçicide 2.560 piksel ve kalite 98 kullanılıyor; profil kurulumundaki
avatar seçicide 512 piksel ve kalite 85 sınırı var. Büyük kapaklar kullanıcı
sayısıyla birlikte depolama ve resim indirme trafiğini artırabilir. Görselin
ekranda küçük çözülmesi indirilmiş dosyanın da küçük olduğu anlamına gelmez.

Öneri: CDN üzerinde sabit boyutlu avatar/kapak türevleri, uygun kalite/format,
disk önbelleği ve değişen eski görsellerin güvenli temizliği. Yükleme presetlerinin
boyut/tür ve istenmeyen yükleme kısıtları ayrıca kontrol edilmeli.

Cloudinary Free planı 25 kredi sunuyor; 1 kredi 1 GB resim trafiği veya 1 GB
saklama veya 1.000 dönüşüme karşılık geliyor. Bunlar aynı havuzu paylaşır.
Örneğin önbelleğe takılmadan günde toplam 2 GB görsel indirilmesi, 30 günde
yaklaşık 60 GB trafik eder. Hesabın planına göre kota sorunu/plan ihtiyacı doğurur;
otomatik ücret oluştuğu varsayılamaz.

## 6. Harcama uyarısı ve küçük kalemler

Billing'de `10 TL'yi geçince` adlı aylık ₺10 bütçe var; eşikler %50, %90 ve %100.
Harcama sınırı durumu `Not applicable`: bu bütçe uyarı veriyor, servisi otomatik
durdurmuyor. Uyarı ile sert sınır ayrımı korunmalı; servisi durdurmak kullanıcıların
uygulamaya erişimini kesebilir.

Billing'de log saklama 0,17 GiB ve net ücret sıfır. ABD Artifact Registry deposu
yaklaşık 243 MB; temizlik politikası alanı görünmüyor. Şu anda ana maliyet bunlar
değil, fakat sık yayınlanan container arşivleri büyüyebilir. Otomatik temizlik
güncel ve geri dönülebilir sürümleri koruyacak şekilde tasarlanmalı.

ABD `us-central1` backend işlevleri ile Avrupa veritabanı birlikte kullanılıyor.
Bu, büyüyen Firestore erişimlerinde gecikme ve bölgeler arası veri aktarımı açısından
ayrıca değerlendirilmelidir; mevcut ₺0,51 internet çıkışını buna bağlamak doğru olmaz.

## Önerilen sıra

1. MDBList çağrılarına uyumlu App Check/kimlik doğrulama ve kontrollü kota.
2. Takipçi başına çoğalan bildirimlerin birleştirilmesi ve işlev ölçek sınırları.
3. Gerçek kullanıcı oturumlarında Firestore okuma/yazma ölçümü ve arkadaş akışı optimizasyonu.
4. Cloudinary kredi paneli ve görsel boyutlarının denetlenmesi.
5. Yeni mobil sürümün dağılımı ve eski gateway trafiğinin izlenmesi.

## Resmî kaynaklar

- Firestore ücretlendirme ve ücretsiz kotalar: https://firebase.google.com/docs/firestore/pricing
- Cloud Run fiyatlandırması: https://cloud.google.com/run/pricing
- Cloudinary plan ve kredileri: https://cloudinary.com/documentation/billing_and_plans
- Bütçe uyarılarının davranışı: https://docs.cloud.google.com/billing/docs/how-to/budgets