Futbol Uygulamam Maç Günü Başlayana Kadar Kusursuz Çalışıyordu

Bir futbol uygulaması geliştirmek ilk başta kolay görünüyordu.

Maçları çekmeyi, takımları göstermeyi, skorları göstermeyi ve her birkaç saniyede bir yenilemeyi planladım. Test aşamasında sorunsuz çalışıyordu. İki sekme ve birkaç örnek maç kullandım. Her şey yolunda görünüyordu.

Sonra ilk yoğun maç günü geldi.

Yüzlerce kullanıcı uygulamayı aynı anda açtı. İstekler üst üste bindi. Bazı skorlar geriye gidiyor gibi görünüyordu. Uygulama, her bir ziyaretçi için aynı verileri ayrı ayrı çekiyordu.

Canlı bir uygulamanın sadece bir API'ye bağlı bir web sitesi olmadığını öğrendim. O, bir veri senkronizasyon sistemidir.

İşte yaptığım hatalar ve bunları nasıl düzelttiğim:

  • Sadece istemci tarafı (client-side) polling işleminden kaçının İlk versiyonumda her tarayıcı her beş saniyede bir veri istiyordu. 1 kullanıcı = dakikada 12 istek. 1.000 kullanıcı = dakikada 12.000 istek. İsteklerin çoğu tam olarak aynı veriyi talep ediyordu.

  • Sunucu tarafı (server-side) istekleri kullanın API çağrılarını sunucuya taşıdım. Bu size şunlar üzerinde kontrol sağlar: • API kimlik bilgileri • Önbelleğe alma (Caching) • Hız sınırlama (Rate limiting) • Hata yönetimi • Yanıt formatlama

Anahtarları (keys) asla istemci tarafı kodunda kullanmayın. Birisi anahtarınızı çalarsa bu hem güvensiz hem de maliyetli olur.

  • Bir eşleme katmanı (mapping layer) oluşturun Ham API verilerini doğrudan bileşenlerime (components) aktarmayı bıraktım. Eğer sağlayıcı bir alan adını değiştirirse, arayüzüm (UI) bozuluyordu. Artık sağlayıcı verilerini önce kendi dahili formatıma eşliyorum. Bu, arayüzümü kararlı tutuyor.

  • Hız için Server Components kullanın Bir yükleme ekranı göstermek yerine, ilk maçları sunucuda yüklüyorum. Kullanıcı içeriği anında görüyor.

  • Akıllı polling uygulayın Canlı maç yoksa uygulama yenilenmemelidir. Maçlar bittiğinde polling işlemini durdurmak için bir kontrol ekledim. Bu, muazzam miktarda sunucu kaynağı tasarrufu sağlıyor.

  • Yarış durumlarını (race conditions) düzeltin Bazen B İsteği