Soru Tarihi.
Açık dünya çok oyunculu çevrimiçi oyunlar (MMO'lar) ve battle royale oyunları, geleneksel istemci-sunucu mimarisini aşan benzersiz dağılmış sistem zorluklarıyla karşılaşmaktadır. İlk oyun altyapısı, uzaktaki oyuncular için dayanılmaz gecikmelere sebep olan tek bir yetkili sunucuya dayanıyordu ve bu da tek hata noktaları oluşturuyordu. İstemci tarafı tahmini ve sunucu uzlaşma modellerine geçiş, deterministiklik ve hile önleme konusunda karmaşıklık getirdi. Modern bulut tabanlı oyun platformları, şimdi çeşitli cihazlar boyunca milyonlarca eşzamanlı oturumu desteklemek zorundadır, aynı zamanda rekabetçi bütünlük için 50ms'den az gecikmeyi ve sıkı tutarlılığı sürdürmelidir.
Sorun.
Temel mimari gerilim, ölçekte sonlu tutarlılık ile oyun adaleti için kuvvetli tutarlılık arasında bir denge kurmaktır. Oyuncular, ağ gecikmesini örtmek için hemen yerel geri bildirim gerektirir; ancak sunucu, hız hilelerini ve teleportasyon suistimallerini önlemek için çatışmaları yetkili bir şekilde çözmelidir. Coğrafi shard'lama, bölgesel sunucular arasında göç eden bir oyuncunun durum kaybı veya lastiklenme riski oluşturduğu sınır geçişi sorunları yaratır. Ayrıca, dağılmış düğümler arasında deterministik fizik simülasyonu, oyun durumunu bozan senkronize edilmemiş hata paylarını önlemek için senkronize rastgele sayı üretimi ve kayan nokta aritmetiği standartları gerektirir.
Çözüm.
İstemci tahmin doğrulaması için kenar bilişim düğümleri kullanan bir hibrit otorite sistemi uygulayın ve kalıcı durum yönetimi için bölgesel otorite kümeleri oluşturun. Çapraz platform hesaplama tutarlılığını sağlamak için belirleyici kilit adımlı simülasyon çerçevelerini sabit nokta aritmetiği ile dağıtın. Oyuncu oturumlarını shard'lara eşlemek için tutarlı hash ve rendezvous hash algoritmalarını kullanarak topoloji değişiklikleri sırasında yeniden tahsisatı en aza indirin. Bant genişliğini azaltmak için delta sıkıştırma algoritmaları aracılığıyla durum delta sıkıştırması uygulayın ve envanter işlemleri için iki aşamalı onay protokollerini kullanın.
Problem tanımıyla detaylı örnek.
Kapsamlı Striker'lar için arka ucu tasarladığınızı düşünün, Kuzey Amerika, Avrupa ve Asya-Pasifik'te aynı anda başlatılan rekabetçi 5v5 kahraman nişancı. Kapalı beta sırasında, oyuncular ruh hayaletleri bildirdi—bir istemcinin yerel olarak kafa atışını kaydettiği ancak sunucunun bunu reddettiği—topluluk tepkisi yarattı. Telemetri, TCP başı-bloklama’nın yoğun saatlerde gecikme artışını artırdığını ortaya koydu ve mevcut monolitik fizik motoru erişilebilirlik bölgeleri boyunca yatay olarak shard'lanamıyordu. Takım, başlatma haftasında 100,000 eşzamanlı maçı desteklerken 20Hz sunucu yıpranma oranlarını ve 20ms altı girdi doğrulama gecikmesini sürdürmeliydi.
Çözüm A: İstemci İnerpolasyonuyla Merkezi Yetkili Sunucu.
Bu yaklaşım, oyun durumunu bir merkezi bölgede tek bir Redis önbelleğiyle saklar ve istemciler kesitler arasında interpolasyon yapar. Artıları, tutarlılık yönetiminde basitlik ve hile tespitinde kolaylık içerir. Eksileri ise okyanus ötesi oyuncular için kabul edilemez gecikmelerdir (150ms+) ve bölgesel kesintiler sırasında felaket niteliğinde tek bir hata noktası oluşturur.
Çözüm B: Tamamen Dağıtılmış P2P Ağı ile Ev Sahibi Göçü.
WebRTC veri kanallarını kullanarak, bu tasarım bir oyuncuyu yetkili ev sahibi olarak seçer ve durum doğrulaması için blockchain tabanlı uzlaşma sağlar. Artıları, alt yapı maliyetlerinde minimaldir ve veri merkezi arızalarına karşı dayanıklıdır. Eksileri, ev sahibi manipülasyon hilelerine karşı savunmasızlık, oyuncu internet kalitesine bağlı olarak tahmin edilemeyen gecikme ve mobil operatörler arasında NAT geçiş güvenilirliğinin imkansızlığıdır.
Çözüm C: Kenar Doğrulamalı Giriş ile Bölgesel Otorite Shard'lama.
Hareket ilkelerini yerel Lua skriptlerine göre doğrulamak için 200+ kenar konumda Envoy proxy'lerini uygulayan seçilen çözümdür, yalnızca yasal komutları bölgesel Kubernetes kümelerine ileten deterministik Unity veya Unreal Engine özel sunucuları çalıştırır. Artıları, giriş doğrulama için coğrafi yakınlıktır, Yatay Pod Ölçeklendirme sayesinde yatay ölçeklenebilirlik sağlar ve sunucu yetkisi aracılığıyla hileye karşı dirençlidir. Eksileri, bölgeler arasında senkronize Docker görüntülerinin sürdürülmesinde operasyonel karmaşıklıktır ve bölge içindeki oyuncu göçü sırasında potansiyel tutarsızlık durumlarıdır.
Hangi çözüm seçildi ve neden.
Çözüm C, CAP teoremi kısıtlamalarını özellikle oyun için tatmin ettiği için seçildi: mevcutlık ve bölme toleransı için oyun devamlılığını önceliklendirme, geri kalan kritik olmayan kozmetikler için CRDT'ler ile sonlu tutarlılık sağlarken ve envanter yönetimi için dağıtılmış kilitler kullanarak. Mimarinin Kapsamlı Striker'lar oyununu başlatma haftasında rekabetçi bütünlükten ödün vermeden 99.99% kesintisiz çalışma süresi sağlamasını sağladı.
Sonuç.
Uygulama sonrası ölçümler, ruh hayaleti raporlarında %94 azalma ve 95. yüzdelik dilimde kullanıcılar için 15ms altı ortalama girdi gecikmesi sağladı. Shard geçiş protokolü, GCP us-east1 arızası sırasında 50,000 aktif oturumun kesintisiz bir şekilde geçişini başarıyla gerçekleştirdi. Ancak, ekip önemli Terraform bakım yükümlülüğü üstlendi ve Istio hizmet ağı yapılandırmalarını 12 küme üzerinde yönetmek için üç ek Site Reliability Engineer gerekli oldu.
Nasıl farklı CPU mimarileri (x86 ve ARM) arasında yüzen nokta senkronizasyonunu önlersiniz?
Çoğu aday, her yerde double hassasiyeti kullanmayı önerir, bu da ARM NEON ve x86 SSE birimlerinin farklı şekilde yuvarlama yapması durumunda başarısız olur. Doğru yaklaşım, alt-milimetrelik konum verilerini temsil etmek için 64-bit tamsayı kullanarak sabit nokta aritmetiği gerektirir veya SoftFloat gibi deterministik IEEE 754 emülasyon kütüphanelerini kullanmaktır. Ayrıca, fizik motorları, tüm düğümler boyunca aynı şekilde tohumlanarak belirleyici rastgele sayı üreteçleri (DRNG'ler) kullanmalıdır, işletim sistemlerine göre değişken libc uygulamalarından kaçınmalıdır. Senkronizasyonu erken tespit etmek için belirli aralıklarla checksum doğrulaması uygulayın ve durum uzlaşmasını, tamamen durum sıfırlamaları yerine kesit interpolasyonuyla tetikleyin.
Her oyuncunun hareket güncellemesi için basitçe standart veritabanı işlemleri (ACID) kullanamaz mısınız ve bunun yerine hangi desen kullanılır?
Adaylar genellikle her yerleşim güncellemesi için PostgreSQL satır düzeyi kilitlerini önerir, bu da ölçeklendirmede yazma amplifikasyonu ve kilit sıkışması felaketlerine yol açar. Doğru desen, Komut Deseni ile Olay Kaynağı kullanır: istemciler, niyetleri (örneğin, ileri hareket) mutlak durumlar yerine iletir. Bu niyetler, shard başına Apache Kafka parçalarına eklenir ve stateless oyun sunucuları tarafından idempotent bir şekilde işlenir. Yetkili durum, değiştirilmez günlükten türetilir, bu da zaman yolculuğu hata ayıklama ve mükemmel yeniden oynatma yeteneklerini mümkün kılar. Redis'deki materialize görünümler, ana depoda işlem yükü olmadan okumaya yönelik yoğun sorguları yönetir.
Popüler bir shard (örneğin, bir ünlü oyuncunun maçı) aniden 1000 kat trafik artışı aldığında kalabalık sorununu nasıl çözersiniz?
Birçok kişi yük dengeleyicide hız sınırlaması önerir, bu altyapıyı korur ama kullanıcı deneyimini kötüleştirir. Sofistike çözüm, Cloudflare Workers veya AWS Lambda@Edge kullanarak kenarda token bucket algoritmaları uygular ve yalnızca İlgi Alanı (AoI) içindeki oyuncuların durum güncellemelerini almasını sağlayan ilgi yönetimi algoritmaları ekler. Seyirci modları için, shard CPU yükü olmadan yayın kalitesinde iletim için UDP multicast kullanarak Amazon CloudFront veya benzeri CDN kenar akışını kullanın, RTMP veya SRT protokollerini kullanarak. Gecikme mekanizmalarını gRPC akış kontrolü kullanarak uygulayın, böylece ihlal süresi düşürüldüğünde istemcilere simülasyon sadakatini azaltmalarını bildirirsiniz.