10 Milyon Soruna Nasıl Ölçeklendik
Mühendislik Ekibi
Mühendislik
Ocak 2025'te SetGet, tüm çalışma alanlarında yaklaşık 800.000 sorunu yönetiyordu. Mart 2026'ya gelindiğinde bu sayı 10 milyonu geçti — on dört ayda 12 katlık bir artış. Bu, tek bir uzun süreli kesinti veya sıfırdan yeniden yazma olmadan oraya nasıl ulaştığımızın hikayesi.
Büyüme kademeli değildi. 2025'in ikinci çeyreğinde, her biri göç sırasında yüz binlerce mevcut sorunu getiren üç kurumsal müşteri ekledik. API gecikmemiz 80ms'den 450ms'ye çıktı. Arka plan işleri zaman aşımına uğramaya başladı. Bir çalışma alanındaki her projede toplu sorgular çalıştıran pano, büyük hesaplar için kullanılamaz hale geldi.
İki seçeneğimiz vardı: soruna donanım atarak zaman kazanmak veya bizi 100 milyon soruna taşıyacak mimari değişikliklere yatırım yapmak. İkincisini seçtik ve veri katmanını sıfırdan yeniden inşa etmek için üç ay harcadık — platformu üretimde çalışır halde tutarken.
Rakamlar
Saklanan sorun
Ort. sorgu süresi
Çalışma süresi
Verimlilik artışı
Mimari Derinlemesine İnceleme
SetGet'i her ölçekte hızlı yapan dört temel direk.
MongoDB Parçalama Stratejisi
Çalışma alanı kimliği ve proje kimliğinin bileşik anahtarı üzerinde parçalama yapıyoruz. Bu, tek bir çalışma alanına kapsamlı sorguların — tüm sorguların %98'i — tek bir parçaya ulaşmasını sağlar. Çalışma alanları arası analizler, sıcak yol gecikmesini etkilemeden nihai tutarlılıkla ayrılmış bir okuma replikasında çalışır.
Redis Önbellek Katmanları
Sıcak veri üç katmanlı bir Redis önbelleğinde yaşar: Redis küme 0'da oturum verileri, 60 saniyelik TTL ile küme 1'de sık erişilen sorun özetleri ve küme 2'de kuyruk/yayın-abone. Önbellek isabet oranları ortalama %94'tür, bu da çoğu okuma isteğinin MongoDB'ye hiç dokunmadığı anlamına gelir.
Varlık Depolama için MinIO
Her dosya eki, avatar ve kapak görseli S3 uyumlu işlemler kullanılarak MinIO üzerinden geçer. Önceden imzalanmış URL'ler yüklemeleri doğrudan tarayıcıdan yönetir ve ikili verileri API sunucularımızdan tamamen uzak tutar. Varlıklar bir CDN kenar katmanı üzerinden sunulur.
Go Eşzamanlılık Modeli
API'miz Go ile yazılmıştır ve bu bize iş parçacığı havuzu ayarlaması olmadan istek başına goroutin eşzamanlılığı sağlar. Tek bir API örneği 200MB'ın altında bellekle 3.000'den fazla eşzamanlı bağlantıyı yönetir. Zarif kapatma ve sağlık kontrolleri her servise yerleşiktir.
Temel Optimizasyonlar
Performans üzerinde en büyük etkiye sahip beş değişiklik.
Bileşik İndeks Stratejisi
Her sorguyu denetledik ve sorun koleksiyonları için (workspace_id, project_id, state, priority) üzerinde bileşik indeksler oluşturduk. İndeks kesişimi kapsanan sorgularla değiştirildi — veritabanı sonuçları belgelere dokunmadan doğrudan indeksten döndürür.
Bağlantı Havuzu
MongoDB Go sürücüsü havuzunu varsayılan 100 bağlantıdan yüke göre 50 ile 500 arasında ölçeklenen dinamik bir havuza ayarladık. Bağlantı yeniden kullanımı %40 iyileşti ve P99'daki kuyruk gecikmesi 1,2 saniyeden 180 milisaniyeye düştü.
Sorgu Projeksiyonu
Her sorgu artık yalnızca ihtiyaç duyduğu alanları getirir. Daha önce tam sorun belgelerini — açıklama, yorumlar ve etkinlik dahil — döndüren liste uç noktaları artık yalnızca kimlik, başlık, durum, öncelik ve atanan kişiyi döndürür. Yük boyutu %85 düştü.
Toplu İşlemler
Birden fazla sorunu güncelleyen otomasyon eylemleri (toplu durum değişikliği, toplu atama, toplu etiketleme) artık bireysel güncellemeler yerine MongoDB toplu yazma işlemlerini kullanır. 4 saniye süren 200 güncellemelik bir toplu işlem artık 120 milisaniyede tamamlanır.
Statik Varlıklar için CDN
Tüm statik varlıkları — JavaScript paketleri, görseller, yazı tipleri — küresel olarak dağıtılmış bir CDN'ye taşıdık. Web uygulaması için ilk bayta kadar geçen süre, birincil bölgemiz dışındaki kullanıcılar için 800ms'den 100ms'nin altına düştü.
Alınan Dersler
Ölçekleme çalışması sırasında her karara rehberlik eden üç ilke.
Optimize Etmeden Önce Ölçün
Her optimizasyon profillemeyle başladı. Tek bir satır kodu değiştirmeden önce her sorguyu, her işleyiciyi ve her arka plan işini enstrümante ettik. Sezgi, doğru olmaktan çok yanılır — kararları rakamlara bırakın.
Gölgede Göç Edin
Yeni ve eski veri yollarını iki hafta boyunca yan yana çalıştırdık ve sonuçları gerçek zamanlı olarak karşılaştırdık. Gölge okumalar, birim testlerinin kaçırdığı üç uç durumu yakaladı. Ancak gölge doğrulamadan sonra geçiş yaptık.
Kaçış Kapısını Açık Tutun
Her göçün 60 saniyenin altında tetiklenebilecek bir geri alma planı vardı. Hiç ihtiyacımız olmadı ama var olduğunu bilmek daha hızlı ve daha güvenle hareket etmemizi sağladı.
Performans Sonuçları
450ms
50ms
1K istek/sn
3K istek/sn
8 GB
3 GB
Hızı Kendiniz Deneyimleyin
Milyonlarca sorunu yöneten ekiplerin performans için neden SetGet'e güvendiğini görün.