16 puan yazan GN⁺ 2024-10-24 | 1 yorum | WhatsApp'ta paylaş
  • Lichess, dünya çapında milyonlarca oyuncusu olan ücretsiz ve açık kaynaklı bir satranç platformudur
  • İstemci ile sunucu arasındaki iletişimi izlemek için Chrome DevTools’un Network sekmesi kullanılır

WebSocket bağlantısı

  • İlk dikkat çeken ağ davranışı, aşağıdakine benzer bir URL’ye yapılan WebSocket bağlantısıdır:
wss://socket2.lichess.org/play/H5uHz0egyvIA/v6?sri=bt6QzcyOiZg5&v=0  
  • wss protokolü, TLS kullanan şifreli bir WebSocket bağlantısını ifade eder
  • WebSocket, tam çift yönlü iletişime izin vererek tekrarlayan HTTP istekleri olmadan istemci ile sunucu arasında gerçek zamanlı güncellemeleri mümkün kılar

Yerel oyuncunun sırası

  • Bir hamle yaptığınızda veri paketleri alışverişi olur:
// 22:51:35.280'de gönderildi  
{  
  "t": "move",   
  "d": {  
    "u": "d2d4",  
    "l": 32,  
    "a": 1  
  }  
}  
  • Sunucudan alınan mesaj:
// 22:51:35.312'de alındı  
{  
  "t": "ack",  
  "d": 1  
}  
  • Bu, sunucunun hamlemizi aldığını bildirir
// 22:51:35.312'de alındı  
{  
  "t": "move",  
  "v": 1,  
  "d": {  
    "uci": "d2d4",  
    "san": "d4",  
    "fen": "rnbqkbnr/pppppppp/8/8/3P4/8/PPP1PPPP/RNBQKBNR",  
    "ply": 1,  
    "clock": {  
      "white": 300,  
      "black": 300  
    }  
  }  
}  
  • Bu mesaj, yaptığımız hamle ve güncellenmiş oyun durumu hakkında ayrıntılı bilgi sağlar

Rakibin sırası

  • Rakip hamle yaptığında sunucudan benzer bir paket alınır:
// 22:51:43.489'da alındı  
{   
  "t": "move",  
  "v": 2,  
  "d": {  
    "uci": "d7d5",  
    "san": "d5",  
    "fen": "rnbqkbnr/ppp1pppp/8/3p4/3P4/8/PPP1PPPP/RNBQKBNR",  
    "ply": 2,  
    "dests": {  
      "c2": "c3c4",  
      "g2": "g3g4"  
      // Ek olası hamleler  
    },  
    "clock": {   
      "white": 300,  
      "black": 300  
    }  
  }  
}   
  • dests parametresi, mevcut konumdaki tüm kullanılabilir hamleleri listeler

Lichess mimarisi

  • Lichess’in gerçek zamanlı oyun sistemi esas olarak iki ana servisten oluşur (ikisi de Scala ile yazılmıştır):
    1. lila: oyun mantığı, durum, kullanıcı etkileşimleri vb. temel işlevleri yöneten çekirdek servis
    2. lila-ws: istemci ile lila arasında köprü görevi gören, WebSocket işlemede uzmanlaşmış servis

Mimariye genel bakış

lila <-> redis <-> lila-ws <-> websocket <-> client  
  • lila, Redis üzerinden lila-ws ile iletişim kurar; lila-ws ise istemcilerle olan WebSocket bağlantılarını yönetir

Redis Pub/Sub ile iletişim

  • Hamle olayları Redis Pub/Sub kanalında yayımlanır ve lila bu kanala abone olarak hamleleri işler
  • Redis Pub/Sub, at-most-once teslimat sunar. Mesaj kaybı mümkün olsa da bellek kullanımı azalır

MongoDB ile nihai veri kalıcılığı

  • lila, oyun durumunu MongoDB’de saklar ancak her tekil hamleyi anında kaydetmez
  • Bunun yerine hamleleri tamponlayıp periyodik olarak kaydederek veritabanı yükünü azaltır
  • Önemli bir olay meydana geldiğinde oyun durumu flush edilir

Devam eden bir oyuna katılma

  • Oyuncu bağlandığında v parametresini sağlayarak sistemin bildiği en güncel oyun sürümünü belirtir
  • lila-ws, devam eden oyunlardaki tüm olayları izlemek ve yönetmek için ConcurrentHashMap kullanır

Sonuç

Lichess’teki hamle süreci kısaca şöyledir:

  1. İstemci, lila-ws ile bir WebSocket bağlantısı kurar
  2. Oyuncu hamle yaptığında istemci, lila-ws’ye bir hamle olayı gönderir
  3. lila-ws, hamlenin alındığını doğrulayan bir ack yanıtı verir
  4. Hamle olayı Redis Pub/Sub kanalında yayımlanır ve lila tarafından işlenir
  5. lila, hamleyi alır, oyun durumunu günceller ve sonunda MongoDB’ye kaydeder. Güncellenmiş oyun durumu ardından lila-ws üzerinden tekrar istemciye gönderilir
  6. İstemci, yeni hamleyi ve oyun durumu değişikliklerini yansıtan güncellenmiş oyun durumunu alır

