Lanısta Wars Ölçeklenebilirlik Altyapısı

Merhaba, Uzun zamandır üzerinde çalıştığımız Lanista Wars adlı oyunda karşılaştığımız bazı altyapısal sorunlardan ve çözümlerinden bahsetmek istiyorum. Lanista Wars devasa çok oyunculu çevrimiçi (MMO) bir oyun olmasından dolayı yaşanacak potansiyel sorunları öngörmemiz oldukça zor oldu. Zira daha önce ekibimizin böyle bir proje deneyimi  olmamıştı.

Öncelikle küçük bir ekip olduğumuz için sunucu-istemci mimarisinin fiziksel boyutlarından kurtulup kontrolü daha kolay bir altyapı olması açısından Amazon Web Hizmetlerini (Amazon Web Services) tercih ettik. Bulut bilişimin (cloud computing) esnekliğinden faydalanmak bize birhayli kolaylık sağladı diyebiliriz. Bulut bilişimi ne mi? İşte size bir örnek:

 

Bu değil tabii ki bulut bilişim 🙂 Amazon'un bize sağladığı altyapı kolayca ölçeklenebilir ve kapasite arttırımına gidilebilir bir imkan sunuyor. Yani herhangi bir kullanıcı yığılması durumunda veya bir darboğaz oluştuğunda mevcut altyapıyı kolayca genişleterek rahatlatabilme imkanınız var. Tabi burada anlattıklarım sadece Amazon'da olan şeyler değil. Başka alternatif bulut bilişim çözümleri de var.

İlk Testler ve Tıkanmalar

Oyunu ilk teste açtığımızda kullandığımız sunucu altyapısı aşağıdaki gibiydi.

lw_amazon1

 

Bu yappıda sunucu kapasitesini genişletmek mümkündü. Fakat her seferinde sunucuyu kapatmak gerektiğinden oyuncular bir süre oyuna giremezlerdi. Herhangi bir sunucu güncellemesi durumunda da benzeri sorunlar oluyordu. Öte yandan yazının başında da bahsettiğim gibi kapasite aşımı konusunda çok net bilgimiz olmadığından ne zaman bir yoğunluk olacağını da kestiremiyorduk.

Dağıtık Yapılar

Yukarıdaki sistem herşeyi barındıran ve sunucuda oluşan her sorunu sistemin tamamına yansıtan bütün bir yapı oluşu nedeniyle bizi pek tatmin etmedi. Bunun üzerine daha esnek bir yapıya yönelip yazılımı da ona göre revize ettik.

lw_amazon2

Buradaki master server mimarisi dediğimiz yapı hemen hemen her online oyunda olan sunucu mimarisidir. Kilit rolü load balancer üstlenir. Kullanıcılardan gelen istekler mevcut web sunucularının yük dağılımına göre load balancer tarafından birine iletilir. Böylece aşırı bir yoğunluk olduğunda tek yapmamız gereken bir tane daha web sunucusu eklemek veya halihazırdaki sunuculardan birinin kapasitesini arttırmak.

Kullanıcılar sadece load balancera bağlanabiliyorlar. Alttaki web sunucularını doğrudan göremiyorlar. O nedenle hangi web sunucusuna bağlanacaklarını da o anda load balancer tarafından karar verildiği için bilinmiyor. O nedenle chat server uygulamasını da web sunucularından çıkarıp bağımsız bir sunucu olarak ayırdık. Böylece hangi web sunucusunda olursa olsun aynı dünyada olan herkes aynı sohbet sunucusuna bağlanıp birbirilerini görebiliyor.

Herşey çok güzel değil mi? Aslında pek değil. Hesaba katmadığınız bir load balancer ve PHP sorunu yaşayabilirsiniz. Şöyle ki:

PHP oturum (session) bilgisini varsayılan olarak dosyada tutuyor. Ayrı web sunucuları ayrı dosyalar demek oluyor bu da. Öte yandan load balancer gelen istekleri sunucuların hangisi en boştaysa ona yönlendiriyor. Bu da bazen oturum açmışsanız sizi başka sunucuya yönlendirip var olan oturumdan düşmenizi sağlıyor. Yani durup dururken giriş sayfasında buluveriyorsunuz kendinizi 🙂

Bu sorunu oturum bilgisini ortak bir alanda alarak çözdük. Tabi PHP nin varsayılan dosyada tutma ayarlarını değiştirmenizi tavsiye ediyoruz. Biz PHP sessionları için Redis Server kullandık. Bunu da ortak bir sunucu olarak diğerlerine tanıttık. Böylece hangi load balancer tarafından hangi web servera yönlenirse yönlensin oyuncular hep aynı yerden oturumlarına ulaştıkları için düşme olmuyor.

lw_amazon3

Evet sanırım kabaca Lanista Wars ve bulut bilişim mimarisi hakkında biraz fikir verebilmişimdir 🙂

Redis nedir? noSQL nedir? Neden kullanılır? Gibi konuları ve sunucu tarafımızda kullanılan node.js gibi teknolojileri sonraki yazılarımda ele almayı düşünüyorum.

Şimdilik hoşçakalın 🙂

- Selcuk

No Comments Yet.

Leave a comment