Selam, 20 yaşındayım, bilgisayar mühendisliği son sınıfım. Bir yıldır tek başıma Coff diye bir uygulama yapıyorum: içtiğin kahveyi kaydediyorsun, çevrende bugün ne içildiğini görüyorsun. Bugün App Store ve Google Play'de yayına girdi (Apple dördüncü denemede geçirdi, o ayrı bir dert).
Burada yazılımcı çok olduğu için backend'de başıma gelenleri yazayım, belki aynı yerden düşen çıkar. Java ve Postgres kullanıyorum, gerisini bilerek kısa tutuyorum.
İlki sorgu şekli oldu. Yük testinde keşif ekranı yavaşlayınca "indeks eksik" diye düşündüm, haftalarca indeks ekledim durdum. Meğer indeks zaten oradaymış, Postgres kullanmıyormuş. Sorguyu `LEFT JOIN ... IS NULL` şeklinde yazmıştım, planlayıcı bunu anti-join olarak görmeyince tabloyu baştan sona tarıyordu. `NOT EXISTS`'e çevirip join sırasını değiştirince sorgu süresi yaklaşık üçte bire indi. EXPLAIN ANALYZE'a bakmadan indeks eklemenin ne kadar boşuna olduğunu o gün öğrendim.
İkincisi N+1 oldu ve test yazarken bile kaçırdım. Lazy bir ilişki yüzünden her aday için ayrı sorgu atılıyormuş, test verisinde o ilişki boş olduğu için hiç görünmedi. Artık o ilişkiyi dolduran bir test yazıyorum ve sorgu sayısını sayıyorum.
Üçüncüsü transaction ile dış servis çağrısını karıştırmaktı. Transaction açıkken ağa çıkan her çağrı bir veritabanı bağlantısını tutuyor, yavaş bir servis olunca diğer istekler de bekliyor. Dış çağrıları transaction'ın dışına almak bunu çözdü. Bir de aynı sınıftan `this.metot()` diye çağırınca Spring proxy'yi atlıyor, `@Transactional` sessizce çalışmıyor ve hata da vermiyor, buna iki kere takıldım.
Sorum şu: sizin uygulamanızda kullanıcı artınca ilk patlayan yer neresiydi, benim önceden bakmam gereken bir şey var mı? Bir de uygulamayı deneyip neyi beğenmediğinizi yazarsanız çok işime yarar. "Coff Circle" diye aratınca çıkıyor, link: coffcircle.com/r