GN⁺ görüşü

  • Bu yazı, popüler açık kaynaklı satranç platformu lichess.org’da gerçek zamanlı oyunu mümkün kılan arka uç mimarisine ve sürece ayrıntılı bir bakış sunuyor
  • Gerçek zamanlı web uygulamaları geliştirirken dikkate alınması gereken başlıca teknik unsurları tanıtıyor; örneğin WebSocket ile gerçek zamanlı iletişim, Redis Pub/Sub ile ölçeklenebilir mesaj iletimi ve MongoDB ile nihai veri saklama
  • Lichess’in mimarisi gerçek zamanlı çok oyunculu oyunlar için çok uygun olsa da sohbet, işbirliği araçları ve sosyal medya akışları gibi diğer tür gerçek zamanlı web uygulamalarına da benzer desenler ve teknolojiler uygulanabilir
  • Gerçek zamanlı özellikler kullanıcı deneyimini ve etkileşimi geliştirebilir, ancak ölçeklenebilirlik, güvenilirlik ve veri tutarlılığı gibi kendine özgü teknik zorluklar da doğurur. Bu yazı, bu zorlukları çözmek için stratejiler sunuyor
  • Benzer teknoloji yığınını kullanan açık kaynak projeler arasında Socket.IO (Node.js tabanlı gerçek zamanlı uygulama çerçevesi) ve RethinkDB (gerçek zamanlı web uygulamaları için optimize edilmiş NoSQL veritabanı) bulunuyor
  • Bu yazıdaki analiz, Lichess’in kaynak kodunun doğrudan incelenmesine dayanmıyor; bu nedenle gerçek uygulamada farklılıklar olabilir. Ancak açıklanan temel kavramlar ve mimari desenler yine de geçerliliğini koruyor
  • Gerçek zamanlı sistemler tasarlanırken at-most-once (mesaj kaybı olasılığı) ile at-least-once (mesaj tekrarı olasılığı) teslimat arasında hangisinin daha uygun olduğunu dikkatle değerlendirmek gerekir. Bu, uygulamanın gereksinimlerine ve ödünleşimlerine bağlıdır

1 yorum

 
GN⁺ 2024-10-24
Hacker News görüşü
  • Chess.com’un zaman yapısıyla ilgili şikayetler var. Sunucu zamanı takip ediyor gibi görünüyor; bu da iletim süresini ve gecikmeyi yok sayıyor olabilir. Özellikle mobil istemcide süreli oyun oynarken rahatsız edici

    • Sorun ağ kodunda olabilir ve bulmacalarda sık sık hatalar ortaya çıkıyor
    • Chess.com’un teknolojisi biraz pürüzlü hissettiriyor
  • Lichess, StackOverflow yaklaşımını seçmiş ve güçlü sunucular kullanıyor

    • Oyun durumunu periyodik olarak kaydediyor, ancak nereye kaydettiği net değil
    • Oyun başına maliyet çok düşük: $0.00027, 3.671 oyun başına 1 dolar
    • Tek bir veri merkezine bağımlılık nedeniyle bir keresinde 10 saatlik kesinti yaşanmış
  • Hamlelerin sunucu tarafında hesaplanması tutarlılığı garanti eder ve işlem gücü ya da enerjisi sınırlı istemcilerde performansı optimize eder

    • Yeni platformlarda açık kaynak istemci yazılımını hayata geçirme eşiğini düşürmek için yapılmış olabilir
    • Satranç kurallarını uygulamak zahmetli olabilir ve Lichess’in de bir dönem mantık hataları olmuştu
  • Redis pub/sub kanalında mesaj kaybının nasıl ele alındığı yeterince açıklanmamış

  • "l" parametresi, sunucunun gözlemlediği gecikmeyi gösteriyor olabilir

  • Sunucunun tüm geçerli sonraki hamleleri listeleyip göndermesi şaşırtıcı

    • Kısıtlı istemciler için avantajlı olabilir, ancak bunun istemci tarafında hesaplamaktan daha ucuz olup olmadığı belirsiz
  • WebSocket sunucusunun nasıl korunduğuna dair sorular var

    • Cloudflare’in ücretsiz planı kullanıldığında gecikme oluşuyor
    • Ücretsiz çözümler hakkında merak var
  • Protokolün neden ack gerektirdiği merak ediliyor

    • TLS ile sarılmış WebSocket, mesaj bütünlüğünü garanti edebilir
  • FEN yalnızca tahta durumunu kodlar, oyun durumunu içermez

    • Scala ile yazılmış scalachess projesi başarıyla bakımı yapılan bir proje olmaya devam ediyor