İçeriğe geç
← İşler

Lead-generation SaaS

Bir SaaS platformunun ölçeklenme tavanını kaldırmak

Editörde on eşzamanlı kullanıcı tüm ürünü dakikalarca beklemeye düşürüyordu. O yükü önce izole ettik, sonra kalanı ayrıştırdık; müşteri tabanı mimari sınır olmadan altı katına çıktı.

Dönem
2018 – 2019 · 13 ay
Teslim ettiğimiz
Mimari denetimi, monolit ayrıştırma, AWS göçü, CI/CD ve gözlemlenebilirlik
Çalışma ortamı
7 kişilik ürün ekibinde backend liderliği

Müşteri ve proje adları gizlilik yükümlülüğü gereği paylaşılmıyor. Sektör, ölçek ve sonuçlar teslim edildiği hâliyle aktarılıyor.

300 → ~2.000

İş süresince müşteri hesabı

Dakikalar → yok

Eşzamanlı düzenlemede algılanan yavaşlama

4 servis

Tek monolitten domain güdümlü servisler

VPS → AWS

Altyapı göçü, bağımsız ölçeklenebilir

Bağlam

Site sahiplerinin kod yazmadan site içi popup’lar tasarlayıp hedefleyip yayınlamasını sağlayan self-servis bir SaaS ürünü. Müşteriler tasarımı, içeriği ve gösterim kurallarını bir web panelinde yapılandırıyor, test ediyor, sonra sitelerine tek bir JavaScript dosyası gömüyor; platform yapılandırılan koşulları her ziyaretçiye karşı değerlendirip buna göre render ediyor; yerleşik analitik de bunun bir parçası.

Hedefleme motoru ürünün temel ayrıştırıcısıydı ve 50’ye yakın birleştirilebilir gösterim koşulu destekliyordu: ziyaretçi ülkesi, yönlendiren site, belirli bir sayfaya önceki ziyaretler, belirli bir sayfada kalma süresi, hatta belirli bir sayfadaki belirli bir görselin görüntü alanına girip girmediği.

Problem

Ürün MVP’den hızla tek bir VPS üzerinde monolitik bir uygulamaya büyümüştü; otomatik test, linting ve CI/CD yoktu. Haftalık yayınlar elle yapılıyordu.

Bir darboğaz varoluşsaldı. Editör canlı önizleme sunduğu için kullanıcının yaptığı her değişiklik popup’ın JavaScript paketini yeniden üretiyordu ve kullanıcılar yoğun biçimde iterasyon yapıyordu. Editörde yalnızca 10–15 eşzamanlı kullanıcıyla tüm platform bozuluyor, bekleme süreleri birkaç dakikaya ulaşıyordu; üstelik genel trafik mütevazıydı.

Bu bir performans problemi değildir. Bu, işletmenin kaç müşterisi olabileceğine konmuş bir tavandır.

Yaklaşım

Mimariden önce denetim

Mevcut sistemi denetleyip yapısal zayıflıklar ve teknik borç üzerine resmi bir yazılı rapor ürettik; ardından bunu, ürün yol haritasını bloklamak yerine onunla birlikte yürütülebilecek önceliklendirilmiş, sıralanmış bir uygulama planına çevirdik. Özellik dondurması gerektiren bir ayrıştırma onay almaz, zaten almamalı.

Baskın yükü önce izole et

Monolitin domain güdümlü microservice’lere (kullanıcılar, popup’lar, analitik, raporlama) ayrıştırılmasını yönettik; her servisin bounded context’i, neyi sahiplendiği ve aynı derecede önemli olarak neyi sahiplenmediği açıkça kapsamlandırılarak tanımlandı.

Sıralama, hedef şekilden daha önemliydi. JavaScript üretim yükü önce kendi popup servisine taşındı; böylece platformun baskın yükü, diğer tüm yetenekleri bozmak yerine tek bir yerde sınırlandı. Ardından o servis özel olarak optimize edildi: Redis önbelleği, kuyruk tabanlı işleme, doğru boyutlanmış altyapı. Talep büyüdükçe yatay ve dikey olarak bağımsız ölçeklenebilir hâle getirildi.

Analitik servisi Elasticsearch üzerine kuruldu; raporlama alanına, onu işlemsel veritabanına zorlamak yerine erişim desenlerine uygun bir sorgu motoru verildi.

Altyapı ve teslim

  • Tek VPS’ten AWS’e göçü yürüttük; servisleri seçip her birinin nasıl kullanılacağını tanımladık: EC2, SQS, RDS, ElastiCache, RabbitMQ, S3 ve yük dengeleme.
  • Hiçbiri olmayan bir kod tabanına otomatik test ve linting getirdik ve bunları hatta kalite kapıları olarak yerleştirdik.
  • Docker konteynerleştirmesini ve CI/CD hattını sıfırdan tasarladık; elle yayınların yerini, health-check ve log incelemesiyle doğrulanan, başarısızlıkta tanımlı rollback’i olan otomatik bir build-deploy aldı.
  • Gözlemlenebilirliği kurduk: servis health-check’leri, her servisten merkezi hata logu toplama ve kritik hatalarda uyarı. Bu, ekibe üretim problemlerine dair ilk proaktif görüşü verdi.

Geliştirme ve ekip

  • Hedef mimariyi üretim kodunda gösteren referans implementasyonlar kurduk; standart soyut bir kılavuz değil, izlenecek somut bir şey olarak var oldu.
  • Ödemeleri sağlayıcıdan bağımsız bir soyutlamaya taşıdık. Platform tek sağlayıcı destekliyordu; ikincisini entegre ettik ve bunu yaparken ödeme katmanını ortak bir arayüzün arkasına yeniden yapılandırdık, böylece yeni sağlayıcılar iş mantığına dokunmadan eklenebilir hâle geldi.
  • Backend ekibinde kod incelemesini sahiplendik ve junior geliştiriciye eşli programlama ve inceleme geri bildirimiyle mentorluk yaptık.
  • React frontend’ine backend’le kesiştiği yerde katkı verdik: editör değişikliklerini mesaj kuyruğuna gönderip, kuyruk yanıtları geldikçe oluşan güncellemeleri canlı önizlemeye uygulamak.

Sonuç

  • Platformun merkezi ölçeklenme tavanı kaldırıldı. Daha önce tüm sistemi dakikalarca beklemeye iten eşzamanlı düzenleme, algılanabilir bir yavaşlama olmadan çalıştı ve popup servisi yük arttıkça bağımsız ölçeklenebildi.
  • İş süresince yaklaşık 300’den ~2.000 müşteri hesabına büyüme desteklendi; mimari sınırlayıcı etken olmadı.
  • Platformun tüm kalite ve teslim temeli kuruldu: testler, linting, konteynerleştirme, CI/CD, health-check’li dağıtımlar ve rollback. Öncesinde hiçbiri yoktu.
  • Ödeme entegrasyonu bir geliştirme projesi değil bir yapılandırma meselesi hâline geldi; yeni sağlayıcılar ve pazarlar ucuza açıldı.
  • Ekibe net servis sınırları, dokümante edilmiş mimari yön ve çalışan referans implementasyonlar bırakıldı.