9 puan yazan GN⁺ 2025-04-30 | 3 yorum | WhatsApp'ta paylaş
  • Herkesin aynı anda oynayabildiği bir milyon satranç tahtası sunan deneysel web sitesi One Million Chessboards
  • Bir kişi bir taşı hareket ettirdiğinde bu hareket tüm kullanıcılara gerçek zamanlı olarak yansıyor ve sıra sistemi olmadan tahtalar arasında serbestçe geçiş yapılabiliyor
  • Tüm satranç tahtası durumları, 64 milyon uint64'ten oluşan iki boyutlu bir bellek dizisinde saklanıyor ve sunucu yalnızca bir tane
  • Go diliyle yazılmış ilk proje ve senkronizasyon WebSocket tabanlı zstd ile sıkıştırılmış Protobuf mesajları ile sağlanıyor
  • İyimser uygulama + geri alma yaklaşımındaki istemci mantığını gerçekleştirmek bile bir hafta sürecek kadar teknik açıdan zorlayıcı bir projeydi

One Million Chessboards

  • One Million Chessboards, bir milyon satranç tahtası sunuyor ve herkes aynı anda taşları hareket ettirebiliyor
  • Sıra tabanlı değil; bir kişi bir taşı hareket ettirdiğinde bu hareket tüm kullanıcılara anında yansıyor
  • Tahtalar arasında geçiş de serbest ve benzeri olmayan bir deneyim sunuyor

Arka plan

  • Daha önce yapılan One Million Checkboxes projesinin ardından gelen deneysel bir çalışma olarak, daha büyük ölçek ve daha zor meydan okumalar hedeflendi
  • Geliştirici bu projeye çok zaman harcadığını ve insanların bunu keyifle deneyimlemesini umduğunu söylüyor

Teknik uygulama şekli

  • Bu proje, son dönemde yapılan işler arasında teknik açıdan en zorlu olanlardan biriydi
  • Başlıca teknik özet:
    • Ölçeklenebilirlik gözetilerek tasarlandı
    • Tek bir sunucuda çalışıyor
    • Tüm satranç tahtaları bellekte iki boyutlu bir uint64 dizisi olarak tutuluyor (toplam 64 milyon hücre)
    • Go diliyle yazılmış bir backend; geliştiricinin ilk Go projesi
    • Tek writer thread + çok sayıda reader thread, erişim mutex ile kontrol ediliyor
    • İstemci iyimser güncellemeleri uygular, sunucudan çakışan güncellemeler gelirse geri alma yapılır
    • zstd ile sıkıştırılmış protobuf mesajları WebSocket üzerinden istemcilere gönderiliyor
    • İstemci tarafı 50x50 bölgelere ayrılıyor ve yalnızca komşu bölgelerdeki hareketleri alıyor
    • Genel veriler (istatistikler, mini harita vb.) HTTP GET ile polling yapılarak alınıyor ve Cloudflare önbelleği kullanılıyor

İstemci çalışma mantığının özü

  • İyimser uygulama + geri alma yaklaşımı (optimistic update with rollback) yaklaşık 1.600 satır koddan oluşuyor ve geliştirilmesi için 7 gün boyunca tam zamanlı çalışıldı

    “Son zamanlarda uğraştığım en zor problemdi.”

Yayınlandıktan sonraki tepki

  • Yayına alındıktan sonraki 8 saat içinde 1,3 milyondan fazla taş hareketi kaydedildi, eşzamanlı kullanıcı sayısı yaklaşık 400 oldu
  • Sunucu yükü ihmal edilecek kadar düşük

Güncel istatistikler

  • Çevrimiçi oyuncu sayısı: 199,276
  • Toplam hareket: 5,238,978
  • Toplam taş sayısı: 1,490,061,914
  • Şah sayısı: 9,035,389

3 yorum

 
roxie 2025-05-03

Biraz daha küçük yapsalardı nasıl olurdu acaba... Biriyle karşılaşma olasılığı fazla düşük, haha, hüzünlü.

 
ifmkl 2025-04-30

Test ettim; şu anda masanın dışına çıkıp siyah açısından alttaki satranç tahtasına geçilebilmesi ilginç görünüyor.

 
GN⁺ 2025-04-30
Hacker News görüşleri
  • Merhaba! Bunu ben yaptım. Blog açıklaması yeterince iyi olmadığı için üzgünüm. Mimariyle ilgili sorularınız varsa memnuniyetle yanıtlarım. Bu projeyi tek bir süreçle binlerce eşzamanlı istemciyi kaldırabilecek hale getirmeye odaklandım. golang bu iş için çok uygundu

  • Bu oyun ilginç hale geldi. Örneğin, insanlar dış kenarları iki kare derinliğinde doldurulmuş tek bir tahtanın yenilmez olduğunu keşfetti. Ortaya çıkan oynanışı görmek güzel. Bu, eieio'nun projesinin dehası. Yüzeyde basit görünüyor ama büyük ölçekte ilginç olasılıkları ortaya çıkarıyor

  • Biri şahı yaklaşık 40 kaleyle çevreledi. Ben de atla içeri girdim, o da hemen şah ile beni aldı ve başka bir kaleyle boşluğu kapattı. Eğlenceliydi

  • Tahtalar arasında hareket edilebiliyor ama taş alma yapılamıyor. Garip olan, hareketin yansıtılmıyor olması değil. Örneğin vezirin mavi çizgisi tahta sınırını aşarak tam olarak işaret ediyor ama diğer tahtadaki tüm taşlarda duruyor. Ölçek denemesi olarak iyi iş çıkarmışsın

  • Bir hata aldım. Uncaught TypeError: null'in özellikleri okunamıyor

  • Her tahtanın bir "sırası" olacağını sanmıştım. Rastgele bir tahta seçip siyah veziri serbest bırakarak, rakip hiçbir şey yapamazken tüm beyaz taşları temizleyebildiğimi fark etmemiştim

  • Diğer renkle oynayan bir hileci var. Dün gördüğümü sanmıştım ama bugün kesin gördüm. Sanki intikam için kullanılmış gibi. Siyah kale yok edilir edilmez en yakın beyaz kalenin taşları olabilecek en kötü konumlara hareket etti

  • Bunun bir bot savaşına dönüşeceğini tahmin ediyorum. Örneğin, piyonları ileri süren bir kod parçası var

  • İnsanları kovalamak çok eğlenceli. Satranç olmasa bile keyifli

  • Android telefonda Firefox ile iyi çalışıyor. Eline sağlık