650.000.000 onay kutusunu işaretlemek: beklenmedik popülerlikle başa çıkmak
26 Haziran 2024'te One Million Checkboxes (OMCB) web sitesi yayına alındı
- 1 milyon küresel onay kutusuna sahip bir site; bir onay kutusunu işaretlediğinizde bu değişiklik tüm kullanıcılara anında yansıyor
- Yayına alındıktan sonraki 30 dakika içinde binlerce kullanıcı milyonlarca onay kutusunu işaretledi
- Hacker News, /r/InternetIsBeautiful, Mastodon, Twitter gibi yerlerden trafik geldi
- Washington Post ve New York Times'ta da yer aldı
- İlk gün 50 milyondan fazla onay kutusu işaretlendi
- Site kapatılmadan önceki 2 hafta boyunca 650 milyondan fazla onay kutusu işaretlendi
Orijinal mimari
- Onay kutusu durumu 1 milyon bit (125KB) olarak saklanıyordu
- İstemci, onay kutularını render etmek için bir bitset kullanıyor ve işaretleme durumunu sunucuya bildiriyordu
- Sunucu, bitleri güncellemek ve tüm istemcilere yayınlamak için Redis kullanıyordu
- Statik içerik nginx üzerinden sunuluyor, bitset durumu ve WebSocket bağlantıları ise Flask sunucusu üzerinden işleniyordu
- Redis hem durum saklama hem de mesaj kuyruğu görevini üstleniyordu
Ölçeklendirme ilkeleri
- Maliyet sınırı: iflas etmemek için maliyet matematiksel olarak hesaplanarak serverless yerine ölçeklenme tercih edildi
- Kısa vadeli çözümleri kabul etmek: sitenin popülerliğinin geçici olacağı varsayıldı ve hızlı çözümler seçildi
- Basit ve self-hosted teknolojiler kullanmak: yalnızca doğrudan çalıştırılabilen ve debug edilebilen teknolojiler eklendi
- Eğlenceyi ön planda tutmak: para kazanmaktan çok eğlenceye öncelik verildi
- Küresel yapıyı korumak: tüm kullanıcıların değişiklikleri anında görebilmesi için küresel durum korundu
İlk gün: patlayıcı büyüme
- 30 dakika içinde sunucu yükü hızla arttı
- Yükü dağıtmak için ek sunucular ayağa kaldırıldı
- Redis bağlantı sorunlarını çözmek için batch update yaklaşımı getirildi
- Digital Ocean'ın yönetilen Redis instance'ı yükseltildi
Gece boyunca bir plan yoktu
- ITP kampında yüz tanımalı Pacman oyununu sergilemek için plan yapıldı
- Bir iPad götürülerek oradan sunucular ayağa kaldırıldı
- Sunucu adlandırma kuralı zamanla gelişti ve 8 worker VM çalıştırıldı
- Yükü azaltmak için Flask process sayısı düşürüldü ve update batch boyutu artırıldı
Bant genişliği sorunu
- Digital Ocean'ın bant genişliği fiyatlandırması hesaba katılmamıştı
- Durum snapshot sıklığı azaltıldı ve update boyutu küçültüldü
- Saniye başına gönderilen veri miktarını sınırlamak için
tc aracı kullanıldı
İkinci gün: büyüme devam etti
- Girdi doğrulaması düzgün yapılmadığı için site çöktü
- Yükü dağıtmak için Redis replikası eklendi
- Flask process'leri sürekli çökünce otomatik yeniden başlatma script'i yazıldı
Eski update sorunu
- İstemcilerin eski update'leri uygulaması nedeniyle durumun yanlış gösterilmesi sorunu ortaya çıktı
- Update sırasını garanti etmek için timestamp eklendi
Go ile yeniden yazım
- Performans mühendisi bir arkadaşla birlikte backend Go ile yeniden yazıldı
- Performans büyük ölçüde iyileşti
- DDOS saldırıları CloudFlare üzerinden savunuldu
Sitenin kapatılması
- Onay kutuları yeterince hızlı şekilde işaret kaldırılmazsa donacak biçimde değiştirildi
- Donma durumu Redis kullanılarak yönetildi
- Site 2 hafta sonra kapatıldı
Öğrenilenler
- "Gerçek" bir backend'e sahip bir sunucunun açık internete ikinci kez dağıtılması deneyimi oldu
- Kısa vadeli çözümleri seçmek iyi bir karardı
- Redis ve nginx'in gücü bir kez daha doğrulandı
- İnsanların anonim olarak etkileşime girdikleri sitelere duyduğu özlem görüldü
GN⁺ özeti
- Bu yazı, bir web sitesinin beklenmedik popülerliği nedeniyle ortaya çıkan teknik sorunları ve bunların nasıl çözüldüğünü ele alıyor
- Redis ve nginx kullanan basit bir mimarinin bile büyük ölçekli trafiği kaldırabileceğini gösteriyor
- Kısa vadeli çözümlerle sorunların hızla çözülüp sitenin nasıl istikrara kavuşturulduğunu anlatıyor
- Go ile yeniden yazım ve CloudFlare üzerinden DDOS savunması gibi çeşitli teknik zorlukları kapsıyor
- Benzer işlevlere sahip projeler arasında Reddit'in /r/Place gibi büyük ölçekli işbirlikçi projeleri bulunuyor
1 yorum
Hacker News görüşleri
Çok sayıda ders ve tarihsel bilgi çıkarılabiliyordu
Harika bir yazıydı! Site için tebrikler ama asıl gurur duyulması gereken kısım yazının kendisi
Siteyi iki günde kurmuş olmak iyi bir tercihmiş
Yakın tarihli ilgili proje:
Eğlenceli bir proje
Harika bir yazıydı — bunun maliyetinin ne kadar olduğunu merak ediyorum
İnsanların sınırlı anonim etkileşimi özlediğine dair inancım doğrulandı
Backend'e yeni başlayan biri olarak bu proje için daha basit bir alternatif mimari olup olmadığını merak ediyorum
Müthiş!
Oyunun hâlâ canlı olup olmadığını merak ediyorum