Herkese Merhabalar,
En kısa ve en öz soru : Hearthstone, CS:GO vb. gibi turn-based ve sunucuya 2-16 kişinin bağlanabildiği, bağlanırken en iyi sunucuyu seçip, birini araması, yüzlerce sunucuda game-server kurulu, load balance sistemi ile çalışan, tek veritabanı ile kontrol edilen bir sistem nasıl yapılır ?
Kısa ve öz soru : C# kullanarak(Kesinlikle ve kesinlikle C# olacak, web server kullanmayacağım.), birden çok sunucu ile her sunucuda "master-game-server" olmak üzere ve bu server'da aralarında "realm" paylaşarak her realm maksimum 2 kişi kaldıracak, MongoDB gibi bir NoSQL server ile veriler paylaşacak, saniyede 10k anlık tcp paketi kaldıracak bir sunucu sistemi yapmak istiyorum ve yolun ortalarında gibiyim, sona ulaşamıyorum. Bilgi yetersizliği, optimizasyon, tek veritabanı sunucusu çökerse çok kötü sorunlar olabilir, aynı anda aynı işi yapan 5 veritabanı sunucusu olabilir vs.
(Örnek: Hearthstone server - 2 kişilik, session aktarımı, turn-based vs.)
1) Böyle bir sistem nasıl yapılır ?
2) Böyle sistemi kolay yoldan sağlayan AWS var sanırım, SUPERCELL sunucuları bunu kullanıyor. Yada bu forumda sağlayan varmı kolay yoldan ?
(Not: Çok fazla teknik bilgim yok, biraz daha türkçeleştirerek anlatırsanız çok memnun olurum. Sorun yazılımsal mı, donanımsal mı en ufak bir fikrim yok. Hearthstone C# ile yazıldığından kaynak kodlarını okuyabiliyorum. Oyun içi haberleşme "google protocol buffers" ile async socket ile bağlantı sağlıyor. Bunu yapmak çok zor değil fakat hangi sunucuya bağlandığı vs. detaylı bilgileri anlayamıyorum. Birçok SSL gibi şifrelemeler kullanılmış. Çok komplex bir sistem yazılmış.)
Derin Mevzu :
Böyle bir konu'm vardı bununla alakalı :
https://www.r10.net/dedicated-server-...-database.html
Bunun devamı olarak buraya tekrar konu açmayı tercih ettim. Siz üstad'lara birkaç soru sormak istiyorum;
Öncelikle ben C# ile TCP (veri kaybı, sırasız gitme vb. olmaması için) tabanlı Asynchronous kullanarak bir server-client yazdım. Mobil-PC arası gayet iyi bir şekilde çalışıyor.
Veritabanı ise tek sunucu olup MongoDB düşünüyorum.
Amacım "Scalability" kullanarak "Horizontal scaling" modunda çalıştırmak istemem.
(Konu karışmaması için soruları anlattığımın altına soracağım, biraz ıvır-zıvır anlatayım önce.)
Soru 1 :
Şimdi, örnek olarak benim 11 adet sunucum olsun. Her 2'si farklı şirket, farklı ülke, farklı alt yapı. 1'i ise DB server.
2 Server - A Ülkesi - AANET
2 Server - B Ülksei - BBNET
2 Server - T Ülkesi - TTNET (Allah Korusun)
...
1 Server - D Ülkesi - DB Server
Tek veritabanı sunucusu sorun çıkarabilir, kapanırsa oyun sunucuları iletişim kuramaz, bilgiler RAM'de durur, bir süre sonra hata verip çökebilir. Bu çok riskli birşey. Büyük şirketler bu sorunu nasıl çözüyor ?
Soru 2 :
Eğer ben game-server için güncelleme yapmak istesem, bütün sunuculara tek-tek girip hepsini ayrı ayrı mı güncelleyeceğim ? Bu çok mantıksız. Adamın 100 sunucusu varsa ? 100 adet ayar.ini dosyası demek. Hepsini tek tek değiştirmek çok uzun sürer, aynı anda olmaz.
Soru 3 :
Client bağlandığı zaman rastgele bir server seçecek. Bu client tarafına yazdığım IP adresleri yardımı ile olacak. Peki oldu ya, şanstır, eşit şekilde paylaşılmadı, %90 A sunucusuna bağlandı. Bu büyük bir sorun demek. Bu sorunu çözmek için sunucular arası bağlantı gerekir. 100 Sunucu olsa, her sunucuya 99 adet diğer sunucuları tutan bir liste yapmak gerek ki, sunucu dolduğuna yakın, kullanıcının "session" dediğimiz durumu diğer sunucuya göndersin. Bu sorun nasıl çözülecek ?
Soru 4 :
Load balancing ve cluster arasında fark tam olarak nedir ?
Soru 5 :
SUPERCELL firması, AWS kullanıyor. Load-Balancing olaylarını otomatik yapıyor sanırım. Fakat sadece bunu biliyorum, arkada derin bir ayar var. Böyle bir sistem yapan kaynak vs. varmı ?
Soru 6 :
Can alıcı nokta, matchmaking sistemi. Evet. A kişisi odayı A sunucusunda kurdu , 30 sn'dir bağlanan birisi yok, biri(leri)ni bekliyor. Peki client B sunucusunda, teknik olarak A kişisinin kurduğuna bağlanması için bulunduğu server'dan A sunucusuna taşınması gerekir ki bu boşuna makineye bağlanma demek. Zaten kesinlikle ve kesinlikle oyuncular karşılıklı oynayabilmesi için aynı sunucuda olması gerekli. Örneğin CS'go da oyuna bağlanırken sol tarafta, kaç server olduğu (gerçek sunucu değil, 16 kişilik oyun sunucusu), kaç oyuncu olduğu vs. herşeyi topluyor, biliyor. Matchmaking sistemini nasıl tasarlayacağım ? Her sunucuda boş bir list oluşturup mu bakacağım ? Bu yapılır fakat tek sunucu üzerinden olur. Onlarca sunucu ile nasıl yapacağım ?
Soru 7 :
Bunları yapanlar biliyorum ki büyük firmalar, büyük üstadlar. Fakat hizmeti sağlayan, kullandıkları servis vb. aynı şirketin ve bizde kullanabiliriz diye düşünüyorum, ya da bu hizmeti yapacak firmalar varmı ?
------------------------------------------
=================================
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Dediğimi çok anlatamadım ve uzun oldu biliyorum, cevaplamaya çalışırsanız çok mutlu olurum. İnternette kaynak çok sınırlı ve istediğim gibi bulamadım da diyebilirim. Tekrardan teşekkür ediyorum, iyi forumlar !
^^^^^^^^^^^^^^^^^^^^^^^^^^^
=================================
------------------------------------------