Mühendislik8 Mart 202612 dk okuma

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

10M+

Saklanan sorun

50ms

Ort. sorgu süresi

99.99%

Çalışma süresi

3x

Verimlilik artışı

Mimari Derinlemesine İnceleme

SetGet'i her ölçekte hızlı yapan dört temel direk.

Kendi Altyapınız
MongoDB
Veritabanı
ONLINE
Redis
Önbellek
ONLINE
MinIO
Depolama
ONLINE
React
Önyüz
ONLINE
SetGet API
REST · WS · gRPC
Bağlı
Sağlıklı
%99.99 uptime · son 90 gün

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.

1

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.

2

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ü.

3

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ü.

4

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.

5

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.

1

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.

2

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.

3

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ı

Ortalama Sorgu Süresi
Önce

450ms

Sonra

50ms

API Verimi
Önce

1K istek/sn

Sonra

3K istek/sn

Örnek Başına Bellek
Önce

8 GB

Sonra

3 GB

Hızı Kendiniz Deneyimleyin

Milyonlarca sorunu yöneten ekiplerin performans için neden SetGet'e güvendiğini görün.