Bu neden önemli?
Sen de bir sunucuya istek atan kod yazıyorsan, hata olunca ne yaptığın önemli. Yanlış kurulmuş bir 'tekrar dene' mantığı, küçük bir sorunu dev bir kesintiye çevirebilir.
Syntax’ın bu haftalık haber bölümünde konuşulan konulardan biri, GitHub’ın büyük kesintisi ve ardından yayımladığı rapordu. Milyonlarca yazılımcının kodu GitHub’da duruyor. O yüzden GitHub durunca dünyanın yarısı da duruyor.
Ne oldu?
GitHub’ın teknoloji direktörü Vlad Fedorov’un 20 Ağustos’ta yayımladığı rapora göre:
- Kesinti 17 Ağustos’ta 7 saat 47 dakika sürdü.
- Web sitesi, giriş yapma (kimlik doğrulama), GitHub Actions, API’ler, pull request’ler, issue’lar ve Copilot etkilendi.
- Sorun, ABD’deki bir veri merkezinde kritik bir altyapı parçasının yoğun trafikte yeterince büyüyememesiyle başladı. Bir kod hatası değil, bir kapasite sorunuydu.
- Bu baskı diğer sistemlere yayıldı ve giriş işlemleri hata vermeye başladı. Buna zincirleme arıza (cascading failure) deniyor: Bir parça düşünce ona bağlı olanlar da düşüyor.
Kurtarmayı zorlaştıran şey: tekrar deneme fırtınası
Raporun en öğretici kısmı burası. Servisler hata verince, istemci tarafındaki kodlar isteklerini otomatik olarak tekrar denedi. Bu da sistem toparlanmaya çalışırken trafiği daha da artırdı.
Bunu şöyle düşün: Bir dükkânın kapısı sıkıştı. İçeri giremeyen yüz kişi her saniye kapıyı yeniden itiyor. Kapıyı tamir etmeye çalışan görevli, bu kalabalık yüzünden kapıya yaklaşamıyor bile. Buna tekrar deneme fırtınası (retry storm) deniyor.
GitHub ne yapacağını söylüyor?
- Servisler arasında tutarlı tekrar deneme sınırları ve tekrar deneme bütçesi (retry budget) kullanmak. Yani belli bir süre içinde en fazla ne kadar tekrar denenebileceğine üst sınır koymak.
- Zaman aşımı sürelerini değişken yapmak, böylece herkesin aynı anda yeniden denemesini önlemek.
- Kritik sistemleri birbirinden ayırmak ve ortak bağımlılıkları azaltmak. Böylece bir parça düşünce her şey düşmüyor.
- Kapasiteyi artırmak: Şirkete göre platform yükünün %58’i artık Microsoft’un Azure bulutunda çalışıyor.
Kendi kodunda ne öğrenebilirsin?
Bir API’ye istek atıp hata aldığında hemen, sonsuza kadar tekrar deneme. Yaygın iyi uygulamalar:
- Üstel bekleme (exponential backoff): Her denemede bekleme süresini artır. 1 saniye, 2 saniye, 4 saniye…
- Rastgelelik ekle (jitter): Bekleme süresine biraz rastgelelik kat. Böylece binlerce istemci aynı anda geri dönmez.
- Bir sınır koy: Birkaç denemeden sonra vazgeç ve kullanıcıya düzgün bir hata göster.
Düşün
- Yazdığın bir uygulamada internet bağlantısı kesilince ne oluyor? Uygulaman sunucuyu “boğuyor” mu?
- Tek bir şirkete (GitHub gibi) bu kadar bağlı olmak bir risk mi? Kodun başka bir yerde de yedeği olmalı mı?