Bir Milyon Satranç Tahtası - Herkesin Birlikte Satranç Oynadığı Bir Web Deneyi
(onemillionchessboards.com)- 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
uint64dizisi 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
Biraz daha küçük yapsalardı nasıl olurdu acaba... Biriyle karşılaşma olasılığı fazla düşük, haha, hüzünlü.
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.
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.
golangbu iş için çok uygunduBu 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